public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: Andrii Nakryiko <andrii.nakryiko@gmail.com>,
	Leon Hwang <leon.hwang@linux.dev>
Cc: bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org,
	daniel@iogearbox.net, song@kernel.org, eddyz87@gmail.com,
	qmo@kernel.org, dxu@dxuuu.xyz, kernel-patches-bot@fb.com
Subject: Re: [PATCH bpf-next v3 0/4] bpf: Introduce global percpu data
Date: Wed, 28 May 2025 10:10:46 -0700	[thread overview]
Message-ID: <6cc290d6-2fe8-4171-9e74-a9f20c5b5992@linux.dev> (raw)
In-Reply-To: <CAEf4Bzb69wNAvLZ_55vzsZ0Co7u+g=JD85OkodWuYsG-uHBz_w@mail.gmail.com>



On 5/27/25 3:31 PM, Andrii Nakryiko wrote:
> On Mon, May 26, 2025 at 9:22 AM Leon Hwang <leon.hwang@linux.dev> wrote:
>> This patch set introduces global percpu data, similar to commit
>> 6316f78306c1 ("Merge branch 'support-global-data'"), to reduce restrictions
>> in C for BPF programs.
>>
>> With this enhancement, it becomes possible to define and use global percpu
>> variables, like the DEFINE_PER_CPU() macro in the kernel[0].
>>
>> The section name for global peurcpu data is ".data..percpu". It cannot be
>> named ".percpu" or ".percpudata" because defining a one-byte percpu
>> variable (e.g., char run SEC(".data..percpu") = 0;) can trigger a crash
>> with Clang 17[1]. The name ".data.percpu" is also avoided because some
> Does this happen with newer Clangs? If not, I don't think a bug in
> Clang 17 is reason enough for this weird '.data..percpu' naming
> convention. I'd still very much prefer .percpu prefix. .data is used
> for non-per-CPU data, we shouldn't share the prefix, if we can avoid
> that.

I checked and clang17 does have a fatal error with '.percpu'. But clang18
to clang21 all fine.

For clang17, the error message is
   fatal error: error in backend: unable to write nop sequence of 3 bytes
in llvm/lib/MC/MCAssembler.cpp.

The key reason is in bpf backend llvm/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp

bool BPFAsmBackend::writeNopData(raw_ostream &OS, uint64_t Count,
                                  const MCSubtargetInfo *STI) const {
   if ((Count % 8) != 0)
     return false;

   for (uint64_t i = 0; i < Count; i += 8)
     support::endian::write<uint64_t>(OS, 0x15000000, Endian);

   return true;
}

Since Count is 3, writeNopData returns false and it caused the fatal error.

The bug is likely in MC itself as for the same BPF writeNopData implementatation,
clang18 works fine (with Count is 8). So the bug should be fixed in clang18.

