Commit a1f45efb authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'nfs-for-4.17-2' of git://git.linux-nfs.org/projects/anna/linux-nfs

Pull NFS client fixes from Anna Schumaker:
 "These patches fix both a possible corruption during NFSoRDMA MR
  recovery, and a sunrpc tracepoint crash.

  Additionally, Trond has a new email address to put in the MAINTAINERS
  file"

* tag 'nfs-for-4.17-2' of git://git.linux-nfs.org/projects/anna/linux-nfs:
  Change Trond's email address in MAINTAINERS
  sunrpc: Fix latency trace point crashes
  xprtrdma: Fix list corruption / DMAR errors during MR recovery
parents ac428036 04ac6fdb
...@@ -9873,7 +9873,7 @@ F: include/linux/platform_data/nxp-nci.h ...@@ -9873,7 +9873,7 @@ F: include/linux/platform_data/nxp-nci.h
F: Documentation/devicetree/bindings/net/nfc/ F: Documentation/devicetree/bindings/net/nfc/
NFS, SUNRPC, AND LOCKD CLIENTS NFS, SUNRPC, AND LOCKD CLIENTS
M: Trond Myklebust <trond.myklebust@primarydata.com> M: Trond Myklebust <trond.myklebust@hammerspace.com>
M: Anna Schumaker <anna.schumaker@netapp.com> M: Anna Schumaker <anna.schumaker@netapp.com>
L: linux-nfs@vger.kernel.org L: linux-nfs@vger.kernel.org
W: http://client.linux-nfs.org W: http://client.linux-nfs.org
......
...@@ -224,6 +224,8 @@ TRACE_EVENT(rpc_stats_latency, ...@@ -224,6 +224,8 @@ TRACE_EVENT(rpc_stats_latency,
TP_ARGS(task, backlog, rtt, execute), TP_ARGS(task, backlog, rtt, execute),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, task_id)
__field(unsigned int, client_id)
__field(u32, xid) __field(u32, xid)
__field(int, version) __field(int, version)
__string(progname, task->tk_client->cl_program->name) __string(progname, task->tk_client->cl_program->name)
...@@ -231,13 +233,11 @@ TRACE_EVENT(rpc_stats_latency, ...@@ -231,13 +233,11 @@ TRACE_EVENT(rpc_stats_latency,
__field(unsigned long, backlog) __field(unsigned long, backlog)
__field(unsigned long, rtt) __field(unsigned long, rtt)
__field(unsigned long, execute) __field(unsigned long, execute)
__string(addr,
task->tk_xprt->address_strings[RPC_DISPLAY_ADDR])
__string(port,
task->tk_xprt->address_strings[RPC_DISPLAY_PORT])
), ),
TP_fast_assign( TP_fast_assign(
__entry->client_id = task->tk_client->cl_clid;
__entry->task_id = task->tk_pid;
__entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid);
__entry->version = task->tk_client->cl_vers; __entry->version = task->tk_client->cl_vers;
__assign_str(progname, task->tk_client->cl_program->name) __assign_str(progname, task->tk_client->cl_program->name)
...@@ -245,14 +245,10 @@ TRACE_EVENT(rpc_stats_latency, ...@@ -245,14 +245,10 @@ TRACE_EVENT(rpc_stats_latency,
__entry->backlog = ktime_to_us(backlog); __entry->backlog = ktime_to_us(backlog);
__entry->rtt = ktime_to_us(rtt); __entry->rtt = ktime_to_us(rtt);
__entry->execute = ktime_to_us(execute); __entry->execute = ktime_to_us(execute);
__assign_str(addr,
task->tk_xprt->address_strings[RPC_DISPLAY_ADDR]);
__assign_str(port,
task->tk_xprt->address_strings[RPC_DISPLAY_PORT]);
), ),
TP_printk("peer=[%s]:%s xid=0x%08x %sv%d %s backlog=%lu rtt=%lu execute=%lu", TP_printk("task:%u@%d xid=0x%08x %sv%d %s backlog=%lu rtt=%lu execute=%lu",
__get_str(addr), __get_str(port), __entry->xid, __entry->task_id, __entry->client_id, __entry->xid,
__get_str(progname), __entry->version, __get_str(procname), __get_str(progname), __entry->version, __get_str(procname),
__entry->backlog, __entry->rtt, __entry->execute) __entry->backlog, __entry->rtt, __entry->execute)
); );
......
...@@ -72,6 +72,7 @@ fmr_op_init_mr(struct rpcrdma_ia *ia, struct rpcrdma_mr *mr) ...@@ -72,6 +72,7 @@ fmr_op_init_mr(struct rpcrdma_ia *ia, struct rpcrdma_mr *mr)
if (IS_ERR(mr->fmr.fm_mr)) if (IS_ERR(mr->fmr.fm_mr))
goto out_fmr_err; goto out_fmr_err;
INIT_LIST_HEAD(&mr->mr_list);
return 0; return 0;
out_fmr_err: out_fmr_err:
...@@ -102,10 +103,6 @@ fmr_op_release_mr(struct rpcrdma_mr *mr) ...@@ -102,10 +103,6 @@ fmr_op_release_mr(struct rpcrdma_mr *mr)
LIST_HEAD(unmap_list); LIST_HEAD(unmap_list);
int rc; int rc;
/* Ensure MW is not on any rl_registered list */
if (!list_empty(&mr->mr_list))
list_del(&mr->mr_list);
kfree(mr->fmr.fm_physaddrs); kfree(mr->fmr.fm_physaddrs);
kfree(mr->mr_sg); kfree(mr->mr_sg);
......
...@@ -110,6 +110,7 @@ frwr_op_init_mr(struct rpcrdma_ia *ia, struct rpcrdma_mr *mr) ...@@ -110,6 +110,7 @@ frwr_op_init_mr(struct rpcrdma_ia *ia, struct rpcrdma_mr *mr)
if (!mr->mr_sg) if (!mr->mr_sg)
goto out_list_err; goto out_list_err;
INIT_LIST_HEAD(&mr->mr_list);
sg_init_table(mr->mr_sg, depth); sg_init_table(mr->mr_sg, depth);
init_completion(&frwr->fr_linv_done); init_completion(&frwr->fr_linv_done);
return 0; return 0;
...@@ -133,10 +134,6 @@ frwr_op_release_mr(struct rpcrdma_mr *mr) ...@@ -133,10 +134,6 @@ frwr_op_release_mr(struct rpcrdma_mr *mr)
{ {
int rc; int rc;
/* Ensure MR is not on any rl_registered list */
if (!list_empty(&mr->mr_list))
list_del(&mr->mr_list);
rc = ib_dereg_mr(mr->frwr.fr_mr); rc = ib_dereg_mr(mr->frwr.fr_mr);
if (rc) if (rc)
pr_err("rpcrdma: final ib_dereg_mr for %p returned %i\n", pr_err("rpcrdma: final ib_dereg_mr for %p returned %i\n",
...@@ -195,7 +192,7 @@ frwr_op_recover_mr(struct rpcrdma_mr *mr) ...@@ -195,7 +192,7 @@ frwr_op_recover_mr(struct rpcrdma_mr *mr)
return; return;
out_release: out_release:
pr_err("rpcrdma: FRWR reset failed %d, %p release\n", rc, mr); pr_err("rpcrdma: FRWR reset failed %d, %p released\n", rc, mr);
r_xprt->rx_stats.mrs_orphaned++; r_xprt->rx_stats.mrs_orphaned++;
spin_lock(&r_xprt->rx_buf.rb_mrlock); spin_lock(&r_xprt->rx_buf.rb_mrlock);
...@@ -476,7 +473,7 @@ frwr_op_reminv(struct rpcrdma_rep *rep, struct list_head *mrs) ...@@ -476,7 +473,7 @@ frwr_op_reminv(struct rpcrdma_rep *rep, struct list_head *mrs)
list_for_each_entry(mr, mrs, mr_list) list_for_each_entry(mr, mrs, mr_list)
if (mr->mr_handle == rep->rr_inv_rkey) { if (mr->mr_handle == rep->rr_inv_rkey) {
list_del(&mr->mr_list); list_del_init(&mr->mr_list);
trace_xprtrdma_remoteinv(mr); trace_xprtrdma_remoteinv(mr);
mr->frwr.fr_state = FRWR_IS_INVALID; mr->frwr.fr_state = FRWR_IS_INVALID;
rpcrdma_mr_unmap_and_put(mr); rpcrdma_mr_unmap_and_put(mr);
......
...@@ -1254,6 +1254,11 @@ rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf) ...@@ -1254,6 +1254,11 @@ rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf)
list_del(&mr->mr_all); list_del(&mr->mr_all);
spin_unlock(&buf->rb_mrlock); spin_unlock(&buf->rb_mrlock);
/* Ensure MW is not on any rl_registered list */
if (!list_empty(&mr->mr_list))
list_del(&mr->mr_list);
ia->ri_ops->ro_release_mr(mr); ia->ri_ops->ro_release_mr(mr);
count++; count++;
spin_lock(&buf->rb_mrlock); spin_lock(&buf->rb_mrlock);
......
...@@ -380,7 +380,7 @@ rpcrdma_mr_pop(struct list_head *list) ...@@ -380,7 +380,7 @@ rpcrdma_mr_pop(struct list_head *list)
struct rpcrdma_mr *mr; struct rpcrdma_mr *mr;
mr = list_first_entry(list, struct rpcrdma_mr, mr_list); mr = list_first_entry(list, struct rpcrdma_mr, mr_list);
list_del(&mr->mr_list); list_del_init(&mr->mr_list);
return mr; return mr;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment