net: mana: Add rmb after checking owner bits
authorHaiyang Zhang <haiyangz@microsoft.com>
Sun, 11 Sep 2022 20:40:05 +0000 (13:40 -0700)
committerJakub Kicinski <kuba@kernel.org>
Mon, 19 Sep 2022 23:23:19 +0000 (16:23 -0700)
Per GDMA spec, rmb is necessary after checking owner_bits, before
reading EQ or CQ entries.

Add rmb in these two places to comply with the specs.

Cc: stable@vger.kernel.org
Fixes: ca9c54d2d6a5 ("net: mana: Add a driver for Microsoft Azure Network Adapter (MANA)")
Reported-by: Sinan Kaya <Sinan.Kaya@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
Link: https://lore.kernel.org/r/1662928805-15861-1-git-send-email-haiyangz@microsoft.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microsoft/mana/gdma_main.c

index 5f924018235174ffd7f21488dc21146da3b97715..e10b9f8f89e1e5ff0ce8b40d2ac50370e48a3026 100644 (file)
@@ -397,6 +397,11 @@ static void mana_gd_process_eq_events(void *arg)
                        break;
                }
 
+               /* Per GDMA spec, rmb is necessary after checking owner_bits, before
+                * reading eqe.
+                */
+               rmb();
+
                mana_gd_process_eqe(eq);
 
                eq->head++;
@@ -1134,6 +1139,11 @@ static int mana_gd_read_cqe(struct gdma_queue *cq, struct gdma_comp *comp)
        if (WARN_ON_ONCE(owner_bits != new_bits))
                return -1;
 
+       /* Per GDMA spec, rmb is necessary after checking owner_bits, before
+        * reading completion info
+        */
+       rmb();
+
        comp->wq_num = cqe->cqe_info.wq_num;
        comp->is_sq = cqe->cqe_info.is_sq;
        memcpy(comp->cqe_data, cqe->cqe_data, GDMA_COMP_DATA_SIZE);