xprtrdma: Display async errors
authorChuck Lever <chuck.lever@oracle.com>
Sun, 9 Nov 2014 01:15:01 +0000 (20:15 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 25 Nov 2014 18:39:20 +0000 (13:39 -0500)
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>
net/sunrpc/xprtrdma/verbs.c

index e6ac964..5783c1a 100644 (file)
@@ -106,6 +106,32 @@ rpcrdma_run_tasklet(unsigned long data)
 
 static DECLARE_TASKLET(rpcrdma_tasklet_g, rpcrdma_run_tasklet, 0UL);
 
+static const char * const async_event[] = {
+       "CQ error",
+       "QP fatal error",
+       "QP request error",
+       "QP access error",
+       "communication established",
+       "send queue drained",
+       "path migration successful",
+       "path mig error",
+       "device fatal error",
+       "port active",
+       "port error",
+       "LID change",
+       "P_key change",
+       "SM change",
+       "SRQ error",
+       "SRQ limit reached",
+       "last WQE reached",
+       "client reregister",
+       "GID change",
+};
+
+#define ASYNC_MSG(status)                                      \
+       ((status) < ARRAY_SIZE(async_event) ?                   \
+               async_event[(status)] : "unknown async error")
+
 static void
 rpcrdma_schedule_tasklet(struct list_head *sched_list)
 {
@@ -122,8 +148,9 @@ rpcrdma_qp_async_error_upcall(struct ib_event *event, void *context)
 {
        struct rpcrdma_ep *ep = context;
 
-       dprintk("RPC:       %s: QP error %X on device %s ep %p\n",
-               __func__, event->event, event->device->name, context);
+       pr_err("RPC:       %s: %s on device %s ep %p\n",
+              __func__, ASYNC_MSG(event->event),
+               event->device->name, context);
        if (ep->rep_connected == 1) {
                ep->rep_connected = -EIO;
                ep->rep_func(ep);
@@ -136,8 +163,9 @@ rpcrdma_cq_async_error_upcall(struct ib_event *event, void *context)
 {
        struct rpcrdma_ep *ep = context;
 
-       dprintk("RPC:       %s: CQ error %X on device %s ep %p\n",
-               __func__, event->event, event->device->name, context);
+       pr_err("RPC:       %s: %s on device %s ep %p\n",
+              __func__, ASYNC_MSG(event->event),
+               event->device->name, context);
        if (ep->rep_connected == 1) {
                ep->rep_connected = -EIO;
                ep->rep_func(ep);