Skip to content

Commit 653cd28

Browse files
w1ldptrdavem330
authored andcommitted
net: sched: always disable bh when taking tcf_lock
Recently, ops->init() and ops->dump() of all actions were modified to always obtain tcf_lock when accessing private action state. Actions that don't depend on tcf_lock for synchronization with their data path use non-bh locking API. However, tcf_lock is also used to protect rate estimator stats in softirq context by timer callback. Change ops->init() and ops->dump() of all actions to disable bh when using tcf_lock to prevent deadlock reported by following lockdep warning: [ 105.470398] ================================ [ 105.475014] WARNING: inconsistent lock state [ 105.479628] 4.18.0-rc8+ torvalds#664 Not tainted [ 105.483897] -------------------------------- [ 105.488511] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage. [ 105.494871] swapper/16/0 [HC0[0]:SC1[1]:HE1:SE0] takes: [ 105.500449] 00000000f86c012e (&(&p->tcfa_lock)->rlock){+.?.}, at: est_fetch_counters+0x3c/0xa0 [ 105.509696] {SOFTIRQ-ON-W} state was registered at: [ 105.514925] _raw_spin_lock+0x2c/0x40 [ 105.519022] tcf_bpf_init+0x579/0x820 [act_bpf] [ 105.523990] tcf_action_init_1+0x4e4/0x660 [ 105.528518] tcf_action_init+0x1ce/0x2d0 [ 105.532880] tcf_exts_validate+0x1d8/0x200 [ 105.537416] fl_change+0x55a/0x268b [cls_flower] [ 105.542469] tc_new_tfilter+0x748/0xa20 [ 105.546738] rtnetlink_rcv_msg+0x56a/0x6d0 [ 105.551268] netlink_rcv_skb+0x18d/0x200 [ 105.555628] netlink_unicast+0x2d0/0x370 [ 105.559990] netlink_sendmsg+0x3b9/0x6a0 [ 105.564349] sock_sendmsg+0x6b/0x80 [ 105.568271] ___sys_sendmsg+0x4a1/0x520 [ 105.572547] __sys_sendmsg+0xd7/0x150 [ 105.576655] do_syscall_64+0x72/0x2c0 [ 105.580757] entry_SYSCALL_64_after_hwframe+0x49/0xbe [ 105.586243] irq event stamp: 489296 [ 105.590084] hardirqs last enabled at (489296): [<ffffffffb507e639>] _raw_spin_unlock_irq+0x29/0x40 [ 105.599765] hardirqs last disabled at (489295): [<ffffffffb507e745>] _raw_spin_lock_irq+0x15/0x50 [ 105.609277] softirqs last enabled at (489292): [<ffffffffb413a6a3>] irq_enter+0x83/0xa0 [ 105.618001] softirqs last disabled at (489293): [<ffffffffb413a800>] irq_exit+0x140/0x190 [ 105.626813] other info that might help us debug this: [ 105.633976] Possible unsafe locking scenario: [ 105.640526] CPU0 [ 105.643325] ---- [ 105.646125] lock(&(&p->tcfa_lock)->rlock); [ 105.650747] <Interrupt> [ 105.653717] lock(&(&p->tcfa_lock)->rlock); [ 105.658514] *** DEADLOCK *** [ 105.665349] 1 lock held by swapper/16/0: [ 105.669629] #0: 00000000a640ad99 ((&est->timer)){+.-.}, at: call_timer_fn+0x10b/0x550 [ 105.678200] stack backtrace: [ 105.683194] CPU: 16 PID: 0 Comm: swapper/16 Not tainted 4.18.0-rc8+ torvalds#664 [ 105.690249] Hardware name: Supermicro SYS-2028TP-DECR/X10DRT-P, BIOS 2.0b 03/30/2017 [ 105.698626] Call Trace: [ 105.701421] <IRQ> [ 105.703791] dump_stack+0x92/0xeb [ 105.707461] print_usage_bug+0x336/0x34c [ 105.711744] mark_lock+0x7c9/0x980 [ 105.715500] ? print_shortest_lock_dependencies+0x2e0/0x2e0 [ 105.721424] ? check_usage_forwards+0x230/0x230 [ 105.726315] __lock_acquire+0x923/0x26f0 [ 105.730597] ? debug_show_all_locks+0x240/0x240 [ 105.735478] ? mark_lock+0x493/0x980 [ 105.739412] ? check_chain_key+0x140/0x1f0 [ 105.743861] ? __lock_acquire+0x836/0x26f0 [ 105.748323] ? lock_acquire+0x12e/0x290 [ 105.752516] lock_acquire+0x12e/0x290 [ 105.756539] ? est_fetch_counters+0x3c/0xa0 [ 105.761084] _raw_spin_lock+0x2c/0x40 [ 105.765099] ? est_fetch_counters+0x3c/0xa0 [ 105.769633] est_fetch_counters+0x3c/0xa0 [ 105.773995] est_timer+0x87/0x390 [ 105.777670] ? est_fetch_counters+0xa0/0xa0 [ 105.782210] ? lock_acquire+0x12e/0x290 [ 105.786410] call_timer_fn+0x161/0x550 [ 105.790512] ? est_fetch_counters+0xa0/0xa0 [ 105.795055] ? del_timer_sync+0xd0/0xd0 [ 105.799249] ? __lock_is_held+0x93/0x110 [ 105.803531] ? mark_held_locks+0x20/0xe0 [ 105.807813] ? _raw_spin_unlock_irq+0x29/0x40 [ 105.812525] ? est_fetch_counters+0xa0/0xa0 [ 105.817069] ? est_fetch_counters+0xa0/0xa0 [ 105.821610] run_timer_softirq+0x3c4/0x9f0 [ 105.826064] ? lock_acquire+0x12e/0x290 [ 105.830257] ? __bpf_trace_timer_class+0x10/0x10 [ 105.835237] ? __lock_is_held+0x25/0x110 [ 105.839517] __do_softirq+0x11d/0x7bf [ 105.843542] irq_exit+0x140/0x190 [ 105.847208] smp_apic_timer_interrupt+0xac/0x3b0 [ 105.852182] apic_timer_interrupt+0xf/0x20 [ 105.856628] </IRQ> [ 105.859081] RIP: 0010:cpuidle_enter_state+0xd8/0x4d0 [ 105.864395] Code: 46 ff 48 89 44 24 08 0f 1f 44 00 00 31 ff e8 cf ec 46 ff 80 7c 24 07 00 0f 85 1d 02 00 00 e8 9f 90 4b ff fb 66 0f 1f 44 00 00 <4c> 8b 6c 24 08 4d 29 fd 0f 80 36 03 00 00 4c 89 e8 48 ba cf f7 53 [ 105.884288] RSP: 0018:ffff8803ad94fd20 EFLAGS: 00000246 ORIG_RAX: ffffffffffffff13 [ 105.892494] RAX: 0000000000000000 RBX: ffffe8fb300829c0 RCX: ffffffffb41e19e1 [ 105.899988] RDX: 0000000000000007 RSI: dffffc0000000000 RDI: ffff8803ad9358ac [ 105.907503] RBP: ffffffffb6636300 R08: 0000000000000004 R09: 0000000000000000 [ 105.914997] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000004 [ 105.922487] R13: ffffffffb6636140 R14: ffffffffb66362d8 R15: 000000188d36091b [ 105.929988] ? trace_hardirqs_on_caller+0x141/0x2d0 [ 105.935232] do_idle+0x28e/0x320 [ 105.938817] ? arch_cpu_idle_exit+0x40/0x40 [ 105.943361] ? mark_lock+0x8c1/0x980 [ 105.947295] ? _raw_spin_unlock_irqrestore+0x32/0x60 [ 105.952619] cpu_startup_entry+0xc2/0xd0 [ 105.956900] ? cpu_in_idle+0x20/0x20 [ 105.960830] ? _raw_spin_unlock_irqrestore+0x32/0x60 [ 105.966146] ? trace_hardirqs_on_caller+0x141/0x2d0 [ 105.971391] start_secondary+0x2b5/0x360 [ 105.975669] ? set_cpu_sibling_map+0x1330/0x1330 [ 105.980654] secondary_startup_64+0xa5/0xb0 Taking tcf_lock in sample action with bh disabled causes lockdep to issue a warning regarding possible irq lock inversion dependency between tcf_lock, and psample_groups_lock that is taken when holding tcf_lock in sample init: [ 162.108959] Possible interrupt unsafe locking scenario: [ 162.116386] CPU0 CPU1 [ 162.121277] ---- ---- [ 162.126162] lock(psample_groups_lock); [ 162.130447] local_irq_disable(); [ 162.136772] lock(&(&p->tcfa_lock)->rlock); [ 162.143957] lock(psample_groups_lock); [ 162.150813] <Interrupt> [ 162.153808] lock(&(&p->tcfa_lock)->rlock); [ 162.158608] *** DEADLOCK *** In order to prevent potential lock inversion dependency between tcf_lock and psample_groups_lock, extract call to psample_group_get() from tcf_lock protected section in sample action init function. Fixes: 4e23281 ("net: sched: act_mirred: remove dependency on rtnl lock") Fixes: 764e9a2 ("net: sched: act_vlan: remove dependency on rtnl lock") Fixes: 729e012 ("net: sched: act_tunnel_key: remove dependency on rtnl lock") Fixes: d772849 ("net: sched: act_sample: remove dependency on rtnl lock") Fixes: e8917f4 ("net: sched: act_gact: remove dependency on rtnl lock") Fixes: b6a2b97 ("net: sched: act_csum: remove dependency on rtnl lock") Fixes: 2142236 ("net: sched: act_bpf: remove dependency on rtnl lock") Signed-off-by: Vlad Buslov <vladbu@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent bb10745 commit 653cd28

