• Thomas Gleixner's avatar
    bpf: Prepare hashtab locking for PREEMPT_RT · 7f805d17
    Thomas Gleixner authored
    PREEMPT_RT forbids certain operations like memory allocations (even with
    GFP_ATOMIC) from atomic contexts. This is required because even with
    GFP_ATOMIC the memory allocator calls into code pathes which acquire locks
    with long held lock sections. To ensure the deterministic behaviour these
    locks are regular spinlocks, which are converted to 'sleepable' spinlocks
    on RT. The only true atomic contexts on an RT kernel are the low level
    hardware handling, scheduling, low level interrupt handling, NMIs etc. None
    of these contexts should ever do memory allocations.
    
    As regular device interrupt handlers and soft interrupts are forced into
    thread context, the existing code which does
      spin_lock*(); alloc(GPF_ATOMIC); spin_unlock*();
    just works.
    
    In theory the BPF locks could be converted to regular spinlocks as well,
    but the bucket locks and percpu_freelist locks can be taken from arbitrary
    contexts (perf, kprobes, tracepoints) which are required to be atomic
    contexts even on RT. These mechanisms require preallocated maps, so there
    is no need to invoke memory allocations within the lock held sections.
    
    BPF maps which need dynamic allocation are only used from (forced) thread
    context on RT and can therefore use regular spinlocks which in turn allows
    to invoke memory allocations from the lock held section.
    
    To achieve this make the hash bucket lock a union of a raw and a regular
    spinlock and initialize and lock/unlock either the raw spinlock for
    preallocated maps or the regular variant for maps which require memory
    allocations.
    
    On a non RT kernel this distinction is neither possible nor required.
    spinlock maps to raw_spinlock and the extra code and conditional is
    optimized out by the compiler. No functional change.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200224145644.509685912@linutronix.de
    7f805d17
hashtab.c 48.8 KB