Merge tag 'nfs-for-5.5-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust:
"Highlights include:
Features:
- NFSv4.2 now supports cross device offloaded copy (i.e. offloaded
copy of a file from one source server to a different target
server).
- New RDMA tracepoints for debugging congestion control and Local
Invalidate WRs.
Bugfixes and cleanups
- Drop the NFSv4.1 session slot if nfs4_delegreturn_prepare waits for
layoutreturn
- Handle bad/dead sessions correctly in nfs41_sequence_process()
- Various bugfixes to the delegation return operation.
- Various bugfixes pertaining to delegations that have been revoked.
- Cleanups to the NFS timespec code to avoid unnecessary conversions
between timespec and timespec64.
- Fix unstable RDMA connections after a reconnect
- Close race between waking an RDMA sender and posting a receive
- Wake pending RDMA tasks if connection fails
- Fix MR list corruption, and clean up MR usage
- Fix another RPCSEC_GSS issue with MIC buffer space"
* tag 'nfs-for-5.5-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (79 commits)
SUNRPC: Capture completion of all RPC tasks
SUNRPC: Fix another issue with MIC buffer space
NFS4: Trace lock reclaims
NFS4: Trace state recovery operation
NFSv4.2 fix memory leak in nfs42_ssc_open
NFSv4.2 fix kfree in __nfs42_copy_file_range
NFS: remove duplicated include from nfs4file.c
NFSv4: Make _nfs42_proc_copy_notify() static
NFS: Fallocate should use the nfs4_fattr_bitmap
NFS: Return -ETXTBSY when attempting to write to a swapfile
fs: nfs: sysfs: Remove NULL check before kfree
NFS: remove unneeded semicolon
NFSv4: add declaration of current_stateid
NFSv4.x: Drop the slot if nfs4_delegreturn_prepare waits for layoutreturn
NFSv4.x: Handle bad/dead sessions correctly in nfs41_sequence_process()
nfsv4: Move NFSPROC4_CLNT_COPY_NOTIFY to end of list
SUNRPC: Avoid RPC delays when exiting suspend
NFS: Add a tracepoint in nfs_fh_to_dentry()
NFSv4: Don't retry the GETATTR on old stateid in nfs4_delegreturn_done()
NFSv4: Handle NFS4ERR_OLD_STATEID in delegreturn
...
This commit is contained in:
+138
-72
@@ -85,6 +85,44 @@ DECLARE_EVENT_CLASS(xprtrdma_rxprt,
|
||||
), \
|
||||
TP_ARGS(r_xprt))
|
||||
|
||||
DECLARE_EVENT_CLASS(xprtrdma_connect_class,
|
||||
TP_PROTO(
|
||||
const struct rpcrdma_xprt *r_xprt,
|
||||
int rc
|
||||
),
|
||||
|
||||
TP_ARGS(r_xprt, rc),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const void *, r_xprt)
|
||||
__field(int, rc)
|
||||
__field(int, connect_status)
|
||||
__string(addr, rpcrdma_addrstr(r_xprt))
|
||||
__string(port, rpcrdma_portstr(r_xprt))
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->r_xprt = r_xprt;
|
||||
__entry->rc = rc;
|
||||
__entry->connect_status = r_xprt->rx_ep.rep_connected;
|
||||
__assign_str(addr, rpcrdma_addrstr(r_xprt));
|
||||
__assign_str(port, rpcrdma_portstr(r_xprt));
|
||||
),
|
||||
|
||||
TP_printk("peer=[%s]:%s r_xprt=%p: rc=%d connect status=%d",
|
||||
__get_str(addr), __get_str(port), __entry->r_xprt,
|
||||
__entry->rc, __entry->connect_status
|
||||
)
|
||||
);
|
||||
|
||||
#define DEFINE_CONN_EVENT(name) \
|
||||
DEFINE_EVENT(xprtrdma_connect_class, xprtrdma_##name, \
|
||||
TP_PROTO( \
|
||||
const struct rpcrdma_xprt *r_xprt, \
|
||||
int rc \
|
||||
), \
|
||||
TP_ARGS(r_xprt, rc))
|
||||
|
||||
DECLARE_EVENT_CLASS(xprtrdma_rdch_event,
|
||||
TP_PROTO(
|
||||
const struct rpc_task *task,
|
||||
@@ -333,47 +371,81 @@ TRACE_EVENT(xprtrdma_cm_event,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(xprtrdma_disconnect,
|
||||
TRACE_EVENT(xprtrdma_inline_thresh,
|
||||
TP_PROTO(
|
||||
const struct rpcrdma_xprt *r_xprt,
|
||||
int status
|
||||
const struct rpcrdma_xprt *r_xprt
|
||||
),
|
||||
|
||||
TP_ARGS(r_xprt, status),
|
||||
TP_ARGS(r_xprt),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const void *, r_xprt)
|
||||
__field(int, status)
|
||||
__field(int, connected)
|
||||
__field(unsigned int, inline_send)
|
||||
__field(unsigned int, inline_recv)
|
||||
__field(unsigned int, max_send)
|
||||
__field(unsigned int, max_recv)
|
||||
__string(addr, rpcrdma_addrstr(r_xprt))
|
||||
__string(port, rpcrdma_portstr(r_xprt))
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct rpcrdma_ep *ep = &r_xprt->rx_ep;
|
||||
|
||||
__entry->r_xprt = r_xprt;
|
||||
__entry->inline_send = ep->rep_inline_send;
|
||||
__entry->inline_recv = ep->rep_inline_recv;
|
||||
__entry->max_send = ep->rep_max_inline_send;
|
||||
__entry->max_recv = ep->rep_max_inline_recv;
|
||||
__assign_str(addr, rpcrdma_addrstr(r_xprt));
|
||||
__assign_str(port, rpcrdma_portstr(r_xprt));
|
||||
),
|
||||
|
||||
TP_printk("peer=[%s]:%s r_xprt=%p neg send/recv=%u/%u, calc send/recv=%u/%u",
|
||||
__get_str(addr), __get_str(port), __entry->r_xprt,
|
||||
__entry->inline_send, __entry->inline_recv,
|
||||
__entry->max_send, __entry->max_recv
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_CONN_EVENT(connect);
|
||||
DEFINE_CONN_EVENT(disconnect);
|
||||
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_create);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_destroy);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_remove);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_reinsert);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_inject_dsc);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_close);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_setport);
|
||||
|
||||
TRACE_EVENT(xprtrdma_op_connect,
|
||||
TP_PROTO(
|
||||
const struct rpcrdma_xprt *r_xprt,
|
||||
unsigned long delay
|
||||
),
|
||||
|
||||
TP_ARGS(r_xprt, delay),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const void *, r_xprt)
|
||||
__field(unsigned long, delay)
|
||||
__string(addr, rpcrdma_addrstr(r_xprt))
|
||||
__string(port, rpcrdma_portstr(r_xprt))
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->r_xprt = r_xprt;
|
||||
__entry->status = status;
|
||||
__entry->connected = r_xprt->rx_ep.rep_connected;
|
||||
__entry->delay = delay;
|
||||
__assign_str(addr, rpcrdma_addrstr(r_xprt));
|
||||
__assign_str(port, rpcrdma_portstr(r_xprt));
|
||||
),
|
||||
|
||||
TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected",
|
||||
__get_str(addr), __get_str(port),
|
||||
__entry->r_xprt, __entry->status,
|
||||
__entry->connected == 1 ? "still " : "dis"
|
||||
TP_printk("peer=[%s]:%s r_xprt=%p delay=%lu",
|
||||
__get_str(addr), __get_str(port), __entry->r_xprt,
|
||||
__entry->delay
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_conn_start);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_conn_tout);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_create);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_destroy);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_remove);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_reinsert);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_reconnect);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_inject_dsc);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_close);
|
||||
DEFINE_RXPRT_EVENT(xprtrdma_op_connect);
|
||||
|
||||
TRACE_EVENT(xprtrdma_op_set_cto,
|
||||
TP_PROTO(
|
||||
@@ -532,6 +604,8 @@ DEFINE_WRCH_EVENT(write);
|
||||
DEFINE_WRCH_EVENT(reply);
|
||||
|
||||
TRACE_DEFINE_ENUM(rpcrdma_noch);
|
||||
TRACE_DEFINE_ENUM(rpcrdma_noch_pullup);
|
||||
TRACE_DEFINE_ENUM(rpcrdma_noch_mapped);
|
||||
TRACE_DEFINE_ENUM(rpcrdma_readch);
|
||||
TRACE_DEFINE_ENUM(rpcrdma_areadch);
|
||||
TRACE_DEFINE_ENUM(rpcrdma_writech);
|
||||
@@ -540,6 +614,8 @@ TRACE_DEFINE_ENUM(rpcrdma_replych);
|
||||
#define xprtrdma_show_chunktype(x) \
|
||||
__print_symbolic(x, \
|
||||
{ rpcrdma_noch, "inline" }, \
|
||||
{ rpcrdma_noch_pullup, "pullup" }, \
|
||||
{ rpcrdma_noch_mapped, "mapped" }, \
|
||||
{ rpcrdma_readch, "read list" }, \
|
||||
{ rpcrdma_areadch, "*read list" }, \
|
||||
{ rpcrdma_writech, "write list" }, \
|
||||
@@ -667,9 +743,8 @@ TRACE_EVENT(xprtrdma_post_send,
|
||||
__entry->client_id = rqst->rq_task->tk_client ?
|
||||
rqst->rq_task->tk_client->cl_clid : -1;
|
||||
__entry->req = req;
|
||||
__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
|
||||
__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
|
||||
IB_SEND_SIGNALED;
|
||||
__entry->num_sge = req->rl_wr.num_sge;
|
||||
__entry->signaled = req->rl_wr.send_flags & IB_SEND_SIGNALED;
|
||||
__entry->status = status;
|
||||
),
|
||||
|
||||
@@ -735,6 +810,31 @@ TRACE_EVENT(xprtrdma_post_recvs,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(xprtrdma_post_linv,
|
||||
TP_PROTO(
|
||||
const struct rpcrdma_req *req,
|
||||
int status
|
||||
),
|
||||
|
||||
TP_ARGS(req, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const void *, req)
|
||||
__field(int, status)
|
||||
__field(u32, xid)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->req = req;
|
||||
__entry->status = status;
|
||||
__entry->xid = be32_to_cpu(req->rl_slot.rq_xid);
|
||||
),
|
||||
|
||||
TP_printk("req=%p xid=0x%08x status=%d",
|
||||
__entry->req, __entry->xid, __entry->status
|
||||
)
|
||||
);
|
||||
|
||||
/**
|
||||
** Completion events
|
||||
**/
|
||||
@@ -1021,66 +1121,32 @@ DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
|
||||
TRACE_EVENT(xprtrdma_fixup,
|
||||
TP_PROTO(
|
||||
const struct rpc_rqst *rqst,
|
||||
int len,
|
||||
int hdrlen
|
||||
unsigned long fixup
|
||||
),
|
||||
|
||||
TP_ARGS(rqst, len, hdrlen),
|
||||
TP_ARGS(rqst, fixup),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(const void *, base)
|
||||
__field(int, len)
|
||||
__field(int, hdrlen)
|
||||
__field(unsigned long, fixup)
|
||||
__field(size_t, headlen)
|
||||
__field(unsigned int, pagelen)
|
||||
__field(size_t, taillen)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->task_id = rqst->rq_task->tk_pid;
|
||||
__entry->client_id = rqst->rq_task->tk_client->cl_clid;
|
||||
__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
|
||||
__entry->len = len;
|
||||
__entry->hdrlen = hdrlen;
|
||||
__entry->fixup = fixup;
|
||||
__entry->headlen = rqst->rq_rcv_buf.head[0].iov_len;
|
||||
__entry->pagelen = rqst->rq_rcv_buf.page_len;
|
||||
__entry->taillen = rqst->rq_rcv_buf.tail[0].iov_len;
|
||||
),
|
||||
|
||||
TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
|
||||
__entry->task_id, __entry->client_id,
|
||||
__entry->base, __entry->len, __entry->hdrlen
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(xprtrdma_fixup_pg,
|
||||
TP_PROTO(
|
||||
const struct rpc_rqst *rqst,
|
||||
int pageno,
|
||||
const void *pos,
|
||||
int len,
|
||||
int curlen
|
||||
),
|
||||
|
||||
TP_ARGS(rqst, pageno, pos, len, curlen),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(const void *, pos)
|
||||
__field(int, pageno)
|
||||
__field(int, len)
|
||||
__field(int, curlen)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->task_id = rqst->rq_task->tk_pid;
|
||||
__entry->client_id = rqst->rq_task->tk_client->cl_clid;
|
||||
__entry->pos = pos;
|
||||
__entry->pageno = pageno;
|
||||
__entry->len = len;
|
||||
__entry->curlen = curlen;
|
||||
),
|
||||
|
||||
TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
|
||||
__entry->task_id, __entry->client_id,
|
||||
__entry->pageno, __entry->pos, __entry->len, __entry->curlen
|
||||
TP_printk("task:%u@%u fixup=%lu xdr=%zu/%u/%zu",
|
||||
__entry->task_id, __entry->client_id, __entry->fixup,
|
||||
__entry->headlen, __entry->pagelen, __entry->taillen
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -165,6 +165,7 @@ DECLARE_EVENT_CLASS(rpc_task_running,
|
||||
DEFINE_RPC_RUNNING_EVENT(begin);
|
||||
DEFINE_RPC_RUNNING_EVENT(run_action);
|
||||
DEFINE_RPC_RUNNING_EVENT(complete);
|
||||
DEFINE_RPC_RUNNING_EVENT(end);
|
||||
|
||||
DECLARE_EVENT_CLASS(rpc_task_queued,
|
||||
|
||||
@@ -777,6 +778,99 @@ TRACE_EVENT(xprt_ping,
|
||||
__get_str(addr), __get_str(port), __entry->status)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(xprt_writelock_event,
|
||||
TP_PROTO(
|
||||
const struct rpc_xprt *xprt, const struct rpc_task *task
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, task),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(unsigned int, snd_task_id)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
if (task) {
|
||||
__entry->task_id = task->tk_pid;
|
||||
__entry->client_id = task->tk_client ?
|
||||
task->tk_client->cl_clid : -1;
|
||||
} else {
|
||||
__entry->task_id = -1;
|
||||
__entry->client_id = -1;
|
||||
}
|
||||
__entry->snd_task_id = xprt->snd_task ?
|
||||
xprt->snd_task->tk_pid : -1;
|
||||
),
|
||||
|
||||
TP_printk("task:%u@%u snd_task:%u",
|
||||
__entry->task_id, __entry->client_id,
|
||||
__entry->snd_task_id)
|
||||
);
|
||||
|
||||
#define DEFINE_WRITELOCK_EVENT(name) \
|
||||
DEFINE_EVENT(xprt_writelock_event, xprt_##name, \
|
||||
TP_PROTO( \
|
||||
const struct rpc_xprt *xprt, \
|
||||
const struct rpc_task *task \
|
||||
), \
|
||||
TP_ARGS(xprt, task))
|
||||
|
||||
DEFINE_WRITELOCK_EVENT(reserve_xprt);
|
||||
DEFINE_WRITELOCK_EVENT(release_xprt);
|
||||
|
||||
DECLARE_EVENT_CLASS(xprt_cong_event,
|
||||
TP_PROTO(
|
||||
const struct rpc_xprt *xprt, const struct rpc_task *task
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, task),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(unsigned int, snd_task_id)
|
||||
__field(unsigned long, cong)
|
||||
__field(unsigned long, cwnd)
|
||||
__field(bool, wait)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
if (task) {
|
||||
__entry->task_id = task->tk_pid;
|
||||
__entry->client_id = task->tk_client ?
|
||||
task->tk_client->cl_clid : -1;
|
||||
} else {
|
||||
__entry->task_id = -1;
|
||||
__entry->client_id = -1;
|
||||
}
|
||||
__entry->snd_task_id = xprt->snd_task ?
|
||||
xprt->snd_task->tk_pid : -1;
|
||||
__entry->cong = xprt->cong;
|
||||
__entry->cwnd = xprt->cwnd;
|
||||
__entry->wait = test_bit(XPRT_CWND_WAIT, &xprt->state);
|
||||
),
|
||||
|
||||
TP_printk("task:%u@%u snd_task:%u cong=%lu cwnd=%lu%s",
|
||||
__entry->task_id, __entry->client_id,
|
||||
__entry->snd_task_id, __entry->cong, __entry->cwnd,
|
||||
__entry->wait ? " (wait)" : "")
|
||||
);
|
||||
|
||||
#define DEFINE_CONG_EVENT(name) \
|
||||
DEFINE_EVENT(xprt_cong_event, xprt_##name, \
|
||||
TP_PROTO( \
|
||||
const struct rpc_xprt *xprt, \
|
||||
const struct rpc_task *task \
|
||||
), \
|
||||
TP_ARGS(xprt, task))
|
||||
|
||||
DEFINE_CONG_EVENT(reserve_cong);
|
||||
DEFINE_CONG_EVENT(release_cong);
|
||||
DEFINE_CONG_EVENT(get_cong);
|
||||
DEFINE_CONG_EVENT(put_cong);
|
||||
|
||||
TRACE_EVENT(xs_stream_read_data,
|
||||
TP_PROTO(struct rpc_xprt *xprt, ssize_t err, size_t total),
|
||||
|
||||
|
||||
Reference in New Issue
Block a user