File tree

7 files changed

+47
-44
lines changed

7 files changed

+47
-44
lines changed

net/sched/act_bpf.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ static int tcf_bpf_dump(struct sk_buff *skb, struct tc_action *act,
147147
struct tcf_t tm;
148148
int ret;
149149

150-
spin_lock(&prog->tcf_lock);
150+
spin_lock_bh(&prog->tcf_lock);
151151
opt.action = prog->tcf_action;
152152
if (nla_put(skb, TCA_ACT_BPF_PARMS, sizeof(opt), &opt))
153153
goto nla_put_failure;
@@ -164,11 +164,11 @@ static int tcf_bpf_dump(struct sk_buff *skb, struct tc_action *act,
164164
TCA_ACT_BPF_PAD))
165165
goto nla_put_failure;
166166

167-
spin_unlock(&prog->tcf_lock);
167+
spin_unlock_bh(&prog->tcf_lock);
168168
return skb->len;
169169

170170
nla_put_failure:
171-
spin_unlock(&prog->tcf_lock);
171+
spin_unlock_bh(&prog->tcf_lock);
172172
nlmsg_trim(skb, tp);
173173
return -1;
174174
}
@@ -340,7 +340,7 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla,
340340

341341
prog = to_bpf(*act);
342342

343-
spin_lock(&prog->tcf_lock);
343+
spin_lock_bh(&prog->tcf_lock);
344344
if (res != ACT_P_CREATED)
345345
tcf_bpf_prog_fill_cfg(prog, &old);
346346

