• Thomas Gleixner's avatar
    bpf: Tighten the requirements for preallocated hash maps · 94dacdbd
    Thomas Gleixner authored
    The assumption that only programs attached to perf NMI events can deadlock
    on memory allocators is wrong. Assume the following simplified callchain:
    
     kmalloc() from regular non BPF context
      cache empty
       freelist empty
        lock(zone->lock);
         tracepoint or kprobe
          BPF()
           update_elem()
            lock(bucket)
              kmalloc()
               cache empty
                freelist empty
                 lock(zone->lock);  <- DEADLOCK
    
    There are other ways which do not involve locking to create wreckage:
    
     kmalloc() from regular non BPF context
      local_irq_save();
       ...
        obj = slab_first();
         kprobe()
          BPF()
           update_elem()
            lock(bucket)
             kmalloc()
              local_irq_save();
               ...
                obj = slab_first(); <- Same object as above ...
    
    So preallocation _must_ be enforced for all variants of intrusive
    instrumentation.
    
    Unfortunately immediate enforcement would break backwards compatibility, so
    for now such programs still are allowed to run, but a one time warning is
    emitted in dmesg and the verifier emits a warning in the verifier log as
    well so developers are made aware about this and can fix their programs
    before the enforcement becomes mandatory.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200224145642.540542802@linutronix.de
    94dacdbd
verifier.c 290 KB