FAILED: patch "[PATCH] cifs: smbd: Only queue work for error recovery on memory" failed to apply to 4.19-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c21ce58eab1eda4c66507897207e20c82e62a5ac Mon Sep 17 00:00:00 2001
From: Long Li <[email protected]>
Date: Wed, 16 Oct 2019 13:51:55 -0700
Subject: [PATCH] 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.
fs/cifs/smbdirect.c +15 -11
@@ -2271,12 +2271,7 @@ static void smbd_mr_recovery_work(struct work_struct *work)int rc;list_for_each_entry (smbdirect_mr, &info->mr_list, list) { -if (smbdirect_mr->state ==MR_INVALIDATED ) -ib_dma_unmap_sg ( - info->id->device, smbdirect_mr->sgl, - smbdirect_mr->sgl_count, - smbdirect_mr->dir); -else if (smbdirect_mr->state ==MR_ERROR ) { +if (smbdirect_mr->state ==MR_ERROR ) {/* recover this MR entry */ rc =ib_dereg_mr (smbdirect_mr->mr);
@@ -2604,11 +2599,20 @@ int smbd_deregister_mr(struct smbd_mr *smbdirect_mr)*/ smbdirect_mr->state =MR_INVALIDATED ; -/* -* Schedule the work to do MR recovery for future I/Os -* MR recovery is slow and we don't want it to block the current I/O -*/ -queue_work (info->workqueue, &info->mr_recovery_work); +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 MR +* recovery is slow and don't want it to block current I/O +*/ +queue_work (info->workqueue, &info->mr_recovery_work); done:if (atomic_dec_and_test (&info->mr_used_count))