net: hns3: use appropriate barrier function after setting a bit value
[ 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:ff200099d2
("net: hns3: remove unnecessary work in hclgevf_main") Fixes:1c6dfe6fc6
("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>
This commit is contained in:
parent
674c951ab8
commit
3284447d66
@ -7005,8 +7005,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);
|
||||
}
|
||||
}
|
||||
|
@ -2583,8 +2583,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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user