On 2023-12-18 09:33:39 [+0100], Paolo Abeni wrote: > > --- 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