From: Martin KaFai Lau <martin.lau@linux.dev>
To: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Stanislav Fomichev <sdf@google.com>, bpf <bpf@vger.kernel.org>
Subject: Re: [Question]: BPF_CGROUP_{GET,SET}SOCKOPT handling when optlen > PAGE_SIZE
Date: Thu, 27 Oct 2022 16:46:42 -0700 [thread overview]
Message-ID: <4dbbbdf1-0253-9101-1fc7-a4685970f4d7@linux.dev> (raw)
In-Reply-To: <CAEf4BzbsjBfFaf0M8_qLaEYAcUn4J9275tp0GEt5vb8hBg6Z9w@mail.gmail.com>
On 10/27/22 1:46 PM, Andrii Nakryiko wrote:
> On Wed, Oct 26, 2022 at 6:17 PM Martin KaFai Lau <martin.lau@linux.dev> wrote:
>>
>> The cgroup-bpf {get,set}sockopt prog is useful to change the optname behavior.
>> The bpf prog usually just handles a few specific optnames and ignores most
>> others. For the optnames that it ignores, it usually does not need to change
>> the optlen. The exception is when optlen > PAGE_SIZE (or optval_end - optval).
>> The bpf prog needs to set the optlen to 0 for this case or else the kernel will
>> return -EFAULT to the userspace. It is usually not what the bpf prog wants
>> because the bpf prog only expects error returning to userspace when it has
>> explicitly 'return 0;' or used bpf_set_retval(). If a bpf prog always changes
>> optlen for optnames that it does not care to 0, it may risk if the latter bpf
>> prog in the same cgroup may want to change/look-at it.
>>
>> Would like to explore if there is an easier way for the bpf prog to handle it.
>> eg. does it make sense to track if the bpf prog has changed the ctx->optlen
>> before returning -EFAULT to the user space when ctx.optlen > max_optlen?
>
> Maybe optlen + optval/optval_end could be replaced with dynptr? If we
> do a new type of dynptr (DYNPTR_CTXBUF or something like that), we can
> implement tracking of whether it was ever modified through
> bpf_dynptr_write() or if direct memory access was ever used (was
> bpf_dynptr_data() called). Not sure how you'd know if
> bpf_dynptr_data() was used to modify data, though (this is where
> bpf_dynptr_data_rdonly() vs bpf_dynptr_data() would be helpful,
> perhaps). But just a seed of an idea, maybe you guys can somehow fit
> it here?
Yep, dynptr can be used here. May be one dynptr specifically for sockptr_t. The
dynptr will have the __user pointer first to avoid a big (and potentially bogus)
kernel buffer pre allocation. Then only read and write it through the
bpf_dynptr_read() and write(). Since it is __user pointer, it won't be directly
accessible through data slice with bpf_dynptr_data(). It should not be a perf
issue, most of the common optval is an integer. The worst common case is the 16
bytes tcp-cc name. The bpf prog has to be sleepable first though which I think
will be a useful thing to have.
prev parent reply other threads:[~2022-10-27 23:46 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-27 1:14 [Question]: BPF_CGROUP_{GET,SET}SOCKOPT handling when optlen > PAGE_SIZE Martin KaFai Lau
2022-10-27 2:03 ` Stanislav Fomichev
2022-10-27 6:15 ` Martin KaFai Lau
2022-10-27 16:23 ` Stanislav Fomichev
2022-10-27 17:28 ` Martin KaFai Lau
2022-10-27 17:40 ` Stanislav Fomichev
2022-10-27 18:48 ` Martin KaFai Lau
2022-10-27 19:11 ` Stanislav Fomichev
2022-10-27 20:04 ` Martin KaFai Lau
2022-10-27 20:14 ` Stanislav Fomichev
2022-10-27 20:46 ` Andrii Nakryiko
2022-10-27 23:46 ` Martin KaFai Lau [this message]
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=4dbbbdf1-0253-9101-1fc7-a4685970f4d7@linux.dev \
--to=martin.lau@linux.dev \
--cc=andrii.nakryiko@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=sdf@google.com \
/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