diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2014-11-08 20:15:01 -0500 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2014-11-25 13:39:20 -0500 |
commit | 7ff11de1bae02a41cac6503f858218ac1b9a3cbe (patch) | |
tree | 192c555c2d7c467164d10eafc8d19f4a82f9eb43 | |
parent | d5440e27d3e572272db957d6b9661a902b7c339f (diff) |
xprtrdma: Display async errors
An async error upcall is a hard error, and should be reported in
the system log.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index e6ac9643fe56..5783c1a55b09 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -106,6 +106,32 @@ rpcrdma_run_tasklet(unsigned long data) | |||
106 | 106 | ||
107 | static DECLARE_TASKLET(rpcrdma_tasklet_g, rpcrdma_run_tasklet, 0UL); | 107 | static DECLARE_TASKLET(rpcrdma_tasklet_g, rpcrdma_run_tasklet, 0UL); |
108 | 108 | ||
109 | static const char * const async_event[] = { | ||
110 | "CQ error", | ||
111 | "QP fatal error", | ||
112 | "QP request error", | ||
113 | "QP access error", | ||
114 | "communication established", | ||
115 | "send queue drained", | ||
116 | "path migration successful", | ||
117 | "path mig error", | ||
118 | "device fatal error", | ||
119 | "port active", | ||
120 | "port error", | ||
121 | "LID change", | ||
122 | "P_key change", | ||
123 | "SM change", | ||
124 | "SRQ error", | ||
125 | "SRQ limit reached", | ||
126 | "last WQE reached", | ||
127 | "client reregister", | ||
128 | "GID change", | ||
129 | }; | ||
130 | |||
131 | #define ASYNC_MSG(status) \ | ||
132 | ((status) < ARRAY_SIZE(async_event) ? \ | ||
133 | async_event[(status)] : "unknown async error") | ||
134 | |||
109 | static void | 135 | static void |
110 | rpcrdma_schedule_tasklet(struct list_head *sched_list) | 136 | rpcrdma_schedule_tasklet(struct list_head *sched_list) |
111 | { | 137 | { |
@@ -122,8 +148,9 @@ rpcrdma_qp_async_error_upcall(struct ib_event *event, void *context) | |||
122 | { | 148 | { |
123 | struct rpcrdma_ep *ep = context; | 149 | struct rpcrdma_ep *ep = context; |
124 | 150 | ||
125 | dprintk("RPC: %s: QP error %X on device %s ep %p\n", | 151 | pr_err("RPC: %s: %s on device %s ep %p\n", |
126 | __func__, event->event, event->device->name, context); | 152 | __func__, ASYNC_MSG(event->event), |
153 | event->device->name, context); | ||
127 | if (ep->rep_connected == 1) { | 154 | if (ep->rep_connected == 1) { |
128 | ep->rep_connected = -EIO; | 155 | ep->rep_connected = -EIO; |
129 | ep->rep_func(ep); | 156 | ep->rep_func(ep); |
@@ -136,8 +163,9 @@ rpcrdma_cq_async_error_upcall(struct ib_event *event, void *context) | |||
136 | { | 163 | { |
137 | struct rpcrdma_ep *ep = context; | 164 | struct rpcrdma_ep *ep = context; |
138 | 165 | ||
139 | dprintk("RPC: %s: CQ error %X on device %s ep %p\n", | 166 | pr_err("RPC: %s: %s on device %s ep %p\n", |
140 | __func__, event->event, event->device->name, context); | 167 | __func__, ASYNC_MSG(event->event), |
168 | event->device->name, context); | ||
141 | if (ep->rep_connected == 1) { | 169 | if (ep->rep_connected == 1) { |
142 | ep->rep_connected = -EIO; | 170 | ep->rep_connected = -EIO; |
143 | ep->rep_func(ep); | 171 | ep->rep_func(ep); |