Commit 745b734c authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker

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: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 93aa8e0a
...@@ -375,47 +375,74 @@ TRACE_EVENT(xprtrdma_cm_event, ...@@ -375,47 +375,74 @@ TRACE_EVENT(xprtrdma_cm_event,
TRACE_EVENT(xprtrdma_inline_thresh, TRACE_EVENT(xprtrdma_inline_thresh,
TP_PROTO( TP_PROTO(
const struct rpcrdma_xprt *r_xprt const struct rpcrdma_ep *ep
), ),
TP_ARGS(r_xprt), TP_ARGS(ep),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(const void *, r_xprt)
__field(unsigned int, inline_send) __field(unsigned int, inline_send)
__field(unsigned int, inline_recv) __field(unsigned int, inline_recv)
__field(unsigned int, max_send) __field(unsigned int, max_send)
__field(unsigned int, max_recv) __field(unsigned int, max_recv)
__string(addr, rpcrdma_addrstr(r_xprt)) __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6))
__string(port, rpcrdma_portstr(r_xprt)) __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6))
), ),
TP_fast_assign( TP_fast_assign(
const struct rpcrdma_ep *ep = &r_xprt->rx_ep; const struct rdma_cm_id *id = ep->re_id;
__entry->r_xprt = r_xprt;
__entry->inline_send = ep->re_inline_send; __entry->inline_send = ep->re_inline_send;
__entry->inline_recv = ep->re_inline_recv; __entry->inline_recv = ep->re_inline_recv;
__entry->max_send = ep->re_max_inline_send; __entry->max_send = ep->re_max_inline_send;
__entry->max_recv = ep->re_max_inline_recv; __entry->max_recv = ep->re_max_inline_recv;
__assign_str(addr, rpcrdma_addrstr(r_xprt)); memcpy(__entry->srcaddr, &id->route.addr.src_addr,
__assign_str(port, rpcrdma_portstr(r_xprt)); sizeof(struct sockaddr_in6));
memcpy(__entry->dstaddr, &id->route.addr.dst_addr,
sizeof(struct sockaddr_in6));
), ),
TP_printk("peer=[%s]:%s r_xprt=%p neg send/recv=%u/%u, calc send/recv=%u/%u", TP_printk("%pISpc -> %pISpc neg send/recv=%u/%u, calc send/recv=%u/%u",
__get_str(addr), __get_str(port), __entry->r_xprt, __entry->srcaddr, __entry->dstaddr,
__entry->inline_send, __entry->inline_recv, __entry->inline_send, __entry->inline_recv,
__entry->max_send, __entry->max_recv __entry->max_send, __entry->max_recv
) )
); );
TRACE_EVENT(xprtrdma_remove,
TP_PROTO(
const struct rpcrdma_ep *ep
),
TP_ARGS(ep),
TP_STRUCT__entry(
__array(unsigned char, srcaddr, sizeof(struct sockaddr_in6))
__array(unsigned char, dstaddr, sizeof(struct sockaddr_in6))
__string(name, ep->re_id->device->name)
),
TP_fast_assign(
const struct rdma_cm_id *id = ep->re_id;
memcpy(__entry->srcaddr, &id->route.addr.src_addr,
sizeof(struct sockaddr_in6));
memcpy(__entry->dstaddr, &id->route.addr.dst_addr,
sizeof(struct sockaddr_in6));
__assign_str(name, id->device->name);
),
TP_printk("%pISpc -> %pISpc device=%s",
__entry->srcaddr, __entry->dstaddr, __get_str(name)
)
);
DEFINE_CONN_EVENT(connect); DEFINE_CONN_EVENT(connect);
DEFINE_CONN_EVENT(disconnect); DEFINE_CONN_EVENT(disconnect);
DEFINE_CONN_EVENT(flush_dct); DEFINE_CONN_EVENT(flush_dct);
DEFINE_RXPRT_EVENT(xprtrdma_create); DEFINE_RXPRT_EVENT(xprtrdma_create);
DEFINE_RXPRT_EVENT(xprtrdma_op_destroy); DEFINE_RXPRT_EVENT(xprtrdma_op_destroy);
DEFINE_RXPRT_EVENT(xprtrdma_remove);
DEFINE_RXPRT_EVENT(xprtrdma_op_inject_dsc); DEFINE_RXPRT_EVENT(xprtrdma_op_inject_dsc);
DEFINE_RXPRT_EVENT(xprtrdma_op_close); DEFINE_RXPRT_EVENT(xprtrdma_op_close);
DEFINE_RXPRT_EVENT(xprtrdma_op_setport); DEFINE_RXPRT_EVENT(xprtrdma_op_setport);
...@@ -482,32 +509,33 @@ TRACE_EVENT(xprtrdma_op_set_cto, ...@@ -482,32 +509,33 @@ TRACE_EVENT(xprtrdma_op_set_cto,
TRACE_EVENT(xprtrdma_qp_event, TRACE_EVENT(xprtrdma_qp_event,
TP_PROTO( TP_PROTO(
const struct rpcrdma_xprt *r_xprt, const struct rpcrdma_ep *ep,
const struct ib_event *event const struct ib_event *event
), ),
TP_ARGS(r_xprt, event), TP_ARGS(ep, event),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(const void *, r_xprt) __field(unsigned long, event)
__field(unsigned int, event)
__string(name, event->device->name) __string(name, event->device->name)
__string(addr, rpcrdma_addrstr(r_xprt)) __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6))
__string(port, rpcrdma_portstr(r_xprt)) __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6))
), ),
TP_fast_assign( TP_fast_assign(
__entry->r_xprt = r_xprt; const struct rdma_cm_id *id = ep->re_id;
__entry->event = event->event; __entry->event = event->event;
__assign_str(name, event->device->name); __assign_str(name, event->device->name);
__assign_str(addr, rpcrdma_addrstr(r_xprt)); memcpy(__entry->srcaddr, &id->route.addr.src_addr,
__assign_str(port, rpcrdma_portstr(r_xprt)); sizeof(struct sockaddr_in6));
memcpy(__entry->dstaddr, &id->route.addr.dst_addr,
sizeof(struct sockaddr_in6));
), ),
TP_printk("peer=[%s]:%s r_xprt=%p: dev %s: %s (%u)", TP_printk("%pISpc -> %pISpc device=%s %s (%lu)",
__get_str(addr), __get_str(port), __entry->r_xprt, __entry->srcaddr, __entry->dstaddr, __get_str(name),
__get_str(name), rdma_show_ib_event(__entry->event), rdma_show_ib_event(__entry->event), __entry->event
__entry->event
) )
); );
......
...@@ -116,16 +116,14 @@ static void rpcrdma_xprt_drain(struct rpcrdma_xprt *r_xprt) ...@@ -116,16 +116,14 @@ static void rpcrdma_xprt_drain(struct rpcrdma_xprt *r_xprt)
* @context: ep that owns QP where event occurred * @context: ep that owns QP where event occurred
* *
* Called from the RDMA provider (device driver) possibly in an interrupt * Called from the RDMA provider (device driver) possibly in an interrupt
* context. * context. The QP is always destroyed before the ID, so the ID will be
* reliably available when this handler is invoked.
*/ */
static void static void rpcrdma_qp_event_handler(struct ib_event *event, void *context)
rpcrdma_qp_event_handler(struct ib_event *event, void *context)
{ {
struct rpcrdma_ep *ep = context; struct rpcrdma_ep *ep = context;
struct rpcrdma_xprt *r_xprt = container_of(ep, struct rpcrdma_xprt,
rx_ep);
trace_xprtrdma_qp_event(r_xprt, event); trace_xprtrdma_qp_event(ep, event);
} }
/** /**
...@@ -202,11 +200,10 @@ static void rpcrdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc) ...@@ -202,11 +200,10 @@ static void rpcrdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)
rpcrdma_rep_destroy(rep); rpcrdma_rep_destroy(rep);
} }
static void rpcrdma_update_cm_private(struct rpcrdma_xprt *r_xprt, static void rpcrdma_update_cm_private(struct rpcrdma_ep *ep,
struct rdma_conn_param *param) struct rdma_conn_param *param)
{ {
const struct rpcrdma_connect_private *pmsg = param->private_data; const struct rpcrdma_connect_private *pmsg = param->private_data;
struct rpcrdma_ep *ep = &r_xprt->rx_ep;
unsigned int rsize, wsize; unsigned int rsize, wsize;
/* Default settings for RPC-over-RDMA Version One */ /* Default settings for RPC-over-RDMA Version One */
...@@ -241,6 +238,7 @@ static void rpcrdma_update_cm_private(struct rpcrdma_xprt *r_xprt, ...@@ -241,6 +238,7 @@ static void rpcrdma_update_cm_private(struct rpcrdma_xprt *r_xprt,
static int static int
rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
{ {
struct sockaddr *sap = (struct sockaddr *)&id->route.addr.dst_addr;
struct rpcrdma_xprt *r_xprt = id->context; struct rpcrdma_xprt *r_xprt = id->context;
struct rpcrdma_ep *ep = &r_xprt->rx_ep; struct rpcrdma_ep *ep = &r_xprt->rx_ep;
struct rpc_xprt *xprt = &r_xprt->rx_xprt; 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) ...@@ -263,24 +261,21 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
complete(&ep->re_done); complete(&ep->re_done);
return 0; return 0;
case RDMA_CM_EVENT_DEVICE_REMOVAL: case RDMA_CM_EVENT_DEVICE_REMOVAL:
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG) pr_info("rpcrdma: removing device %s for %pISpc\n",
pr_info("rpcrdma: removing device %s for %s:%s\n", ep->re_id->device->name, sap);
ep->re_id->device->name,
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt));
#endif
init_completion(&ep->re_remove_done); init_completion(&ep->re_remove_done);
ep->re_connect_status = -ENODEV; ep->re_connect_status = -ENODEV;
xprt_force_disconnect(xprt); xprt_force_disconnect(xprt);
wait_for_completion(&ep->re_remove_done); wait_for_completion(&ep->re_remove_done);
trace_xprtrdma_remove(r_xprt); trace_xprtrdma_remove(ep);
/* Return 1 to ensure the core destroys the id. */ /* Return 1 to ensure the core destroys the id. */
return 1; return 1;
case RDMA_CM_EVENT_ESTABLISHED: case RDMA_CM_EVENT_ESTABLISHED:
++xprt->connect_cookie; ++xprt->connect_cookie;
ep->re_connect_status = 1; ep->re_connect_status = 1;
rpcrdma_update_cm_private(r_xprt, &event->param.conn); rpcrdma_update_cm_private(ep, &event->param.conn);
trace_xprtrdma_inline_thresh(r_xprt); trace_xprtrdma_inline_thresh(ep);
wake_up_all(&ep->re_connect_wait); wake_up_all(&ep->re_connect_wait);
break; break;
case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_CONNECT_ERROR:
...@@ -290,9 +285,8 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) ...@@ -290,9 +285,8 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
ep->re_connect_status = -ENETUNREACH; ep->re_connect_status = -ENETUNREACH;
goto disconnected; goto disconnected;
case RDMA_CM_EVENT_REJECTED: case RDMA_CM_EVENT_REJECTED:
dprintk("rpcrdma: connection to %s:%s rejected: %s\n", dprintk("rpcrdma: connection to %pISpc rejected: %s\n",
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt), sap, rdma_reject_msg(id, event->status));
rdma_reject_msg(id, event->status));
ep->re_connect_status = -ECONNREFUSED; ep->re_connect_status = -ECONNREFUSED;
if (event->status == IB_CM_REJ_STALE_CONN) if (event->status == IB_CM_REJ_STALE_CONN)
ep->re_connect_status = -EAGAIN; ep->re_connect_status = -EAGAIN;
...@@ -307,8 +301,7 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) ...@@ -307,8 +301,7 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
break; break;
} }
dprintk("RPC: %s: %s:%s on %s/frwr: %s\n", __func__, dprintk("RPC: %s: %pISpc on %s/frwr: %s\n", __func__, sap,
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt),
ep->re_id->device->name, rdma_event_msg(event->event)); ep->re_id->device->name, rdma_event_msg(event->event));
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment