scsi: hisi_sas: Fix memory ordering in hisi_sas_task_deliver()
authorJohn Garry <john.garry@huawei.com>
Tue, 17 May 2022 08:04:21 +0000 (16:04 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:30:18 +0000 (10:30 +0200)
[ Upstream commit 6c6ac8b7773f05f93dc4e4044686e059d1f78dea ]

The memories for the slot should be observed to be written prior to
observing the slot as ready.

Prior to commit 26fc0ea74fcb ("scsi: libsas: Drop SAS_TASK_AT_INITIATOR"),
we had a spin_lock() + spin_unlock() immediately before marking the slot as
ready. The spin_unlock() - with release semantics - caused the slot memory
to be observed to be written.

Now that the spin_lock() + spin_unlock() is gone, use a smp_wmb().

Link: https://lore.kernel.org/r/1652774661-12935-1-git-send-email-john.garry@huawei.com
Fixes: 26fc0ea74fcb ("scsi: libsas: Drop SAS_TASK_AT_INITIATOR")
Reported-by: Yihang Li <liyihang6@hisilicon.com>
Tested-by: Yihang Li <liyihang6@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/hisi_sas/hisi_sas_main.c

index 86cbfab78dfec76b3312ce333e67e6e36fbb3970..849cc5fc86af65c13d5b4570e9872f80d985bbe5 100644 (file)
@@ -446,6 +446,8 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba,
                return;
        }
 
+       /* Make slot memories observable before marking as ready */
+       smp_wmb();
        WRITE_ONCE(slot->ready, 1);
 
        spin_lock(&dq->lock);