Commit c21ce58e authored by Long Li's avatar Long Li Committed by Steve French

cifs: smbd: Only queue work for error recovery on memory registration

It's not necessary to queue invalidated memory registration to work queue, as
all we need to do is to unmap the SG and make it usable again. This can save
CPU cycles in normal data paths as memory registration errors are rare and
normally only happens during reconnection.
Signed-off-by: default avatarLong Li <longli@microsoft.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 87bc2376
...@@ -2271,12 +2271,7 @@ static void smbd_mr_recovery_work(struct work_struct *work) ...@@ -2271,12 +2271,7 @@ static void smbd_mr_recovery_work(struct work_struct *work)
int rc; int rc;
list_for_each_entry(smbdirect_mr, &info->mr_list, list) { list_for_each_entry(smbdirect_mr, &info->mr_list, list) {
if (smbdirect_mr->state == MR_INVALIDATED) if (smbdirect_mr->state == MR_ERROR) {
ib_dma_unmap_sg(
info->id->device, smbdirect_mr->sgl,
smbdirect_mr->sgl_count,
smbdirect_mr->dir);
else if (smbdirect_mr->state == MR_ERROR) {
/* recover this MR entry */ /* recover this MR entry */
rc = ib_dereg_mr(smbdirect_mr->mr); rc = ib_dereg_mr(smbdirect_mr->mr);
...@@ -2604,9 +2599,18 @@ int smbd_deregister_mr(struct smbd_mr *smbdirect_mr) ...@@ -2604,9 +2599,18 @@ int smbd_deregister_mr(struct smbd_mr *smbdirect_mr)
*/ */
smbdirect_mr->state = MR_INVALIDATED; smbdirect_mr->state = MR_INVALIDATED;
if (smbdirect_mr->state == MR_INVALIDATED) {
ib_dma_unmap_sg(
info->id->device, smbdirect_mr->sgl,
smbdirect_mr->sgl_count,
smbdirect_mr->dir);
smbdirect_mr->state = MR_READY;
if (atomic_inc_return(&info->mr_ready_count) == 1)
wake_up_interruptible(&info->wait_mr);
} else
/* /*
* Schedule the work to do MR recovery for future I/Os * Schedule the work to do MR recovery for future I/Os MR
* MR recovery is slow and we don't want it to block the current I/O * recovery is slow and don't want it to block current I/O
*/ */
queue_work(info->workqueue, &info->mr_recovery_work); queue_work(info->workqueue, &info->mr_recovery_work);
......
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