Searched hist:c1102e9d49eb36c0be18cb3e16f6e46ffb717964 (Results 1 – 2 of 2) sorted by relevance
/openbmc/linux/net/8021q/ |
H A D | vlan.h | diff c1102e9d49eb36c0be18cb3e16f6e46ffb717964 Mon Apr 19 08:56:41 CDT 2021 Di Zhu <zhudi21@huawei.com> net: fix a data race when get vlan device
We encountered a crash: in the packet receiving process, we got an illegal VLAN device address, but the VLAN device address saved in vmcore is correct. After checking the code, we found a possible data competition: CPU 0: CPU 1: (RCU read lock) (RTNL lock) vlan_do_receive() register_vlan_dev() vlan_find_dev()
->__vlan_group_get_device() ->vlan_group_prealloc_vid()
In vlan_group_prealloc_vid(), We need to make sure that memset() in kzalloc() is executed before assigning value to vlan devices array: ================================= kzalloc() ->memset(object, 0, size)
smp_wmb()
vg->vlan_devices_arrays[pidx][vidx] = array; ==================================
Because __vlan_group_get_device() function depends on this order. otherwise we may get a wrong address from the hardware cache on another cpu.
So fix it by adding memory barrier instruction to ensure the order of memory operations.
Signed-off-by: Di Zhu <zhudi21@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
|
H A D | vlan.c | diff c1102e9d49eb36c0be18cb3e16f6e46ffb717964 Mon Apr 19 08:56:41 CDT 2021 Di Zhu <zhudi21@huawei.com> net: fix a data race when get vlan device
We encountered a crash: in the packet receiving process, we got an illegal VLAN device address, but the VLAN device address saved in vmcore is correct. After checking the code, we found a possible data competition: CPU 0: CPU 1: (RCU read lock) (RTNL lock) vlan_do_receive() register_vlan_dev() vlan_find_dev()
->__vlan_group_get_device() ->vlan_group_prealloc_vid()
In vlan_group_prealloc_vid(), We need to make sure that memset() in kzalloc() is executed before assigning value to vlan devices array: ================================= kzalloc() ->memset(object, 0, size)
smp_wmb()
vg->vlan_devices_arrays[pidx][vidx] = array; ==================================
Because __vlan_group_get_device() function depends on this order. otherwise we may get a wrong address from the hardware cache on another cpu.
So fix it by adding memory barrier instruction to ensure the order of memory operations.
Signed-off-by: Di Zhu <zhudi21@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
|