Re: [PATCH net-next 12/24] seg6: Use nested-BH locking for seg6_bpf_srh_states.
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: 2024-01-12 11:23:59
Also in:
bpf, lkml
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: 2024-01-12 11:23:59
Also in:
bpf, lkml
On 2023-12-18 09:33:39 [+0100], Paolo Abeni wrote:
quoted
--- a/net/ipv6/seg6_local.c +++ b/net/ipv6/seg6_local.c@@ -1420,41 +1422,44 @@ static int input_action_end_bpf(struct sk_buff *skb, } advance_nextseg(srh, &ipv6_hdr(skb)->daddr); - /* preempt_disable is needed to protect the per-CPU buffer srh_state, - * which is also accessed by the bpf_lwt_seg6_* helpers + /* The access to the per-CPU buffer srh_state is protected by running + * always in softirq context (with disabled BH). On PREEMPT_RT the + * required locking is provided by the following local_lock_nested_bh() + * statement. It is also accessed by the bpf_lwt_seg6_* helpers via + * bpf_prog_run_save_cb(). */ - preempt_disable(); - srh_state->srh = srh; - srh_state->hdrlen = srh->hdrlen << 3; - srh_state->valid = true; + scoped_guard(local_lock_nested_bh, &seg6_bpf_srh_states.bh_lock) { + srh_state = this_cpu_ptr(&seg6_bpf_srh_states); + srh_state->srh = srh; + srh_state->hdrlen = srh->hdrlen << 3; + srh_state->valid = true;Here the 'scoped_guard' usage adds a lot of noise to the patch, due to the added indentation. What about using directly local_lock_nested_bh()/local_unlock_nested_bh() ?
If this is preferred, sure.
Cheers, Paolo
Sebastian