linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Alexis Lothoré" <alexis.lothore@bootlin.com>
To: "Xu Kuohai" <xukuohai@huaweicloud.com>,
	"Andrii Nakryiko" <andrii.nakryiko@gmail.com>
Cc: "Alexei Starovoitov" <ast@kernel.org>,
	"Daniel Borkmann" <daniel@iogearbox.net>,
	"John Fastabend" <john.fastabend@gmail.com>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Martin KaFai Lau" <martin.lau@linux.dev>,
	"Eduard Zingerman" <eddyz87@gmail.com>,
	"Song Liu" <song@kernel.org>,
	"Yonghong Song" <yonghong.song@linux.dev>,
	"KP Singh" <kpsingh@kernel.org>,
	"Stanislav Fomichev" <sdf@fomichev.me>,
	"Hao Luo" <haoluo@google.com>, "Jiri Olsa" <jolsa@kernel.org>,
	"Puranjay Mohan" <puranjay@kernel.org>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Will Deacon" <will@kernel.org>,
	"Mykola Lysenko" <mykolal@fb.com>,
	"Shuah Khan" <shuah@kernel.org>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	"Alexandre Torgue" <alexandre.torgue@foss.st.com>,
	"Florent Revest" <revest@chromium.org>,
	"Bastien Curutchet" <bastien.curutchet@bootlin.com>,
	<ebpf@linuxfoundation.org>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	<bpf@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kselftest@vger.kernel.org>,
	<linux-stm32@st-md-mailman.stormreply.com>
Subject: Re: [PATCH RFC bpf-next 1/4] bpf: add struct largest member size in func model
Date: Sun, 20 Apr 2025 18:02:42 +0200	[thread overview]
Message-ID: <D9BLCJSCHE9A.1IKHK3XBPF8MU@bootlin.com> (raw)
In-Reply-To: <9da88811-cce0-41df-8069-2e8b67541c39@huaweicloud.com>

Hi Xu,

On Thu Apr 17, 2025 at 4:10 PM CEST, Xu Kuohai wrote:
> On 4/17/2025 3:14 PM, Alexis Lothoré wrote:
>> Hi Andrii,
>> 
>> On Wed Apr 16, 2025 at 11:24 PM CEST, Andrii Nakryiko wrote:
>>> On Fri, Apr 11, 2025 at 1:32 PM Alexis Lothoré (eBPF Foundation)
>>> <alexis.lothore@bootlin.com> wrote:

[...]

>>> I might be missing something, but how can the *size* of the field be
>>> used to calculate that argument's *alignment*? i.e., I don't
>>> understand why arg_largest_member_size needs to be calculated instead
>>> of arg_largest_member_alignment...
>> 
>> Indeed I initially checked whether I could return directly some alignment
>> info from btf, but it then involves the alignment computation in the btf
>> module. Since there could be minor differences between architectures about
>> alignment requirements, I though it would be better to in fact keep alignment
>> computation out of the btf module. For example, I see that 128 bits values
>> are aligned on 16 bytes on ARM64, while being aligned on 8 bytes on S390.
>> 
>> And since for ARM64, all needed alignments are somehow derived from size
>> (it is either directly size for fundamental types, or alignment of the
>> largest member for structs, which is then size of largest member),
>> returning the size seems to be enough to allow the JIT side to compute
>> alignments.
>>
>
> Not exactly. The compiler's "packed" and "alignment" attributes cause a
> structure to be aligned differently from its natural alignment.
>
> For example, with the following three structures:
>
> struct s0 {
>      __int128 x;
> };
>
> struct s1 {
>      __int128 x;
> } __attribute__((packed));
>
> struct s2 {
>      __int128 x;
> } __attribute__((aligned(64)));
>
> Even though the largest member size is the same, s0 will be aligned to 16
> bytes, s1 and s2 are not aligned the same way. s1 has no alignment due to
> the "packed" attribute, while s2 will be aligned to 64 bytes.
>
> When these three structures are passed as function arguments, they will be
> located on different positions on the stack.
>
> For the following three functions:
>
> int f0(__int128 a, __int128 b, __int128 c, int64_t d, __int128 e, int64_t f, struct s0 g);
> int f1(__int128 a, __int128 b, __int128 c, int64_t d, __int128 e, int64_t f, struct s1 g);
> int f2(__int128 a, __int128 b, __int128 c, int64_t d, __int128 e, int64_t f, struct s2 g);
>
> g will be located at sp+32 in f0, sp + 24 in f1, and some 64-byte aligned
> stack address in f2.

