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
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
__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,
|
|||||||
__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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user