@@ -352,7 +352,7 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla,
352352

353353
prog->tcf_action = parm->action;
354354
rcu_assign_pointer(prog->filter, cfg.filter);
355-
spin_unlock(&prog->tcf_lock);
355+
spin_unlock_bh(&prog->tcf_lock);
356356

357357
if (res == ACT_P_CREATED) {
358358
tcf_idr_insert(tn, *act);

net/sched/act_csum.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla,
9696
}
9797
params_new->update_flags = parm->update_flags;
9898

99-
spin_lock(&p->tcf_lock);
99+
spin_lock_bh(&p->tcf_lock);
100100
p->tcf_action = parm->action;
101101
rcu_swap_protected(p->params, params_new,
102102
lockdep_is_held(&p->tcf_lock));
103-
spin_unlock(&p->tcf_lock);
103+
spin_unlock_bh(&p->tcf_lock);
104104

105105
if (params_new)
106106
kfree_rcu(params_new, rcu);
@@ -604,7 +604,7 @@ static int tcf_csum_dump(struct sk_buff *skb, struct tc_action *a, int bind,
604604
};
605605
struct tcf_t t;
606606

607-
spin_lock(&p->tcf_lock);
607+
spin_lock_bh(&p->tcf_lock);
608608
params = rcu_dereference_protected(p->params,
609609
lockdep_is_held(&p->tcf_lock));
610610
opt.action = p->tcf_action;
@@ -616,12 +616,12 @@ static int tcf_csum_dump(struct sk_buff *skb, struct tc_action *a, int bind,
616616
tcf_tm_dump(&t, &p->tcf_tm);
617617
if (nla_put_64bit(skb, TCA_CSUM_TM, sizeof(t), &t, TCA_CSUM_PAD))
618618
goto nla_put_failure;
619-
spin_unlock(&p->tcf_lock);
619+
spin_unlock_bh(&p->tcf_lock);
620620

621621
return skb->len;
622622

623623
nla_put_failure:
624-
spin_unlock(&p->tcf_lock);
624+
spin_unlock_bh(&p->tcf_lock);
625625
nlmsg_trim(skb, b);
626626
return -1;
627627
}

