summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinjie Ruan <ruanjinjie@huawei.com>2026-09-02 15:33:34 +0800
committerJakub Kicinski <kuba@kernel.org>2026-09-05 12:43:35 -0700
commitd199b0d0bb01118f84ca8bccc5419097d67cd18b (patch)
treee9f2fc095f14a43d6e3d3e75238ad68f36e8dcfb
parent2e9ff7bb668b6f62f4789718f70fd1ec2eb87c12 (diff)
downloadlinux-next-d199b0d0bb01118f84ca8bccc5419097d67cd18b.tar.gz
linux-next-d199b0d0bb01118f84ca8bccc5419097d67cd18b.zip
8021q: publish vlan_devices_arrays entries with acquire/release
Replace the smp_wmb()/smp_rmb() barrier pair with smp_store_release()/smp_load_acquire() on vg->vlan_devices_arrays[pidx][vidx]. vlan_group_prealloc_vid() publishes the array pointer via release; __vlan_group_get_device() acquires it before accessing the array, ensuring the allocated entries are visible. Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--net/8021q/vlan.c6
-rw-r--r--net/8021q/vlan.h8
2 files changed, 5 insertions, 9 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 6df80cad40a2..ec9a7cc8afc7 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -70,10 +70,8 @@ static int vlan_group_prealloc_vid(struct vlan_group *vg,
if (array == NULL)
return -ENOBUFS;
- /* paired with smp_rmb() in __vlan_group_get_device() */
- smp_wmb();
-
- vg->vlan_devices_arrays[pidx][vidx] = array;
+ /* paired with smp_load_acquire() in __vlan_group_get_device() */
+ smp_store_release(&vg->vlan_devices_arrays[pidx][vidx], array);
return 0;
}
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h
index 3cb4c8294130..d874ab323d32 100644
--- a/net/8021q/vlan.h
+++ b/net/8021q/vlan.h
@@ -56,11 +56,9 @@ static inline struct net_device *__vlan_group_get_device(struct vlan_group *vg,
{
struct net_device __rcu **array;
- array = vg->vlan_devices_arrays[pidx]
- [vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
-
- /* paired with smp_wmb() in vlan_group_prealloc_vid() */
- smp_rmb();
+ /* Pairs with smp_store_release() in vlan_group_prealloc_vid() */
+ array = smp_load_acquire(&vg->vlan_devices_arrays[pidx]
+ [vlan_id / VLAN_GROUP_ARRAY_PART_LEN]);
return array ? rcu_dereference_raw(array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN]) : NULL;
}