• Brian Vazquez's avatar
    bpf: Add generic support for lookup batch op · cb4d03ab
    Brian Vazquez authored
    This commit introduces generic support for the bpf_map_lookup_batch.
    This implementation can be used by almost all the bpf maps since its core
    implementation is relying on the existing map_get_next_key and
    map_lookup_elem. The bpf syscall subcommand introduced is:
    
      BPF_MAP_LOOKUP_BATCH
    
    The UAPI attribute is:
    
      struct { /* struct used by BPF_MAP_*_BATCH commands */
             __aligned_u64   in_batch;       /* start batch,
                                              * NULL to start from beginning
                                              */
             __aligned_u64   out_batch;      /* output: next start batch */
             __aligned_u64   keys;
             __aligned_u64   values;
             __u32           count;          /* input/output:
                                              * input: # of key/value
                                              * elements
                                              * output: # of filled elements
                                              */
             __u32           map_fd;
             __u64           elem_flags;
             __u64           flags;
      } batch;
    
    in_batch/out_batch are opaque values use to communicate between
    user/kernel space, in_batch/out_batch must be of key_size length.
    
    To start iterating from the beginning in_batch must be null,
    count is the # of key/value elements to retrieve. Note that the 'keys'
    buffer must be a buffer of key_size * count size and the 'values' buffer
    must be value_size * count, where value_size must be aligned to 8 bytes
    by userspace if it's dealing with percpu maps. 'count' will contain the
    number of keys/values successfully retrieved. Note that 'count' is an
    input/output variable and it can contain a lower value after a call.
    
    If there's no more entries to retrieve, ENOENT will be returned. If error
    is ENOENT, count might be > 0 in case it copied some values but there were
    no more entries to retrieve.
    
    Note that if the return code is an error and not -EFAULT,
    count indicates the number of elements successfully processed.
    Suggested-by: default avatarStanislav Fomichev <sdf@google.com>
    Signed-off-by: default avatarBrian Vazquez <brianvv@google.com>
    Signed-off-by: default avatarYonghong Song <yhs@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200115184308.162644-3-brianvv@google.com
    cb4d03ab
syscall.c 77.4 KB