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

CIFS: SMBD: Do not call ib_dereg_mr on invalidated memory registration

It is not necessary to deregister a memory registration after it has been
successfully invalidated.
Signed-off-by: default avatarLong Li <longli@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 6d3adb23
...@@ -2295,8 +2295,12 @@ static void smbd_mr_recovery_work(struct work_struct *work) ...@@ -2295,8 +2295,12 @@ 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_INVALIDATED)
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);
...@@ -2320,25 +2324,21 @@ static void smbd_mr_recovery_work(struct work_struct *work) ...@@ -2320,25 +2324,21 @@ static void smbd_mr_recovery_work(struct work_struct *work)
smbd_disconnect_rdma_connection(info); smbd_disconnect_rdma_connection(info);
continue; continue;
} }
} else
/* This MR is being used, don't recover it */
continue;
if (smbdirect_mr->state == MR_INVALIDATED) smbdirect_mr->state = MR_READY;
ib_dma_unmap_sg(
info->id->device, smbdirect_mr->sgl,
smbdirect_mr->sgl_count,
smbdirect_mr->dir);
smbdirect_mr->state = MR_READY;
/* smbdirect_mr->state is updated by this function /* smbdirect_mr->state is updated by this function
* and is read and updated by I/O issuing CPUs trying * and is read and updated by I/O issuing CPUs trying
* to get a MR, the call to atomic_inc_return * to get a MR, the call to atomic_inc_return
* implicates a memory barrier and guarantees this * implicates a memory barrier and guarantees this
* value is updated before waking up any calls to * value is updated before waking up any calls to
* get_mr() from the I/O issuing CPUs * get_mr() from the I/O issuing CPUs
*/ */
if (atomic_inc_return(&info->mr_ready_count) == 1) if (atomic_inc_return(&info->mr_ready_count) == 1)
wake_up_interruptible(&info->wait_mr); wake_up_interruptible(&info->wait_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