]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: hns3: use appropriate barrier function after setting a bit value
authorPeiyang Wang <wangpeiyang1@huawei.com>
Tue, 7 May 2024 13:42:22 +0000 (21:42 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2024 10:14:56 +0000 (12:14 +0200)
[ Upstream commit 094c281228529d333458208fd02fcac3b139d93b ]

There is a memory barrier in followed case. When set the port down,
hclgevf_set_timmer will set DOWN in state. Meanwhile, the service task has
different behaviour based on whether the state is DOWN. Thus, to make sure
service task see DOWN, use smp_mb__after_atomic after calling set_bit().

          CPU0                        CPU1
========================== ===================================
hclgevf_set_timer_task()    hclgevf_periodic_service_task()
  set_bit(DOWN,state)         test_bit(DOWN,state)

pf also has this issue.

Fixes: ff200099d271 ("net: hns3: remove unnecessary work in hclgevf_main")
Fixes: 1c6dfe6fc6f7 ("net: hns3: remove mailbox and reset work in hclge_main")
Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com>
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index a5e63655fd88dfe52a9b5804cdcf57ea78b2a251..a99e42005b9b8f6be1bbafa2b164a8739f550136 100644 (file)
@@ -7944,8 +7944,7 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable)
                /* Set the DOWN flag here to disable link updating */
                set_bit(HCLGE_STATE_DOWN, &hdev->state);
 
-               /* flush memory to make sure DOWN is seen by service task */
-               smp_mb__before_atomic();
+               smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */
                hclge_flush_link_update(hdev);
        }
 }
index b57111252d07106a739ebaff98874f75ef48637b..08db8e84be4ed2b96d068c9965d79bed682b02c5 100644 (file)
@@ -2181,8 +2181,7 @@ static void hclgevf_set_timer_task(struct hnae3_handle *handle, bool enable)
        } else {
                set_bit(HCLGEVF_STATE_DOWN, &hdev->state);
 
-               /* flush memory to make sure DOWN is seen by service task */
-               smp_mb__before_atomic();
+               smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */
                hclgevf_flush_link_update(hdev);
        }
 }