>
> pw-bot: cr
>
>
>> users already use section names prefixed with ".data.percpu", such as in
>> this example from test_global_map_resize.c:
>>
>> int percpu_arr[1] SEC(".data.percpu_arr");
>>
>> The idea stems from the bpfsnoop[2], which itself was inspired by
>> retsnoop[3]. During testing of bpfsnoop on the v6.6 kernel, two LBR
>> (Last Branch Record) entries were observed related to the
>> bpf_get_smp_processor_id() helper.
>>
>> Since commit 1ae6921009e5 ("bpf: inline bpf_get_smp_processor_id() helper"),
>> the bpf_get_smp_processor_id() helper has been inlined on x86_64, reducing
>> the overhead and consequently minimizing these two LBR records.
>>
>> However, the introduction of global percpu data offers a more robust
>> solution. By leveraging the percpu_array map and percpu instruction,
>> global percpu data can be implemented intrinsically.
>>
>> This feature also facilitates sharing percpu information between tail
>> callers and callees or between freplace callers and callees through a
>> shared global percpu variable. Previously, this was achieved using a
>> 1-entry percpu_array map, which this patch set aims to improve upon.
>>
>> Links:
>> [0] https://github.com/torvalds/linux/blob/fbfd64d25c7af3b8695201ebc85efe90be28c5a3/include/linux/percpu-defs.h#L114
>> [1] https://lore.kernel.org/bpf/fd1b3f58-c27f-403d-ad99-644b7d06ecb3@linux.dev/
>> [2] https://github.com/bpfsnoop/bpfsnoop
>> [3] https://github.com/anakryiko/retsnoop
>>
>> Changes:
>> v2 -> v3:
>>    * Use ".data..percpu" as PERCPU_DATA_SEC.
>>    * Address comment from Alexei:
>>      * Add u8, array of ints and struct { .. } vars to selftest.
>>
>> v1 -> v2:
>>    * Address comments from Andrii:
>>      * Use LIBBPF_MAP_PERCPU and SEC_PERCPU.
>>      * Reuse mmaped of libbpf's struct bpf_map for .percpu map data.
>>      * Set .percpu struct pointer to NULL after loading skeleton.
>>      * Make sure value size of .percpu map is __aligned(8).
>>      * Use raw_tp and opts.cpu to test global percpu variables on all CPUs.
>>    * Address comments from Alexei:
>>      * Test non-zero offset of global percpu variable.
>>      * Test case about BPF_PSEUDO_MAP_IDX_VALUE.
>>
>> rfc -> v1:
>>    * Address comments from Andrii:
>>      * Keep one image of global percpu variable for all CPUs.
>>      * Reject non-ARRAY map in bpf_map_direct_read(), check_reg_const_str(),
>>        and check_bpf_snprintf_call() in verifier.
>>      * Split out libbpf changes from kernel-side changes.
>>      * Use ".percpu" as PERCPU_DATA_SEC.
>>      * Use enum libbpf_map_type to distinguish BSS, DATA, RODATA and
>>        PERCPU_DATA.
>>      * Avoid using errno for checking err from libbpf_num_possible_cpus().
>>      * Use "map '%s': " prefix for error message.
>>
>> Leon Hwang (4):
>>    bpf: Introduce global percpu data
>>    bpf, libbpf: Support global percpu data
>>    bpf, bpftool: Generate skeleton for global percpu data
>>    selftests/bpf: Add cases to test global percpu data
>>
>>   kernel/bpf/arraymap.c                         |  41 +++-
>>   kernel/bpf/verifier.c                         |  45 ++++
>>   tools/bpf/bpftool/gen.c                       |  47 ++--
>>   tools/lib/bpf/libbpf.c                        | 102 ++++++--
>>   tools/lib/bpf/libbpf.h                        |   9 +
>>   tools/lib/bpf/libbpf.map                      |   1 +
>>   tools/testing/selftests/bpf/Makefile          |   2 +-
>>   .../bpf/prog_tests/global_data_init.c         | 221 +++++++++++++++++-
>>   .../bpf/progs/test_global_percpu_data.c       |  29 +++
>>   9 files changed, 459 insertions(+), 38 deletions(-)
>>   create mode 100644 tools/testing/selftests/bpf/progs/test_global_percpu_data.c
>>
>> --
>> 2.49.0
>>


  reply	other threads:[~2025-05-28 17:10 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-26 16:21 [PATCH bpf-next v3 0/4] bpf: Introduce global percpu data Leon Hwang
2025-05-26 16:21 ` [PATCH bpf-next v3 1/4] " Leon Hwang
2025-05-27 22:31   ` Andrii Nakryiko
2025-05-29  2:03     ` Leon Hwang
2025-05-26 16:21 ` [PATCH bpf-next v3 2/4] bpf, libbpf: Support " Leon Hwang
2025-05-27 22:31   ` Andrii Nakryiko
2025-05-29  2:24     ` Leon Hwang
2025-05-27 22:40   ` Alexei Starovoitov
2025-05-27 23:25     ` Andrii Nakryiko
2025-05-28  2:35       ` Alexei Starovoitov
2025-05-28 16:05         ` Andrii Nakryiko
2025-05-29  2:43           ` Leon Hwang
2025-06-02 23:50             ` Andrii Nakryiko
2025-06-03  2:45               ` Leon Hwang
2025-06-05 16:29                 ` Andrii Nakryiko
2025-05-26 16:21 ` [PATCH bpf-next v3 3/4] bpf, bpftool: Generate skeleton for " Leon Hwang
2025-05-27 22:31   ` Andrii Nakryiko
2025-05-29  2:56     ` Leon Hwang
2025-06-02 23:50       ` Andrii Nakryiko
2025-06-03  2:47         ` Leon Hwang
2025-05-26 16:21 ` [PATCH bpf-next v3 4/4] selftests/bpf: Add cases to test " Leon Hwang
2025-05-27 22:31 ` [PATCH bpf-next v3 0/4] bpf: Introduce " Andrii Nakryiko
2025-05-28 17:10   ` Yonghong Song [this message]
2025-05-29  1:59     ` Leon Hwang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6cc290d6-2fe8-4171-9e74-a9f20c5b5992@linux.dev \
    --to=yonghong.song@linux.dev \
    --cc=andrii.nakryiko@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=dxu@dxuuu.xyz \
    --cc=eddyz87@gmail.com \
    --cc=kernel-patches-bot@fb.com \
    --cc=leon.hwang@linux.dev \
    --cc=qmo@kernel.org \
    --cc=song@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox