• Daniel Borkmann's avatar
    cls_bpf: do eBPF invocation under non-bh RCU lock variant for maps · 54720df1
    Daniel Borkmann authored
    Currently, it is possible in cls_bpf to access eBPF maps only under
    rcu_read_lock_bh() variants: while on ingress side, that is, handle_ing(),
    the classifier would be called from __netif_receive_skb_core() under
    rcu_read_lock(); on egress side, however, it's rcu_read_lock_bh() via
    __dev_queue_xmit().
    
    This rcu/rcu_bh mix doesn't work together with eBPF maps as they require
    soley to be called under rcu_read_lock(). eBPF maps could also be shared
    among various other eBPF programs (possibly even with other eBPF program
    types, f.e. tracing) and user space processes, so any context is assumed.
    
    Therefore, a possible fix for cls_bpf is to wrap/nest eBPF program
    invocation under non-bh RCU lock variant.
    
    Fixes: e2e9b654 ("cls_bpf: add initial eBPF support for programmable classifiers")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@plumgrid.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    54720df1
cls_bpf.c 10.4 KB