net/sched/act_gact.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla,
113113

114114
gact = to_gact(*a);
115115

116-
spin_lock(&gact->tcf_lock);
116+
spin_lock_bh(&gact->tcf_lock);
117117
gact->tcf_action = parm->action;
118118
#ifdef CONFIG_GACT_PROB
119119
if (p_parm) {
@@ -126,7 +126,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla,
126126
gact->tcfg_ptype = p_parm->ptype;
127127
}
128128
#endif
129-
spin_unlock(&gact->tcf_lock);
129+
spin_unlock_bh(&gact->tcf_lock);
130130

131131
if (ret == ACT_P_CREATED)
132132
tcf_idr_insert(tn, *a);
@@ -183,7 +183,7 @@ static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a,
183183
};
184184
struct tcf_t t;
185185

186-
spin_lock(&gact->tcf_lock);
186+
spin_lock_bh(&gact->tcf_lock);
187187
opt.action = gact->tcf_action;
188188
if (nla_put(skb, TCA_GACT_PARMS, sizeof(opt), &opt))
189189
goto nla_put_failure;
@@ -202,12 +202,12 @@ static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a,
202202
tcf_tm_dump(&t, &gact->tcf_tm);
203203
if (nla_put_64bit(skb, TCA_GACT_TM, sizeof(t), &t, TCA_GACT_PAD))
204204
goto nla_put_failure;
205-
spin_unlock(&gact->tcf_lock);
205+
spin_unlock_bh(&gact->tcf_lock);
206206

207207
return skb->len;
208208

209209
nla_put_failure:
210-
spin_unlock(&gact->tcf_lock);
210+
spin_unlock_bh(&gact->tcf_lock);
211211
nlmsg_trim(skb, b);
212212
return -1;
213213
}

net/sched/act_mirred.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,14 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
159159
}
160160
m = to_mirred(*a);
161161

162-
spin_lock(&m->tcf_lock);
162+
spin_lock_bh(&m->tcf_lock);
163163
m->tcf_action = parm->action;
164164
m->tcfm_eaction = parm->eaction;
165165

166166
if (parm->ifindex) {
167167
dev = dev_get_by_index(net, parm->ifindex);
168168
if (!dev) {
169-
spin_unlock(&m->tcf_lock);
169+
spin_unlock_bh(&m->tcf_lock);
170170
tcf_idr_release(*a, bind);
171171
return -ENODEV;
172172
}
@@ -177,7 +177,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
177177
dev_put(dev);
178178
m->tcfm_mac_header_xmit = mac_header_xmit;
179179
}
180-
spin_unlock(&m->tcf_lock);
180+
spin_unlock_bh(&m->tcf_lock);
181181