Ah, thanks for those clear examples, I completely overlooked this
possibility. And now that you mention it, I feel a bit dumb because I now
remember that you mentioned this in Puranjay's series...

I took a quick look at the x86 JIT compiler for reference, and saw no code
related to this specific case neither. So I searched in the kernel for
actual functions taking struct arguments by value AND being declared with some
packed or aligned attribute. I only found a handful of those, and none
seems to take enough arguments to have the corresponding struct passed on the
stack. So rather than supporting this very specific case, I am tempted
to just return an error for now during trampoline creation if we detect such
structure (and then the JIT compiler can keep using data size to compute
alignment, now that it is sure not to receive custom alignments). Or am I
missing some actual cases involving those very specific alignments ?

Thanks,

Alexis

-- 
Alexis Lothoré, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


  reply	other threads:[~2025-04-20 16:02 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-11 20:32 [PATCH RFC bpf-next 0/4] bpf, arm64: support up to 12 arguments Alexis Lothoré (eBPF Foundation)
2025-04-11 20:32 ` [PATCH RFC bpf-next 1/4] bpf: add struct largest member size in func model Alexis Lothoré (eBPF Foundation)
2025-04-14 11:04   ` Jiri Olsa
2025-04-14 20:27     ` Alexis Lothoré
2025-04-16 21:24   ` Andrii Nakryiko
2025-04-17  7:14     ` Alexis Lothoré
2025-04-17 14:10       ` Xu Kuohai
2025-04-20 16:02         ` Alexis Lothoré [this message]
2025-04-21  2:14           ` Xu Kuohai
2025-04-23 15:38             ` Alexis Lothoré
2025-04-23 17:15       ` Andrii Nakryiko
2025-04-23 19:24         ` Alexis Lothoré
2025-04-24 12:00           ` Xu Kuohai
2025-04-24 13:38             ` Alexis Lothoré
2025-04-24 23:14               ` Alexei Starovoitov
2025-04-25  8:47                 ` Alexis Lothoré
2025-04-25  9:23               ` Xu Kuohai
2025-04-28  7:11                 ` Eduard Zingerman
2025-06-04  9:02           ` [Question] attributes encoding in BTF Alexis Lothoré
2025-06-04 17:31             ` Ihor Solodrai
2025-06-05  7:35               ` Alexis Lothoré
2025-06-05 16:09                 ` Alexei Starovoitov
2025-06-06  7:45                   ` Alexis Lothoré
2025-06-06 16:22                     ` Alexei Starovoitov
2025-04-11 20:32 ` [PATCH RFC bpf-next 2/4] bpf, arm64: Support up to 12 function arguments Alexis Lothoré
2025-04-11 20:32 ` [PATCH RFC bpf-next 3/4] bpf/selftests: add tests to validate proper arguments alignment on ARM64 Alexis Lothoré (eBPF Foundation)
2025-04-28  7:01   ` Eduard Zingerman
2025-04-28 10:08     ` Alexis Lothoré
2025-04-28 16:52       ` Eduard Zingerman
2025-04-28 20:41         ` Alexis Lothoré
2025-04-29  9:49           ` Alexis Lothoré
2025-04-11 20:32 ` [PATCH RFC bpf-next 4/4] bpf/selftests: enable tracing tests for ARM64 Alexis Lothoré (eBPF Foundation)

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=D9BLCJSCHE9A.1IKHK3XBPF8MU@bootlin.com \
    --to=alexis.lothore@bootlin.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=andrii.nakryiko@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bastien.curutchet@bootlin.com \
    --cc=bpf@vger.kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=daniel@iogearbox.net \
    --cc=ebpf@linuxfoundation.org \
    --cc=eddyz87@gmail.com \
    --cc=haoluo@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=martin.lau@linux.dev \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=mykolal@fb.com \
    --cc=puranjay@kernel.org \
    --cc=revest@chromium.org \
    --cc=sdf@fomichev.me \
    --cc=shuah@kernel.org \
    --cc=song@kernel.org \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=will@kernel.org \
    --cc=xukuohai@huaweicloud.com \
    --cc=yonghong.song@linux.dev \
    /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;
as well as URLs for NNTP newsgroup(s).