OSDN Git Service

SUNRPC: Clean up request deferral tracepoints
authorChuck Lever <chuck.lever@oracle.com>
Wed, 15 Apr 2020 13:05:26 +0000 (09:05 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Wed, 20 May 2020 21:30:44 +0000 (17:30 -0400)
- Rename these so they are easy to enable and search for as a set
- Move the tracepoints to get a more accurate sense of control flow
- Tracepoints should not fire on xprt shutdown
- Display memory address in case data structure had been corrupted
- Abandon dprintk in these paths

I haven't ever gotten one of these tracepoints to trigger. I wonder
if we should simply remove them.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
include/trace/events/sunrpc.h
net/sunrpc/svc_xprt.c

index 2a7f6f8..852413c 100644 (file)
@@ -1406,27 +1406,32 @@ DECLARE_EVENT_CLASS(svc_deferred_event,
        TP_ARGS(dr),
 
        TP_STRUCT__entry(
+               __field(const void *, dr)
                __field(u32, xid)
                __string(addr, dr->xprt->xpt_remotebuf)
        ),
 
        TP_fast_assign(
+               __entry->dr = dr;
                __entry->xid = be32_to_cpu(*(__be32 *)(dr->args +
                                                       (dr->xprt_hlen>>2)));
                __assign_str(addr, dr->xprt->xpt_remotebuf);
        ),
 
-       TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid)
+       TP_printk("addr=%s dr=%p xid=0x%08x", __get_str(addr), __entry->dr,
+               __entry->xid)
 );
+
 #define DEFINE_SVC_DEFERRED_EVENT(name) \
-       DEFINE_EVENT(svc_deferred_event, svc_##name##_deferred, \
+       DEFINE_EVENT(svc_deferred_event, svc_defer_##name, \
                        TP_PROTO( \
                                const struct svc_deferred_req *dr \
                        ), \
                        TP_ARGS(dr))
 
 DEFINE_SVC_DEFERRED_EVENT(drop);
-DEFINE_SVC_DEFERRED_EVENT(revisit);
+DEFINE_SVC_DEFERRED_EVENT(queue);
+DEFINE_SVC_DEFERRED_EVENT(recv);
 
 TRACE_EVENT(svcsock_new_socket,
        TP_PROTO(
index 0a546ef..c1ff8cd 100644 (file)
@@ -1145,16 +1145,15 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
        set_bit(XPT_DEFERRED, &xprt->xpt_flags);
        if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
                spin_unlock(&xprt->xpt_lock);
-               dprintk("revisit canceled\n");
+               trace_svc_defer_drop(dr);
                svc_xprt_put(xprt);
-               trace_svc_drop_deferred(dr);
                kfree(dr);
                return;
        }
-       dprintk("revisit queued\n");
        dr->xprt = NULL;
        list_add(&dr->handle.recent, &xprt->xpt_deferred);
        spin_unlock(&xprt->xpt_lock);
+       trace_svc_defer_queue(dr);
        svc_xprt_enqueue(xprt);
        svc_xprt_put(xprt);
 }
@@ -1200,22 +1199,24 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
                memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
                       dr->argslen << 2);
        }
+       trace_svc_defer(rqstp);
        svc_xprt_get(rqstp->rq_xprt);
        dr->xprt = rqstp->rq_xprt;
        set_bit(RQ_DROPME, &rqstp->rq_flags);
 
        dr->handle.revisit = svc_revisit;
-       trace_svc_defer(rqstp);
        return &dr->handle;
 }
 
 /*
  * recv data from a deferred request into an active one
  */
-static int svc_deferred_recv(struct svc_rqst *rqstp)
+static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
 {
        struct svc_deferred_req *dr = rqstp->rq_deferred;
 
+       trace_svc_defer_recv(dr);
+
        /* setup iov_base past transport header */
        rqstp->rq_arg.head[0].iov_base = dr->args + (dr->xprt_hlen>>2);
        /* The iov_len does not include the transport header bytes */
@@ -1246,7 +1247,6 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt)
                                struct svc_deferred_req,
                                handle.recent);
                list_del_init(&dr->handle.recent);
-               trace_svc_revisit_deferred(dr);
        } else
                clear_bit(XPT_DEFERRED, &xprt->xpt_flags);
        spin_unlock(&xprt->xpt_lock);