182182
if (ret == ACT_P_CREATED) {
183183
spin_lock(&mirred_list_lock);
@@ -305,7 +305,7 @@ static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a, int bind,
305305
struct net_device *dev;
306306
struct tcf_t t;
307307

308-
spin_lock(&m->tcf_lock);
308+
spin_lock_bh(&m->tcf_lock);
309309
opt.action = m->tcf_action;
310310
opt.eaction = m->tcfm_eaction;
311311
dev = tcf_mirred_dev_dereference(m);
@@ -318,12 +318,12 @@ static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a, int bind,
318318
tcf_tm_dump(&t, &m->tcf_tm);
319319
if (nla_put_64bit(skb, TCA_MIRRED_TM, sizeof(t), &t, TCA_MIRRED_PAD))
320320
goto nla_put_failure;
321-
spin_unlock(&m->tcf_lock);
321+
spin_unlock_bh(&m->tcf_lock);
322322

323323
return skb->len;
324324

325325
nla_put_failure:
326-
spin_unlock(&m->tcf_lock);
326+
spin_unlock_bh(&m->tcf_lock);
327327
nlmsg_trim(skb, b);
328328
return -1;
329329
}
@@ -356,15 +356,15 @@ static int mirred_device_event(struct notifier_block *unused,
356356
if (event == NETDEV_UNREGISTER) {
357357
spin_lock(&mirred_list_lock);
358358
list_for_each_entry(m, &mirred_list, tcfm_list) {
359-
spin_lock(&m->tcf_lock);
359+
spin_lock_bh(&m->tcf_lock);
360360
if (tcf_mirred_dev_dereference(m) == dev) {
361361
dev_put(dev);
362362
/* Note : no rcu grace period necessary, as
363363
* net_device are already rcu protected.
364364
*/
365365
RCU_INIT_POINTER(m->tcfm_dev, NULL);
366366
}
367-
spin_unlock(&m->tcf_lock);
367+
spin_unlock_bh(&m->tcf_lock);
368368
}
369369
spin_unlock(&mirred_list_lock);
370370
}

net/sched/act_sample.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla,
4444
struct nlattr *tb[TCA_SAMPLE_MAX + 1];
4545
struct psample_group *psample_group;
4646
struct tc_sample *parm;
47+
u32 psample_group_num;
4748
struct tcf_sample *s;
4849
bool exists = false;
4950
int ret, err;
@@ -78,25 +79,27 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla,
7879
tcf_idr_release(*a, bind);
7980
return -EEXIST;
8081
}
81-
s = to_sample(*a);
8282

83-
spin_lock(&s->tcf_lock);
84-
s->tcf_action = parm->action;
85-
s->rate = nla_get_u32(tb[TCA_SAMPLE_RATE]);
86-
s->psample_group_num = nla_get_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]);
87-
psample_group = psample_group_get(net, s->psample_group_num);
83+
psample_group_num = nla_get_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]);
84+
psample_group = psample_group_get(net, psample_group_num);
8885
if (!psample_group) {
89-
spin_unlock(&s->tcf_lock);
9086
tcf_idr_release(*a, bind);
9187
return -ENOMEM;
9288
}
89+
90+
s = to_sample(*a);
91+
92+
spin_lock_bh(&s->tcf_lock);
93+
s->tcf_action = parm->action;
94+
s->rate = nla_get_u32(tb[TCA_SAMPLE_RATE]);
95+
s->psample_group_num = psample_group_num;
9396
RCU_INIT_POINTER(s->psample_group, psample_group);
9497

9598
if (tb[TCA_SAMPLE_TRUNC_SIZE]) {
9699
s->truncate = true;
97100
s->trunc_size = nla_get_u32(tb[TCA_SAMPLE_TRUNC_SIZE]);
98101
}
99-
spin_unlock(&s->tcf_lock);
102+
spin_unlock_bh(&s->tcf_lock);
100103

101104
if (ret == ACT_P_CREATED)
102105
tcf_idr_insert(tn, *a);
@@ -183,7 +186,7 @@ static int tcf_sample_dump(struct sk_buff *skb, struct tc_action *a,
183186
};
184187
struct tcf_t t;
185188

