• Ian Rogers's avatar
    perf map: Simplify map_ip/unmap_ip and make 'struct map' smaller · 9fa688ea
    Ian Rogers authored
    When mapping an IP it is either an identity mapping or a DSO relative
    mapping, so a single bit is required in the struct to identify
    this.
    
    The current code uses function pointers, adding 2 pointers per map and
    also pushing the size of a map beyond 1 cache line.
    
    Switch to using a byte to identify the mapping type (as well as priv and
    erange_warned), to avoid any masking.
    
    Change struct maps's layout to avoid holes.
    
    Before:
    ```
    struct map {
            u64                        start;                /*     0     8 */
            u64                        end;                  /*     8     8 */
            _Bool                      erange_warned:1;      /*    16: 0  1 */
            _Bool                      priv:1;               /*    16: 1  1 */
    
            /* XXX 6 bits hole, try to pack */
            /* XXX 3 bytes hole, try to pack */
    
            u32                        prot;                 /*    20     4 */
            u64                        pgoff;                /*    24     8 */
            u64                        reloc;                /*    32     8 */
            u64                        (*map_ip)(const struct map  *, u64); /*    40     8 */
            u64                        (*unmap_ip)(const struct map  *, u64); /*    48     8 */
            struct dso *               dso;                  /*    56     8 */
            /* --- cacheline 1 boundary (64 bytes) --- */
            refcount_t                 refcnt;               /*    64     4 */
            u32                        flags;                /*    68     4 */
    
            /* size: 72, cachelines: 2, members: 12 */
            /* sum members: 68, holes: 1, sum holes: 3 */
            /* sum bitfield members: 2 bits, bit holes: 1, sum bit holes: 6 bits */
            /* last cacheline: 8 bytes */
    };
    ```
    
    After:
    ```
    struct map {
            u64                        start;                /*     0     8 */
            u64                        end;                  /*     8     8 */
            u64                        pgoff;                /*    16     8 */
            u64                        reloc;                /*    24     8 */
            struct dso *               dso;                  /*    32     8 */
            refcount_t                 refcnt;               /*    40     4 */
            u32                        prot;                 /*    44     4 */
            u32                        flags;                /*    48     4 */
            enum mapping_type          mapping_type:8;       /*    52: 0  4 */
    
            /* Bitfield combined with next fields */
    
            _Bool                      erange_warned;        /*    53     1 */
            _Bool                      priv;                 /*    54     1 */
    
            /* size: 56, cachelines: 1, members: 11 */
            /* padding: 1 */
            /* last cacheline: 56 bytes */
    };
    ```
    Signed-off-by: default avatarIan Rogers <irogers@google.com>
    Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Changbin Du <changbin.du@huawei.com>
    Cc: Colin Ian King <colin.i.king@gmail.com>
    Cc: Dmitrii Dolgov <9erthalion6@gmail.com>
    Cc: German Gomez <german.gomez@arm.com>
    Cc: Guilherme Amadio <amadio@gentoo.org>
    Cc: Huacai Chen <chenhuacai@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: James Clark <james.clark@arm.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: K Prateek Nayak <kprateek.nayak@amd.com>
    Cc: Kajol Jain <kjain@linux.ibm.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Leo Yan <leo.yan@linaro.org>
    Cc: Li Dong <lidong@vivo.com>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Cc: Miguel Ojeda <ojeda@kernel.org>
    Cc: Ming Wang <wangming01@loongson.cn>
    Cc: Nick Terrell <terrelln@fb.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ravi Bangoria <ravi.bangoria@amd.com>
    Cc: Sandipan Das <sandipan.das@amd.com>
    Cc: Sean Christopherson <seanjc@google.com>
    Cc: Steinar H. Gunderson <sesse@google.com>
    Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
    Cc: Wenyu Liu <liuwenyu7@huawei.com>
    Cc: Yang Jihong <yangjihong1@huawei.com>
    Link: https://lore.kernel.org/r/20231127220902.1315692-13-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    9fa688ea
symbol-elf.c 66 KB