• Ian Rogers's avatar
    perf maps: Switch from rbtree to lazily sorted array for addresses · 659ad349
    Ian Rogers authored
    Maps is a collection of maps primarily sorted by the starting address
    of the map. Prior to this change the maps were held in an rbtree
    requiring 4 pointers per node. Prior to reference count checking, the
    rbnode was embedded in the map so 3 pointers per node were
    necessary. This change switches the rbtree to an array lazily sorted
    by address, much as the array sorting nodes by name. 1 pointer is
    needed per node, but to avoid excessive resizing the backing array may
    be twice the number of used elements. Meaning the memory overhead is
    roughly half that of the rbtree. For a perf record with
    "--no-bpf-event -g -a" of true, the memory overhead of perf inject is
    reduce fom 3.3MB to 3MB, so 10% or 300KB is saved.
    
    Map inserts always happen at the end of the array. The code tracks
    whether the insertion violates the sorting property. O(log n) rb-tree
    complexity is switched to O(1).
    
    Remove slides the array, so O(log n) rb-tree complexity is degraded to
    O(n).
    
    A find may need to sort the array using qsort which is O(n*log n), but
    in general the maps should be sorted and so average performance should
    be O(log n) as with the rbtree.
    
    An rbtree node consumes a cache line, but with the array 4 nodes fit
    on a cache line. Iteration is simplified to scanning an array rather
    than pointer chasing.
    
    Overall it is expected the performance after the change should be
    comparable to before, but with half of the memory consumed.
    
    To avoid a list and repeated logic around splitting maps,
    maps__merge_in is rewritten in terms of
    maps__fixup_overlap_and_insert. maps_merge_in splits the given mapping
    inserting remaining gaps. maps__fixup_overlap_and_insert splits the
    existing mappings, then adds the incoming mapping. By adding the new
    mapping first, then re-inserting the existing mappings the splitting
    behavior matches.
    Signed-off-by: default avatarIan Rogers <irogers@google.com>
    Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: K Prateek Nayak <kprateek.nayak@amd.com>
    Cc: James Clark <james.clark@arm.com>
    Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Colin Ian King <colin.i.king@gmail.com>
    Cc: Changbin Du <changbin.du@huawei.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Song Liu <song@kernel.org>
    Cc: Leo Yan <leo.yan@linux.dev>
    Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Cc: Artem Savkov <asavkov@redhat.com>
    Cc: bpf@vger.kernel.org
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Link: https://lore.kernel.org/r/20240210031746.4057262-2-irogers@google.com
    659ad349
map.c 14.6 KB