• Dave Marchevsky's avatar
    bpf: Remove btf_field_offs, use btf_record's fields instead · cd2a8079
    Dave Marchevsky authored
    The btf_field_offs struct contains (offset, size) for btf_record fields,
    sorted by offset. btf_field_offs is always used in conjunction with
    btf_record, which has btf_field 'fields' array with (offset, type), the
    latter of which btf_field_offs' size is derived from via
    btf_field_type_size.
    
    This patch adds a size field to struct btf_field and sorts btf_record's
    fields by offset, making it possible to get rid of btf_field_offs. Less
    data duplication and less code complexity results.
    
    Since btf_field_offs' lifetime closely followed the btf_record used to
    populate it, most complexity wins are from removal of initialization
    code like:
    
      if (btf_record_successfully_initialized) {
        foffs = btf_parse_field_offs(rec);
        if (IS_ERR_OR_NULL(foffs))
          // free the btf_record and return err
      }
    
    Other changes in this patch are pretty mechanical:
    
      * foffs->field_off[i] -> rec->fields[i].offset
      * foffs->field_sz[i] -> rec->fields[i].size
      * Sort rec->fields in btf_parse_fields before returning
        * It's possible that this is necessary independently of other
          changes in this patch. btf_record_find in syscall.c expects
          btf_record's fields to be sorted by offset, yet there's no
          explicit sorting of them before this patch, record's fields are
          populated in the order they're read from BTF struct definition.
          BTF docs don't say anything about the sortedness of struct fields.
      * All functions taking struct btf_field_offs * input now instead take
        struct btf_record *. All callsites of these functions already have
        access to the correct btf_record.
    Signed-off-by: default avatarDave Marchevsky <davemarchevsky@fb.com>
    Link: https://lore.kernel.org/r/20230415201811.343116-2-davemarchevsky@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    cd2a8079
map_in_map.c 3.42 KB