Skip to content

Commit 2ffc871

Browse files
chuckleveramschuma-ntap
authored andcommitted
xprtrdma: Release orphaned MRs immediately
Instead of leaving orphaned MRs to be released when the transport is destroyed, release them immediately. The MR free list can now be replenished if it becomes exhausted. Signed-off-by: Chuck Lever <[email protected]> Tested-by: Steve Wise <[email protected]> Signed-off-by: Anna Schumaker <[email protected]>
1 parent e2ac236 commit 2ffc871

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

net/sunrpc/xprtrdma/fmr_ops.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,22 @@ fmr_op_recover_mr(struct rpcrdma_mw *mw)
134134
/* ORDER: then DMA unmap */
135135
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
136136
mw->mw_sg, mw->mw_nents, mw->mw_dir);
137-
if (rc) {
138-
pr_err("rpcrdma: FMR reset status %d, %p orphaned\n",
139-
rc, mw);
140-
r_xprt->rx_stats.mrs_orphaned++;
141-
return;
142-
}
137+
if (rc)
138+
goto out_release;
143139

144140
rpcrdma_put_mw(r_xprt, mw);
145141
r_xprt->rx_stats.mrs_recovered++;
142+
return;
143+
144+
out_release:
145+
pr_err("rpcrdma: FMR reset failed (%d), %p released\n", rc, mw);
146+
r_xprt->rx_stats.mrs_orphaned++;
147+
148+
spin_lock(&r_xprt->rx_buf.rb_mwlock);
149+
list_del(&mw->mw_all);
150+
spin_unlock(&r_xprt->rx_buf.rb_mwlock);
151+
152+
fmr_op_release_mr(mw);
146153
}
147154

148155
static int

net/sunrpc/xprtrdma/frwr_ops.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,22 @@ frwr_op_recover_mr(struct rpcrdma_mw *mw)
177177

178178
rc = __frwr_reset_mr(ia, mw);
179179
ib_dma_unmap_sg(ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir);
180-
if (rc) {
181-
pr_err("rpcrdma: FRMR reset status %d, %p orphaned\n",
182-
rc, mw);
183-
r_xprt->rx_stats.mrs_orphaned++;
184-
return;
185-
}
180+
if (rc)
181+
goto out_release;
186182

187183
rpcrdma_put_mw(r_xprt, mw);
188184
r_xprt->rx_stats.mrs_recovered++;
185+
return;
186+
187+
out_release:
188+
pr_err("rpcrdma: FRMR reset failed %d, %p release\n", rc, mw);
189+
r_xprt->rx_stats.mrs_orphaned++;
190+
191+
spin_lock(&r_xprt->rx_buf.rb_mwlock);
192+
list_del(&mw->mw_all);
193+
spin_unlock(&r_xprt->rx_buf.rb_mwlock);
194+
195+
frwr_op_release_mr(mw);
189196
}
190197

191198
static int

0 commit comments

Comments
 (0)