Commit 6e3631c5 authored by Peiyang Wang's avatar Peiyang Wang Committed by chenyi
Browse files

net: hns3: use appropriate barrier function after setting a bit value

mainline inclusion
from mainline-v6.9-rc4
commit 094c281228529d333458208fd02fcac3b139d93b
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9QYBA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=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: ff200099 ("net: hns3: remove unnecessary work in hclgevf_main")
Fixes: 1c6dfe6f ("net: hns3: remove mailbox and reset work in hclge_main")
Signed-off-by: default avatarPeiyang Wang <wangpeiyang1@huawei.com>
Signed-off-by: default avatarJijie Shao <shaojijie@huawei.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarchenyi <chenyi211@huawei.com>
parent a6f262bd
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -8561,8 +8561,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);
	}
}
+1 −2
Original line number Diff line number Diff line
@@ -2348,8 +2348,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);
	}
}