186-
spin_lock(&s->tcf_lock);
189+
spin_lock_bh(&s->tcf_lock);
187190
opt.action = s->tcf_action;
188191
if (nla_put(skb, TCA_SAMPLE_PARMS, sizeof(opt), &opt))
189192
goto nla_put_failure;
@@ -201,12 +204,12 @@ static int tcf_sample_dump(struct sk_buff *skb, struct tc_action *a,
201204

202205
if (nla_put_u32(skb, TCA_SAMPLE_PSAMPLE_GROUP, s->psample_group_num))
203206
goto nla_put_failure;
204-
spin_unlock(&s->tcf_lock);
207+
spin_unlock_bh(&s->tcf_lock);
205208

206209
return skb->len;
207210

208211
nla_put_failure:
209-
spin_unlock(&s->tcf_lock);
212+
spin_unlock_bh(&s->tcf_lock);
210213
nlmsg_trim(skb, b);
211214
return -1;
212215
}

net/sched/act_tunnel_key.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,11 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla,
354354
params_new->tcft_action = parm->t_action;
355355
params_new->tcft_enc_metadata = metadata;
356356

357-
spin_lock(&t->tcf_lock);
357+
spin_lock_bh(&t->tcf_lock);
358358
t->tcf_action = parm->action;
359359
rcu_swap_protected(t->params, params_new,
360360
lockdep_is_held(&t->tcf_lock));
361-
spin_unlock(&t->tcf_lock);
361+
spin_unlock_bh(&t->tcf_lock);
362362
if (params_new)
363363
kfree_rcu(params_new, rcu);
364364

@@ -485,7 +485,7 @@ static int tunnel_key_dump(struct sk_buff *skb, struct tc_action *a,
485485
};
486486
struct tcf_t tm;
487487

488-
spin_lock(&t->tcf_lock);
488+
spin_lock_bh(&t->tcf_lock);
489489
params = rcu_dereference_protected(t->params,
490490
lockdep_is_held(&t->tcf_lock));
491491
opt.action = t->tcf_action;
@@ -520,12 +520,12 @@ static int tunnel_key_dump(struct sk_buff *skb, struct tc_action *a,
520520
if (nla_put_64bit(skb, TCA_TUNNEL_KEY_TM, sizeof(tm),
521521
&tm, TCA_TUNNEL_KEY_PAD))
522522
goto nla_put_failure;
523-
spin_unlock(&t->tcf_lock);
523+
spin_unlock_bh(&t->tcf_lock);
524524

525525
return skb->len;
526526

527527
nla_put_failure:
528-
spin_unlock(&t->tcf_lock);
528+
spin_unlock_bh(&t->tcf_lock);
529529
nlmsg_trim(skb, b);
530530
return -1;
531531
}

net/sched/act_vlan.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla,
213213
p->tcfv_push_prio = push_prio;
214214
p->tcfv_push_proto = push_proto;
215215

216-
spin_lock(&v->tcf_lock);
216+
spin_lock_bh(&v->tcf_lock);
217217
v->tcf_action = parm->action;
218218
rcu_swap_protected(v->vlan_p, p, lockdep_is_held(&v->tcf_lock));
219-
spin_unlock(&v->tcf_lock);
219+
spin_unlock_bh(&v->tcf_lock);
220220

221221
if (p)
222222
kfree_rcu(p, rcu);
@@ -249,7 +249,7 @@ static int tcf_vlan_dump(struct sk_buff *skb, struct tc_action *a,
249249
};
250250
struct tcf_t t;
251251

252-
spin_lock(&v->tcf_lock);
252+
spin_lock_bh(&v->tcf_lock);
253253
opt.action = v->tcf_action;
254254
p = rcu_dereference_protected(v->vlan_p, lockdep_is_held(&v->tcf_lock));
255255
opt.v_action = p->tcfv_action;
@@ -268,12 +268,12 @@ static int tcf_vlan_dump(struct sk_buff *skb, struct tc_action *a,
268268
tcf_tm_dump(&t, &v->tcf_tm);
269269
if (nla_put_64bit(skb, TCA_VLAN_TM, sizeof(t), &t, TCA_VLAN_PAD))
270270
goto nla_put_failure;
271-
spin_unlock(&v->tcf_lock);
271+
spin_unlock_bh(&v->tcf_lock);
272272

273273
return skb->len;
274274

275275
nla_put_failure:
276-
spin_unlock(&v->tcf_lock);
276+
spin_unlock_bh(&v->tcf_lock);
277277
nlmsg_trim(skb, b);
278278
return -1;
279279
}

0 commit comments

Comments
 (0)