SUNRPC: Clean up request deferral tracepoints
- 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>
This commit is contained in:
parent
1eace0d1e9
commit
8954c5c212
@ -1406,27 +1406,32 @@ DECLARE_EVENT_CLASS(svc_deferred_event,
|
|||||||
TP_ARGS(dr),
|
TP_ARGS(dr),
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
|
__field(const void *, dr)
|
||||||
__field(u32, xid)
|
__field(u32, xid)
|
||||||
__string(addr, dr->xprt->xpt_remotebuf)
|
__string(addr, dr->xprt->xpt_remotebuf)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
|
__entry->dr = dr;
|
||||||
__entry->xid = be32_to_cpu(*(__be32 *)(dr->args +
|
__entry->xid = be32_to_cpu(*(__be32 *)(dr->args +
|
||||||
(dr->xprt_hlen>>2)));
|
(dr->xprt_hlen>>2)));
|
||||||
__assign_str(addr, dr->xprt->xpt_remotebuf);
|
__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 DEFINE_SVC_DEFERRED_EVENT(name) \
|
||||||
DEFINE_EVENT(svc_deferred_event, svc_##name##_deferred, \
|
DEFINE_EVENT(svc_deferred_event, svc_defer_##name, \
|
||||||
TP_PROTO( \
|
TP_PROTO( \
|
||||||
const struct svc_deferred_req *dr \
|
const struct svc_deferred_req *dr \
|
||||||
), \
|
), \
|
||||||
TP_ARGS(dr))
|
TP_ARGS(dr))
|
||||||
|
|
||||||
DEFINE_SVC_DEFERRED_EVENT(drop);
|
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,
|
TRACE_EVENT(svcsock_new_socket,
|
||||||
TP_PROTO(
|
TP_PROTO(
|
||||||
|
@ -1145,16 +1145,15 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
|
|||||||
set_bit(XPT_DEFERRED, &xprt->xpt_flags);
|
set_bit(XPT_DEFERRED, &xprt->xpt_flags);
|
||||||
if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
|
if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
|
||||||
spin_unlock(&xprt->xpt_lock);
|
spin_unlock(&xprt->xpt_lock);
|
||||||
dprintk("revisit canceled\n");
|
trace_svc_defer_drop(dr);
|
||||||
svc_xprt_put(xprt);
|
svc_xprt_put(xprt);
|
||||||
trace_svc_drop_deferred(dr);
|
|
||||||
kfree(dr);
|
kfree(dr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dprintk("revisit queued\n");
|
|
||||||
dr->xprt = NULL;
|
dr->xprt = NULL;
|
||||||
list_add(&dr->handle.recent, &xprt->xpt_deferred);
|
list_add(&dr->handle.recent, &xprt->xpt_deferred);
|
||||||
spin_unlock(&xprt->xpt_lock);
|
spin_unlock(&xprt->xpt_lock);
|
||||||
|
trace_svc_defer_queue(dr);
|
||||||
svc_xprt_enqueue(xprt);
|
svc_xprt_enqueue(xprt);
|
||||||
svc_xprt_put(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,
|
memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
|
||||||
dr->argslen << 2);
|
dr->argslen << 2);
|
||||||
}
|
}
|
||||||
|
trace_svc_defer(rqstp);
|
||||||
svc_xprt_get(rqstp->rq_xprt);
|
svc_xprt_get(rqstp->rq_xprt);
|
||||||
dr->xprt = rqstp->rq_xprt;
|
dr->xprt = rqstp->rq_xprt;
|
||||||
set_bit(RQ_DROPME, &rqstp->rq_flags);
|
set_bit(RQ_DROPME, &rqstp->rq_flags);
|
||||||
|
|
||||||
dr->handle.revisit = svc_revisit;
|
dr->handle.revisit = svc_revisit;
|
||||||
trace_svc_defer(rqstp);
|
|
||||||
return &dr->handle;
|
return &dr->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* recv data from a deferred request into an active one
|
* 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;
|
struct svc_deferred_req *dr = rqstp->rq_deferred;
|
||||||
|
|
||||||
|
trace_svc_defer_recv(dr);
|
||||||
|
|
||||||
/* setup iov_base past transport header */
|
/* setup iov_base past transport header */
|
||||||
rqstp->rq_arg.head[0].iov_base = dr->args + (dr->xprt_hlen>>2);
|
rqstp->rq_arg.head[0].iov_base = dr->args + (dr->xprt_hlen>>2);
|
||||||
/* The iov_len does not include the transport header bytes */
|
/* 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,
|
struct svc_deferred_req,
|
||||||
handle.recent);
|
handle.recent);
|
||||||
list_del_init(&dr->handle.recent);
|
list_del_init(&dr->handle.recent);
|
||||||
trace_svc_revisit_deferred(dr);
|
|
||||||
} else
|
} else
|
||||||
clear_bit(XPT_DEFERRED, &xprt->xpt_flags);
|
clear_bit(XPT_DEFERRED, &xprt->xpt_flags);
|
||||||
spin_unlock(&xprt->xpt_lock);
|
spin_unlock(&xprt->xpt_lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user