64 lines
1.9 KiB
Diff
64 lines
1.9 KiB
Diff
|
From 0a853a02d268ae7355e559043e4dea1a1b2be9a5 Mon Sep 17 00:00:00 2001
|
||
|
From: Liming Sun <limings@nvidia.com>
|
||
|
Date: Thu, 13 Apr 2023 08:32:24 -0400
|
||
|
Subject: [PATCH] UBUNTU: SAUCE: mlxbf-tmfifo: fix potential race
|
||
|
X-NVConfidentiality: public
|
||
|
|
||
|
BugLink: https://bugs.launchpad.net/bugs/2016039
|
||
|
|
||
|
The fix adds memory barrier for the 'is_ready' flag and the 'vq'
|
||
|
pointer in mlxbf_tmfifo_virtio_find_vqs() to avoid potential race
|
||
|
due to out-of-order memory write.
|
||
|
|
||
|
Signed-off-by: Liming Sun <limings@nvidia.com>
|
||
|
Acked-by: Bartlomiej Zolnierkiewicz <bartlomiej.zolnierkiewicz@canonical.com>
|
||
|
Acked-by: Tim Gardner <tim.gardner@canonical.com>
|
||
|
[bzolnier: this patch also contains a fix for mlxbf_tmfifo_create_vdev()
|
||
|
failure case]
|
||
|
Signed-off-by: Bartlomiej Zolnierkiewicz <bartlomiej.zolnierkiewicz@canonical.com>
|
||
|
---
|
||
|
drivers/platform/mellanox/mlxbf-tmfifo.c | 11 +++++++++--
|
||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
|
||
|
index 97956c9c9d4c..19d539fc99ae 100644
|
||
|
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
|
||
|
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
|
||
|
@@ -922,7 +922,7 @@ static void mlxbf_tmfifo_rxtx(struct mlxbf_tmfifo_vring *vring, bool is_rx)
|
||
|
fifo = vring->fifo;
|
||
|
|
||
|
/* Return if vdev is not ready. */
|
||
|
- if (!fifo->vdev[devid])
|
||
|
+ if (!fifo || !fifo->vdev[devid])
|
||
|
return;
|
||
|
|
||
|
/* Return if another vring is running. */
|
||
|
@@ -1119,9 +1119,13 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
+ vq->priv = vring;
|
||
|
+
|
||
|
+ /* Make vq update visible before using it. */
|
||
|
+ virtio_mb(false);
|
||
|
+
|
||
|
vqs[i] = vq;
|
||
|
vring->vq = vq;
|
||
|
- vq->priv = vring;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
@@ -1426,6 +1430,9 @@ static int mlxbf_tmfifo_probe(struct platform_device *pdev)
|
||
|
|
||
|
mod_timer(&fifo->timer, jiffies + MLXBF_TMFIFO_TIMER_INTERVAL);
|
||
|
|
||
|
+ /* Make all updates visible before the 'is_ready' flag. */
|
||
|
+ virtio_mb(false);
|
||
|
+
|
||
|
fifo->is_ready = 1;
|
||
|
return 0;
|
||
|
|
||
|
--
|
||
|
2.14.1
|
||
|
|