Commit 83d686a
bonding: 3ad: Fix the conflict between bond_update_slave_arr and the state machine
The bond works in mode 4, and performs down/up operations on the bond
that is normally negotiated. The probability of bond-> slave_arr is NULL
Test commands:
ifconfig bond1 down
ifconfig bond1 up
The conflict occurs in the following process:
__dev_open (CPU A)
--bond_open
--queue_delayed_work(bond->wq,&bond->ad_work,0);
--bond_update_slave_arr
--bond_3ad_get_active_agg_info
ad_work(CPU B)
--bond_3ad_state_machine_handler
--ad_agg_selection_logic
ad_work runs on cpu B. In the function ad_agg_selection_logic, all
agg->is_active will be cleared. Before the new active aggregator is
selected on CPU B, bond_3ad_get_active_agg_info failed on CPU A,
bond->slave_arr will be set to NULL. The best aggregator in
ad_agg_selection_logic has not changed, no need to update slave arr.
The conflict occurred in that ad_agg_selection_logic clears
agg->is_active under mode_lock, but bond_open -> bond_update_slave_arr
is inspecting agg->is_active outside the lock.
Also, bond_update_slave_arr is normal for potential sleep when
allocating memory, so replace the WARN_ON with a call to might_sleep.
Signed-off-by: jinyiting <jinyiting@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>1 parent 47a017f commit 83d686a
1 file changed
+4
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4391 | 4391 | | |
4392 | 4392 | | |
4393 | 4393 | | |
4394 | | - | |
4395 | | - | |
4396 | | - | |
| 4394 | + | |
4397 | 4395 | | |
4398 | 4396 | | |
4399 | 4397 | | |
| |||
4406 | 4404 | | |
4407 | 4405 | | |
4408 | 4406 | | |
| 4407 | + | |
4409 | 4408 | | |
| 4409 | + | |
4410 | 4410 | | |
4411 | 4411 | | |
4412 | 4412 | | |
4413 | 4413 | | |
4414 | 4414 | | |
4415 | 4415 | | |
4416 | 4416 | | |
| 4417 | + | |
4417 | 4418 | | |
4418 | 4419 | | |
4419 | 4420 | | |
| |||
0 commit comments