Skip to content

Commit 4e121fc

Browse files
author
Trond Myklebust
committed
Merge tag 'nfs-rdma-for-5.5-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
NFSoRDMA Client Updates for Linux 5.5 New Features: - New tracepoints for congestion control and Local Invalidate WRs Bugfixes and Cleanups: - Eliminate log noise in call_reserveresult - Fix unstable connections after a reconnect - Clean up some code duplication - Close race between waking a sender and posting a receive - Fix MR list corruption, and clean up MR usage - Remove unused rpcrdma_sendctx fields - Try to avoid DMA mapping pages if it is too costly - Wake pending tasks if connection fails - Replace some dprintk()s with tracepoints
2 parents f751c54 + a52c23b commit 4e121fc

File tree

10 files changed

+646
-394
lines changed

10 files changed

+646
-394
lines changed

include/trace/events/rpcrdma.h

Lines changed: 132 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,44 @@ DECLARE_EVENT_CLASS(xprtrdma_rxprt,
8585
), \
8686
TP_ARGS(r_xprt))
8787

88+
DECLARE_EVENT_CLASS(xprtrdma_connect_class,
89+
TP_PROTO(
90+
const struct rpcrdma_xprt *r_xprt,
91+
int rc
92+
),
93+
94+
TP_ARGS(r_xprt, rc),
95+
96+
TP_STRUCT__entry(
97+
__field(const void *, r_xprt)
98+
__field(int, rc)
99+
__field(int, connect_status)
100+
__string(addr, rpcrdma_addrstr(r_xprt))
101+
__string(port, rpcrdma_portstr(r_xprt))
102+
),
103+
104+
TP_fast_assign(
105+
__entry->r_xprt = r_xprt;
106+
__entry->rc = rc;
107+
__entry->connect_status = r_xprt->rx_ep.rep_connected;
108+
__assign_str(addr, rpcrdma_addrstr(r_xprt));
109+
__assign_str(port, rpcrdma_portstr(r_xprt));
110+
),
111+
112+
TP_printk("peer=[%s]:%s r_xprt=%p: rc=%d connect status=%d",
113+
__get_str(addr), __get_str(port), __entry->r_xprt,
114+
__entry->rc, __entry->connect_status
115+
)
116+
);
117+
118+
#define DEFINE_CONN_EVENT(name) \
119+
DEFINE_EVENT(xprtrdma_connect_class, xprtrdma_##name, \
120+
TP_PROTO( \
121+
const struct rpcrdma_xprt *r_xprt, \
122+
int rc \
123+
), \
124+
TP_ARGS(r_xprt, rc))
125+
88126
DECLARE_EVENT_CLASS(xprtrdma_rdch_event,
89127
TP_PROTO(
90128
const struct rpc_task *task,
@@ -333,47 +371,81 @@ TRACE_EVENT(xprtrdma_cm_event,
333371
)
334372
);
335373

336-
TRACE_EVENT(xprtrdma_disconnect,
374+
TRACE_EVENT(xprtrdma_inline_thresh,
337375
TP_PROTO(
338-
const struct rpcrdma_xprt *r_xprt,
339-
int status
376+
const struct rpcrdma_xprt *r_xprt
340377
),
341378

342-
TP_ARGS(r_xprt, status),
379+
TP_ARGS(r_xprt),
343380

344381
TP_STRUCT__entry(
345382
__field(const void *, r_xprt)
346-
__field(int, status)
347-
__field(int, connected)
383+
__field(unsigned int, inline_send)
384+
__field(unsigned int, inline_recv)
385+
__field(unsigned int, max_send)
386+
__field(unsigned int, max_recv)
348387
__string(addr, rpcrdma_addrstr(r_xprt))
349388
__string(port, rpcrdma_portstr(r_xprt))
350389
),
351390

352391
TP_fast_assign(
392+
const struct rpcrdma_ep *ep = &r_xprt->rx_ep;
393+
353394
__entry->r_xprt = r_xprt;
354-
__entry->status = status;
355-
__entry->connected = r_xprt->rx_ep.rep_connected;
395+
__entry->inline_send = ep->rep_inline_send;
396+
__entry->inline_recv = ep->rep_inline_recv;
397+
__entry->max_send = ep->rep_max_inline_send;
398+
__entry->max_recv = ep->rep_max_inline_recv;
356399
__assign_str(addr, rpcrdma_addrstr(r_xprt));
357400
__assign_str(port, rpcrdma_portstr(r_xprt));
358401
),
359402

360-
TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected",
361-
__get_str(addr), __get_str(port),
362-
__entry->r_xprt, __entry->status,
363-
__entry->connected == 1 ? "still " : "dis"
403+
TP_printk("peer=[%s]:%s r_xprt=%p neg send/recv=%u/%u, calc send/recv=%u/%u",
404+
__get_str(addr), __get_str(port), __entry->r_xprt,
405+
__entry->inline_send, __entry->inline_recv,
406+
__entry->max_send, __entry->max_recv
364407
)
365408
);
366409

367-
DEFINE_RXPRT_EVENT(xprtrdma_conn_start);
368-
DEFINE_RXPRT_EVENT(xprtrdma_conn_tout);
410+
DEFINE_CONN_EVENT(connect);
411+
DEFINE_CONN_EVENT(disconnect);
412+
369413
DEFINE_RXPRT_EVENT(xprtrdma_create);
370414
DEFINE_RXPRT_EVENT(xprtrdma_op_destroy);
371415
DEFINE_RXPRT_EVENT(xprtrdma_remove);
372416
DEFINE_RXPRT_EVENT(xprtrdma_reinsert);
373-
DEFINE_RXPRT_EVENT(xprtrdma_reconnect);
374417
DEFINE_RXPRT_EVENT(xprtrdma_op_inject_dsc);
375418
DEFINE_RXPRT_EVENT(xprtrdma_op_close);
376-
DEFINE_RXPRT_EVENT(xprtrdma_op_connect);
419+
DEFINE_RXPRT_EVENT(xprtrdma_op_setport);
420+
421+
TRACE_EVENT(xprtrdma_op_connect,
422+
TP_PROTO(
423+
const struct rpcrdma_xprt *r_xprt,
424+
unsigned long delay
425+
),
426+
427+
TP_ARGS(r_xprt, delay),
428+
429+
TP_STRUCT__entry(
430+
__field(const void *, r_xprt)
431+
__field(unsigned long, delay)
432+
__string(addr, rpcrdma_addrstr(r_xprt))
433+
__string(port, rpcrdma_portstr(r_xprt))
434+
),
435+
436+
TP_fast_assign(
437+
__entry->r_xprt = r_xprt;
438+
__entry->delay = delay;
439+
__assign_str(addr, rpcrdma_addrstr(r_xprt));
440+
__assign_str(port, rpcrdma_portstr(r_xprt));
441+
),
442+
443+
TP_printk("peer=[%s]:%s r_xprt=%p delay=%lu",
444+
__get_str(addr), __get_str(port), __entry->r_xprt,
445+
__entry->delay
446+
)
447+
);
448+
377449

378450
TRACE_EVENT(xprtrdma_op_set_cto,
379451
TP_PROTO(
@@ -532,6 +604,8 @@ DEFINE_WRCH_EVENT(write);
532604
DEFINE_WRCH_EVENT(reply);
533605

534606
TRACE_DEFINE_ENUM(rpcrdma_noch);
607+
TRACE_DEFINE_ENUM(rpcrdma_noch_pullup);
608+
TRACE_DEFINE_ENUM(rpcrdma_noch_mapped);
535609
TRACE_DEFINE_ENUM(rpcrdma_readch);
536610
TRACE_DEFINE_ENUM(rpcrdma_areadch);
537611
TRACE_DEFINE_ENUM(rpcrdma_writech);
@@ -540,6 +614,8 @@ TRACE_DEFINE_ENUM(rpcrdma_replych);
540614
#define xprtrdma_show_chunktype(x) \
541615
__print_symbolic(x, \
542616
{ rpcrdma_noch, "inline" }, \
617+
{ rpcrdma_noch_pullup, "pullup" }, \
618+
{ rpcrdma_noch_mapped, "mapped" }, \
543619
{ rpcrdma_readch, "read list" }, \
544620
{ rpcrdma_areadch, "*read list" }, \
545621
{ rpcrdma_writech, "write list" }, \
@@ -667,9 +743,8 @@ TRACE_EVENT(xprtrdma_post_send,
667743
__entry->client_id = rqst->rq_task->tk_client ?
668744
rqst->rq_task->tk_client->cl_clid : -1;
669745
__entry->req = req;
670-
__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
671-
__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
672-
IB_SEND_SIGNALED;
746+
__entry->num_sge = req->rl_wr.num_sge;
747+
__entry->signaled = req->rl_wr.send_flags & IB_SEND_SIGNALED;
673748
__entry->status = status;
674749
),
675750

@@ -735,6 +810,31 @@ TRACE_EVENT(xprtrdma_post_recvs,
735810
)
736811
);
737812

813+
TRACE_EVENT(xprtrdma_post_linv,
814+
TP_PROTO(
815+
const struct rpcrdma_req *req,
816+
int status
817+
),
818+
819+
TP_ARGS(req, status),
820+
821+
TP_STRUCT__entry(
822+
__field(const void *, req)
823+
__field(int, status)
824+
__field(u32, xid)
825+
),
826+
827+
TP_fast_assign(
828+
__entry->req = req;
829+
__entry->status = status;
830+
__entry->xid = be32_to_cpu(req->rl_slot.rq_xid);
831+
),
832+
833+
TP_printk("req=%p xid=0x%08x status=%d",
834+
__entry->req, __entry->xid, __entry->status
835+
)
836+
);
837+
738838
/**
739839
** Completion events
740840
**/
@@ -1021,66 +1121,32 @@ DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
10211121
TRACE_EVENT(xprtrdma_fixup,
10221122
TP_PROTO(
10231123
const struct rpc_rqst *rqst,
1024-
int len,
1025-
int hdrlen
1124+
unsigned long fixup
10261125
),
10271126

1028-
TP_ARGS(rqst, len, hdrlen),
1127+
TP_ARGS(rqst, fixup),
10291128

10301129
TP_STRUCT__entry(
10311130
__field(unsigned int, task_id)
10321131
__field(unsigned int, client_id)
1033-
__field(const void *, base)
1034-
__field(int, len)
1035-
__field(int, hdrlen)
1036-
),
1037-
1038-
TP_fast_assign(
1039-
__entry->task_id = rqst->rq_task->tk_pid;
1040-
__entry->client_id = rqst->rq_task->tk_client->cl_clid;
1041-
__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
1042-
__entry->len = len;
1043-
__entry->hdrlen = hdrlen;
1044-
),
1045-
1046-
TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
1047-
__entry->task_id, __entry->client_id,
1048-
__entry->base, __entry->len, __entry->hdrlen
1049-
)
1050-
);
1051-
1052-
TRACE_EVENT(xprtrdma_fixup_pg,
1053-
TP_PROTO(
1054-
const struct rpc_rqst *rqst,
1055-
int pageno,
1056-
const void *pos,
1057-
int len,
1058-
int curlen
1059-
),
1060-
1061-
TP_ARGS(rqst, pageno, pos, len, curlen),
1062-
1063-
TP_STRUCT__entry(
1064-
__field(unsigned int, task_id)
1065-
__field(unsigned int, client_id)
1066-
__field(const void *, pos)
1067-
__field(int, pageno)
1068-
__field(int, len)
1069-
__field(int, curlen)
1132+
__field(unsigned long, fixup)
1133+
__field(size_t, headlen)
1134+
__field(unsigned int, pagelen)
1135+
__field(size_t, taillen)
10701136
),
10711137

10721138
TP_fast_assign(
10731139
__entry->task_id = rqst->rq_task->tk_pid;
10741140
__entry->client_id = rqst->rq_task->tk_client->cl_clid;
1075-
__entry->pos = pos;
1076-
__entry->pageno = pageno;
1077-
__entry->len = len;
1078-
__entry->curlen = curlen;
1141+
__entry->fixup = fixup;
1142+
__entry->headlen = rqst->rq_rcv_buf.head[0].iov_len;
1143+
__entry->pagelen = rqst->rq_rcv_buf.page_len;
1144+
__entry->taillen = rqst->rq_rcv_buf.tail[0].iov_len;
10791145
),
10801146

1081-
TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
1082-
__entry->task_id, __entry->client_id,
1083-
__entry->pageno, __entry->pos, __entry->len, __entry->curlen
1147+
TP_printk("task:%u@%u fixup=%lu xdr=%zu/%u/%zu",
1148+
__entry->task_id, __entry->client_id, __entry->fixup,
1149+
__entry->headlen, __entry->pagelen, __entry->taillen
10841150
)
10851151
);
10861152

include/trace/events/sunrpc.h

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,99 @@ TRACE_EVENT(xprt_ping,
777777
__get_str(addr), __get_str(port), __entry->status)
778778
);
779779

780+
DECLARE_EVENT_CLASS(xprt_writelock_event,
781+
TP_PROTO(
782+
const struct rpc_xprt *xprt, const struct rpc_task *task
783+
),
784+
785+
TP_ARGS(xprt, task),
786+
787+
TP_STRUCT__entry(
788+
__field(unsigned int, task_id)
789+
__field(unsigned int, client_id)
790+
__field(unsigned int, snd_task_id)
791+
),
792+
793+
TP_fast_assign(
794+
if (task) {
795+
__entry->task_id = task->tk_pid;
796+
__entry->client_id = task->tk_client ?
797+
task->tk_client->cl_clid : -1;
798+
} else {
799+
__entry->task_id = -1;
800+
__entry->client_id = -1;
801+
}
802+
__entry->snd_task_id = xprt->snd_task ?
803+
xprt->snd_task->tk_pid : -1;
804+
),
805+
806+
TP_printk("task:%u@%u snd_task:%u",
807+
__entry->task_id, __entry->client_id,
808+
__entry->snd_task_id)
809+
);
810+
811+
#define DEFINE_WRITELOCK_EVENT(name) \
812+
DEFINE_EVENT(xprt_writelock_event, xprt_##name, \
813+
TP_PROTO( \
814+
const struct rpc_xprt *xprt, \
815+
const struct rpc_task *task \
816+
), \
817+
TP_ARGS(xprt, task))
818+
819+
DEFINE_WRITELOCK_EVENT(reserve_xprt);
820+
DEFINE_WRITELOCK_EVENT(release_xprt);
821+
822+
DECLARE_EVENT_CLASS(xprt_cong_event,
823+
TP_PROTO(
824+
const struct rpc_xprt *xprt, const struct rpc_task *task
825+
),
826+
827+
TP_ARGS(xprt, task),
828+
829+
TP_STRUCT__entry(
830+
__field(unsigned int, task_id)
831+
__field(unsigned int, client_id)
832+
__field(unsigned int, snd_task_id)
833+
__field(unsigned long, cong)
834+
__field(unsigned long, cwnd)
835+
__field(bool, wait)
836+
),
837+
838+
TP_fast_assign(
839+
if (task) {
840+
__entry->task_id = task->tk_pid;
841+
__entry->client_id = task->tk_client ?
842+
task->tk_client->cl_clid : -1;
843+
} else {
844+
__entry->task_id = -1;
845+
__entry->client_id = -1;
846+
}
847+
__entry->snd_task_id = xprt->snd_task ?
848+
xprt->snd_task->tk_pid : -1;
849+
__entry->cong = xprt->cong;
850+
__entry->cwnd = xprt->cwnd;
851+
__entry->wait = test_bit(XPRT_CWND_WAIT, &xprt->state);
852+
),
853+
854+
TP_printk("task:%u@%u snd_task:%u cong=%lu cwnd=%lu%s",
855+
__entry->task_id, __entry->client_id,
856+
__entry->snd_task_id, __entry->cong, __entry->cwnd,
857+
__entry->wait ? " (wait)" : "")
858+
);
859+
860+
#define DEFINE_CONG_EVENT(name) \
861+
DEFINE_EVENT(xprt_cong_event, xprt_##name, \
862+
TP_PROTO( \
863+
const struct rpc_xprt *xprt, \
864+
const struct rpc_task *task \
865+
), \
866+
TP_ARGS(xprt, task))
867+
868+
DEFINE_CONG_EVENT(reserve_cong);
869+
DEFINE_CONG_EVENT(release_cong);
870+
DEFINE_CONG_EVENT(get_cong);
871+
DEFINE_CONG_EVENT(put_cong);
872+
780873
TRACE_EVENT(xs_stream_read_data,
781874
TP_PROTO(struct rpc_xprt *xprt, ssize_t err, size_t total),
782875

0 commit comments

Comments
 (0)