• Puranjay Mohan's avatar
    bpf, arm64: inline bpf_get_smp_processor_id() helper · 75fe4c0b
    Puranjay Mohan authored
    Inline calls to bpf_get_smp_processor_id() helper in the JIT by emitting
    a read from struct thread_info. The SP_EL0 system register holds the
    pointer to the task_struct and thread_info is the first member of this
    struct. We can read the cpu number from the thread_info.
    
    Here is how the ARM64 JITed assembly changes after this commit:
    
                                          ARM64 JIT
                                         ===========
    
                  BEFORE                                    AFTER
                 --------                                  -------
    
    int cpu = bpf_get_smp_processor_id();        int cpu = bpf_get_smp_processor_id();
    
    mov     x10, #0xfffffffffffff4d0             mrs     x10, sp_el0
    movk    x10, #0x802b, lsl #16                ldr     w7, [x10, #24]
    movk    x10, #0x8000, lsl #32
    blr     x10
    add     x7, x0, #0x0
    
                   Performance improvement using benchmark[1]
    
    ./benchs/run_bench_trigger.sh glob-arr-inc arr-inc hash-inc
    
    +---------------+-------------------+-------------------+--------------+
    |      Name     |      Before       |        After      |   % change   |
    |---------------+-------------------+-------------------+--------------|
    | glob-arr-inc  | 23.380 ± 1.675M/s | 25.893 ± 0.026M/s |   + 10.74%   |
    | arr-inc       | 23.928 ± 0.034M/s | 25.213 ± 0.063M/s |   + 5.37%    |
    | hash-inc      | 12.352 ± 0.005M/s | 12.609 ± 0.013M/s |   + 2.08%    |
    +---------------+-------------------+-------------------+--------------+
    
    [1] https://github.com/anakryiko/linux/commit/8dec900975efSigned-off-by: default avatarPuranjay Mohan <puranjay@kernel.org>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20240502151854.9810-5-puranjay@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    75fe4c0b
insn.h 23.6 KB