All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin KaFai Lau <martin.lau@linux.dev>
To: Jakub Sitnicki <jakub@cloudflare.com>
Cc: "Alexei Starovoitov" <ast@kernel.org>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Arthur Fabre" <arthur@arthurfabre.com>,
	"Daniel Borkmann" <daniel@iogearbox.net>,
	"Eduard Zingerman" <eddyz87@gmail.com>,
	"Eric Dumazet" <edumazet@google.com>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Jesper Dangaard Brouer" <hawk@kernel.org>,
	"Jesse Brandeburg" <jbrandeburg@cloudflare.com>,
	"Joanne Koong" <joannelkoong@gmail.com>,
	"Lorenzo Bianconi" <lorenzo@kernel.org>,
	"Toke Høiland-Jørgensen" <thoiland@redhat.com>,
	"Yan Zhai" <yan@cloudflare.com>,
	kernel-team@cloudflare.com, netdev@vger.kernel.org,
	bpf@vger.kernel.org, "Stanislav Fomichev" <sdf@fomichev.me>
Subject: Re: [PATCH bpf-next v6 9/9] selftests/bpf: Cover metadata access from a modified skb clone
Date: Tue, 12 Aug 2025 11:20:35 -0700	[thread overview]
Message-ID: <ff37dd97-dde7-48a3-9bb6-7d424f94e345@linux.dev> (raw)
In-Reply-To: <87tt2cr8eb.fsf@cloudflare.com>

On 8/12/25 6:12 AM, Jakub Sitnicki wrote:
>> No strong opinion to either copy the metadata on a clone or set the dynptr
>> rdonly for a clone. I am ok with either way.
>>
>> A brain dump:
>> On one hand, it is hard to comment without visibility on how will it look like
>> when data_meta can be preserved in the future, e.g. what may be the overhead but
>> there is flags in bpf_dynptr_from_skb_meta and bpf_dynptr_write, so there is
>> some flexibility. On the other hand, having a copy will be less surprise on the
>> clone skb like what we have discovered in this and the earlier email thread but
>> I suspect there is actually no write use case on the skb data_meta now.
> 
> All makes sense.
> 
> To keep things simple and consistent, it would be best to have a single
> unclone (bpf_try_make_writable) point caused by a write to metadata
> through an skb clone.
> 
> Today, the unclone in the prologue can already be triggered by a write
> to data_meta from a dead branch. Despite being useless, since
> pskb_expand_head resets meta_len.
> 
> We also need the prologue unclone for bpf_dynptr_slice_rdwr created from
> an skb_meta dynptr, because creating a slice does not invalidate packet
> pointers by contract.
> 
> So I'm thinking it makes sense to unclone in the prologue if we see a
> potential bpf_dynptr_write to skb_meta dynptr as well. This could be
> done by tweaking check_helper_call to set the seen_direct_write flag:
> 
> static int check_helper_call(...)
> {
>          // ...
>         	switch (func_id) {
>          // ...
> 	case BPF_FUNC_dynptr_write:
> 	{
>                  // ...
> 		dynptr_type = dynptr_get_type(env, reg);
>                  // ...
> 		if (dynptr_type == BPF_DYNPTR_TYPE_SKB ||
> 		    dynptr_type == BPF_DYNPTR_TYPE_SKB_META)
> 			changes_data = true;

This looks ok.

> 		if (dynptr_type == BPF_DYNPTR_TYPE_SKB_META)
> 			env->seen_direct_write = true;

The "seen_direct_write = true;" addition will be gone from the verifier 
eventually when pskb_expand_head can keep the data_meta (?). Right, there are 
existing cases that the prologue call might be unnecessary. However, I don't 
think it should be the reason that it can set "seen_direct_write" on top of the 
"changes_data". I think it is confusing.

> 
> 		break;
> 	}
>          // ...
> }
> 
> That would my the plan for the next iteration, if it sounds sensible.
> 
> As for keeping metadata intact past a pskb_expand_head call, on second
> thought, I'd leave that for the next patch set, to keep the patch count
> within single digits.

If the plan is to make pskb_expand_head support the data_meta later, just set 
the rdonly bit in the bpf_dynptr_from_skb_meta now. Then the future 
pskb_expand_head change will be a clean change in netdev and filter.c, and no 
need to revert the "seen_direct_write" changes from the verifier.

  reply	other threads:[~2025-08-12 18:20 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-04 12:52 [PATCH bpf-next v6 0/9] Add a dynptr type for skb metadata for TC BPF Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 1/9] bpf: Add dynptr type for skb metadata Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 2/9] bpf: Enable read/write access to skb metadata through a dynptr Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 3/9] selftests/bpf: Cover verifier checks for skb_meta dynptr type Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 4/9] selftests/bpf: Pass just bpf_map to xdp_context_test helper Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 5/9] selftests/bpf: Parametrize test_xdp_context_tuntap Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 6/9] selftests/bpf: Cover read access to skb metadata via dynptr Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 7/9] selftests/bpf: Cover write " Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 8/9] selftests/bpf: Cover read/write to skb metadata at an offset Jakub Sitnicki
2025-08-04 12:52 ` [PATCH bpf-next v6 9/9] selftests/bpf: Cover metadata access from a modified skb clone Jakub Sitnicki
2025-08-08  0:33   ` Martin KaFai Lau
2025-08-08 11:41     ` Jakub Sitnicki
2025-08-08 21:31       ` Martin KaFai Lau
2025-08-12 13:12         ` Jakub Sitnicki
2025-08-12 18:20           ` Martin KaFai Lau [this message]
2025-08-13 10:51             ` Jakub Sitnicki

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=ff37dd97-dde7-48a3-9bb6-7d424f94e345@linux.dev \
    --to=martin.lau@linux.dev \
    --cc=andrii@kernel.org \
    --cc=arthur@arthurfabre.com \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=edumazet@google.com \
    --cc=hawk@kernel.org \
    --cc=jakub@cloudflare.com \
    --cc=jbrandeburg@cloudflare.com \
    --cc=joannelkoong@gmail.com \
    --cc=kernel-team@cloudflare.com \
    --cc=kuba@kernel.org \
    --cc=lorenzo@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=sdf@fomichev.me \
    --cc=thoiland@redhat.com \
    --cc=yan@cloudflare.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.