Skip to content

Commit 745b734

Browse files
chuckleveramschuma-ntap
authored andcommitted
xprtrdma: Extract sockaddr from struct rdma_cm_id
rpcrdma_cm_event_handler() is always passed an @id pointer that is valid. However, in a subsequent patch, we won't be able to extract an r_xprt in every case. So instead of using the r_xprt's presentation address strings, extract them from struct rdma_cm_id. Signed-off-by: Chuck Lever <[email protected]> Signed-off-by: Anna Schumaker <[email protected]>
1 parent 93aa8e0 commit 745b734

File tree

2 files changed

+67
-46
lines changed

2 files changed

+67
-46
lines changed

include/trace/events/rpcrdma.h

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -375,47 +375,74 @@ TRACE_EVENT(xprtrdma_cm_event,
375375

376376
TRACE_EVENT(xprtrdma_inline_thresh,
377377
TP_PROTO(
378-
const struct rpcrdma_xprt *r_xprt
378+
const struct rpcrdma_ep *ep
379379
),
380380

381-
TP_ARGS(r_xprt),
381+
TP_ARGS(ep),
382382

383383
TP_STRUCT__entry(
384-
__field(const void *, r_xprt)
385384
__field(unsigned int, inline_send)
386385
__field(unsigned int, inline_recv)
387386
__field(unsigned int, max_send)
388387
__field(unsigned int, max_recv)
389-
__string(addr, rpcrdma_addrstr(r_xprt))
390-
__string(port, rpcrdma_portstr(r_xprt))
388+
__array(unsigned char, srcaddr, sizeof(struct sockaddr_in6))
389+
__array(unsigned char, dstaddr, sizeof(struct sockaddr_in6))
391390
),
392391

393392
TP_fast_assign(
394-
const struct rpcrdma_ep *ep = &r_xprt->rx_ep;
393+
const struct rdma_cm_id *id = ep->re_id;
395394

396-
__entry->r_xprt = r_xprt;
397395
__entry->inline_send = ep->re_inline_send;
398396
__entry->inline_recv = ep->re_inline_recv;
399397
__entry->max_send = ep->re_max_inline_send;
400398
__entry->max_recv = ep->re_max_inline_recv;
401-
__assign_str(addr, rpcrdma_addrstr(r_xprt));
402-
__assign_str(port, rpcrdma_portstr(r_xprt));
399+
memcpy(__entry->srcaddr, &id->route.addr.src_addr,
400+
sizeof(struct sockaddr_in6));
401+
memcpy(__entry->dstaddr, &id->route.addr.dst_addr,
402+
sizeof(struct sockaddr_in6));
403403
),
404404

405-
TP_printk("peer=[%s]:%s r_xprt=%p neg send/recv=%u/%u, calc send/recv=%u/%u",
406-
__get_str(addr), __get_str(port), __entry->r_xprt,
405+
TP_printk("%pISpc -> %pISpc neg send/recv=%u/%u, calc send/recv=%u/%u",
406+
__entry->srcaddr, __entry->dstaddr,
407407
__entry->inline_send, __entry->inline_recv,
408408
__entry->max_send, __entry->max_recv
409409
)
410410
);
411411

412+
TRACE_EVENT(xprtrdma_remove,
413+
TP_PROTO(
414+
const struct rpcrdma_ep *ep
415+
),
416+
417+
TP_ARGS(ep),
418+
419+
TP_STRUCT__entry(
420+
__array(unsigned char, srcaddr, sizeof(struct sockaddr_in6))
421+
__array(unsigned char, dstaddr, sizeof(struct sockaddr_in6))
422+
__string(name, ep->re_id->device->name)
423+
),
424+
425+
TP_fast_assign(
426+
const struct rdma_cm_id *id = ep->re_id;
427+
428+
memcpy(__entry->srcaddr, &id->route.addr.src_addr,
429+
sizeof(struct sockaddr_in6));
430+
memcpy(__entry->dstaddr, &id->route.addr.dst_addr,
431+
sizeof(struct sockaddr_in6));
432+
__assign_str(name, id->device->name);
433+
),
434+
435+
TP_printk("%pISpc -> %pISpc device=%s",
436+
__entry->srcaddr, __entry->dstaddr, __get_str(name)
437+
)
438+
);
439+
412440
DEFINE_CONN_EVENT(connect);
413441
DEFINE_CONN_EVENT(disconnect);
414442
DEFINE_CONN_EVENT(flush_dct);
415443

416444
DEFINE_RXPRT_EVENT(xprtrdma_create);
417445
DEFINE_RXPRT_EVENT(xprtrdma_op_destroy);
418-
DEFINE_RXPRT_EVENT(xprtrdma_remove);
419446
DEFINE_RXPRT_EVENT(xprtrdma_op_inject_dsc);
420447
DEFINE_RXPRT_EVENT(xprtrdma_op_close);
421448
DEFINE_RXPRT_EVENT(xprtrdma_op_setport);
@@ -482,32 +509,33 @@ TRACE_EVENT(xprtrdma_op_set_cto,
482509

483510
TRACE_EVENT(xprtrdma_qp_event,
484511
TP_PROTO(
485-
const struct rpcrdma_xprt *r_xprt,
512+
const struct rpcrdma_ep *ep,
486513
const struct ib_event *event
487514
),
488515

489-
TP_ARGS(r_xprt, event),
516+
TP_ARGS(ep, event),
490517

491518
TP_STRUCT__entry(
492-
__field(const void *, r_xprt)
493-
__field(unsigned int, event)
519+
__field(unsigned long, event)
494520
__string(name, event->device->name)
495-
__string(addr, rpcrdma_addrstr(r_xprt))
496-
__string(port, rpcrdma_portstr(r_xprt))
521+
__array(unsigned char, srcaddr, sizeof(struct sockaddr_in6))
522+
__array(unsigned char, dstaddr, sizeof(struct sockaddr_in6))
497523
),
498524

499525
TP_fast_assign(
500-
__entry->r_xprt = r_xprt;
526+
const struct rdma_cm_id *id = ep->re_id;
527+
501528
__entry->event = event->event;
502529
__assign_str(name, event->device->name);
503-
__assign_str(addr, rpcrdma_addrstr(r_xprt));
504-
__assign_str(port, rpcrdma_portstr(r_xprt));
530+
memcpy(__entry->srcaddr, &id->route.addr.src_addr,
531+
sizeof(struct sockaddr_in6));
532+
memcpy(__entry->dstaddr, &id->route.addr.dst_addr,
533+
sizeof(struct sockaddr_in6));
505534
),
506535

507-
TP_printk("peer=[%s]:%s r_xprt=%p: dev %s: %s (%u)",
508-
__get_str(addr), __get_str(port), __entry->r_xprt,
509-
__get_str(name), rdma_show_ib_event(__entry->event),
510-
__entry->event
536+
TP_printk("%pISpc -> %pISpc device=%s %s (%lu)",
537+
__entry->srcaddr, __entry->dstaddr, __get_str(name),
538+
rdma_show_ib_event(__entry->event), __entry->event
511539
)
512540
);
513541

net/sunrpc/xprtrdma/verbs.c

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,14 @@ static void rpcrdma_xprt_drain(struct rpcrdma_xprt *r_xprt)
116116
* @context: ep that owns QP where event occurred
117117
*
118118
* Called from the RDMA provider (device driver) possibly in an interrupt
119-
* context.
119+
* context. The QP is always destroyed before the ID, so the ID will be
120+
* reliably available when this handler is invoked.
120121
*/
121-
static void
122-
rpcrdma_qp_event_handler(struct ib_event *event, void *context)
122+
static void rpcrdma_qp_event_handler(struct ib_event *event, void *context)
123123
{
124124
struct rpcrdma_ep *ep = context;
125-
struct rpcrdma_xprt *r_xprt = container_of(ep, struct rpcrdma_xprt,
126-
rx_ep);
127125

128-
trace_xprtrdma_qp_event(r_xprt, event);
126+
trace_xprtrdma_qp_event(ep, event);
129127
}
130128

131129
/**
@@ -202,11 +200,10 @@ static void rpcrdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)
202200
rpcrdma_rep_destroy(rep);
203201
}
204202

205-
static void rpcrdma_update_cm_private(struct rpcrdma_xprt *r_xprt,
203+
static void rpcrdma_update_cm_private(struct rpcrdma_ep *ep,
206204
struct rdma_conn_param *param)
207205
{
208206
const struct rpcrdma_connect_private *pmsg = param->private_data;
209-
struct rpcrdma_ep *ep = &r_xprt->rx_ep;
210207
unsigned int rsize, wsize;
211208

212209
/* Default settings for RPC-over-RDMA Version One */
@@ -241,6 +238,7 @@ static void rpcrdma_update_cm_private(struct rpcrdma_xprt *r_xprt,
241238
static int
242239
rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
243240
{
241+
struct sockaddr *sap = (struct sockaddr *)&id->route.addr.dst_addr;
244242
struct rpcrdma_xprt *r_xprt = id->context;
245243
struct rpcrdma_ep *ep = &r_xprt->rx_ep;
246244
struct rpc_xprt *xprt = &r_xprt->rx_xprt;
@@ -263,24 +261,21 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
263261
complete(&ep->re_done);
264262
return 0;
265263
case RDMA_CM_EVENT_DEVICE_REMOVAL:
266-
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
267-
pr_info("rpcrdma: removing device %s for %s:%s\n",
268-
ep->re_id->device->name,
269-
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt));
270-
#endif
264+
pr_info("rpcrdma: removing device %s for %pISpc\n",
265+
ep->re_id->device->name, sap);
271266
init_completion(&ep->re_remove_done);
272267
ep->re_connect_status = -ENODEV;
273268
xprt_force_disconnect(xprt);
274269
wait_for_completion(&ep->re_remove_done);
275-
trace_xprtrdma_remove(r_xprt);
270+
trace_xprtrdma_remove(ep);
276271

277272
/* Return 1 to ensure the core destroys the id. */
278273
return 1;
279274
case RDMA_CM_EVENT_ESTABLISHED:
280275
++xprt->connect_cookie;
281276
ep->re_connect_status = 1;
282-
rpcrdma_update_cm_private(r_xprt, &event->param.conn);
283-
trace_xprtrdma_inline_thresh(r_xprt);
277+
rpcrdma_update_cm_private(ep, &event->param.conn);
278+
trace_xprtrdma_inline_thresh(ep);
284279
wake_up_all(&ep->re_connect_wait);
285280
break;
286281
case RDMA_CM_EVENT_CONNECT_ERROR:
@@ -290,9 +285,8 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
290285
ep->re_connect_status = -ENETUNREACH;
291286
goto disconnected;
292287
case RDMA_CM_EVENT_REJECTED:
293-
dprintk("rpcrdma: connection to %s:%s rejected: %s\n",
294-
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt),
295-
rdma_reject_msg(id, event->status));
288+
dprintk("rpcrdma: connection to %pISpc rejected: %s\n",
289+
sap, rdma_reject_msg(id, event->status));
296290
ep->re_connect_status = -ECONNREFUSED;
297291
if (event->status == IB_CM_REJ_STALE_CONN)
298292
ep->re_connect_status = -EAGAIN;
@@ -307,8 +301,7 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
307301
break;
308302
}
309303

310-
dprintk("RPC: %s: %s:%s on %s/frwr: %s\n", __func__,
311-
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt),
304+
dprintk("RPC: %s: %pISpc on %s/frwr: %s\n", __func__, sap,
312305
ep->re_id->device->name, rdma_event_msg(event->event));
313306
return 0;
314307
}

0 commit comments

Comments
 (0)