diff options
| author | Jinjie Ruan <ruanjinjie@huawei.com> | 2026-09-02 15:33:34 +0800 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-09-05 12:43:35 -0700 |
| commit | d199b0d0bb01118f84ca8bccc5419097d67cd18b (patch) | |
| tree | e9f2fc095f14a43d6e3d3e75238ad68f36e8dcfb | |
| parent | 2e9ff7bb668b6f62f4789718f70fd1ec2eb87c12 (diff) | |
| download | linux-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.c | 6 | ||||
| -rw-r--r-- | net/8021q/vlan.h | 8 |
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; } |
