BPF List
 help / color / mirror / Atom feed
From: Kui-Feng Lee <sinquersw@gmail.com>
To: Eduard Zingerman <eddyz87@gmail.com>,
	Kui-Feng Lee <thinker.li@gmail.com>,
	bpf@vger.kernel.org, ast@kernel.org, martin.lau@linux.dev,
	song@kernel.org, kernel-team@meta.com, andrii@kernel.org
Cc: kuifeng@meta.com
Subject: Re: [PATCH bpf-next 06/11] bpf: Find btf_field with the knowledge of arrays.
Date: Thu, 11 Apr 2024 19:00:15 -0700	[thread overview]
Message-ID: <4754fd2d-e351-4f77-afd7-df13bf6e2479@gmail.com> (raw)
In-Reply-To: <3ccb7e3c1b71bfe63606565d0a1b418876b45535.camel@gmail.com>



On 4/11/24 15:14, Eduard Zingerman wrote:
> On Tue, 2024-04-09 at 17:41 -0700, Kui-Feng Lee wrote:
>> Make btf_record_find() find the btf_field for an offset by comparing the
>> offset with the offset of each element, rather than the offset of the
>> entire array, if a btf_field represents an array. It is important to have
>> support for btf_field arrays in the future.
>>
>> Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com>
>> ---
>>   kernel/bpf/syscall.c | 19 +++++++++++++++----
>>   1 file changed, 15 insertions(+), 4 deletions(-)
>>
>> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
>> index 543ff0d944e8..1a37731e632a 100644
>> --- a/kernel/bpf/syscall.c
>> +++ b/kernel/bpf/syscall.c
>> @@ -516,11 +516,18 @@ int bpf_map_alloc_pages(const struct bpf_map *map, gfp_t gfp, int nid,
>>   static int btf_field_cmp(const void *a, const void *b)
>>   {
>>   	const struct btf_field *f1 = a, *f2 = b;
>> +	int gt = 1, lt = -1;
>>   
>> +	if (f2->nelems == 0) {
>> +		swap(f1, f2);
>> +		swap(gt, lt);
>> +	}
>>   	if (f1->offset < f2->offset)
>> -		return -1;
>> -	else if (f1->offset > f2->offset)
>> -		return 1;
>> +		return lt;
>> +	else if (f1->offset >= f2->offset + f2->size)
>> +		return gt;
>> +	if ((f1->offset - f2->offset) % (f2->size / f2->nelems))
>> +		return gt;
> 
> Binary search requires elements to be sorted in non-decreasing order,
> however usage of '%' breaks this requirement. E.g. consider an array
> with element size equal to 3:
> 
>     |  elem #0  |  elem #1  |
>     | 0 | 1 | 2 | 3 | 4 | 5 |
>     ^         ^   ^
>     '         '   '
>     f2        f1  f1'
>     
> Here f1 > f2, but f1' == f2, while f1' > f1.
> Depending on whether or not fields can overlap this might not be a problem,
> but I suggest to rework the comparison function to avoid this confusion.
> (E.g., find the leftmost field that overlaps with offset being searched for).

Ok! It will match the leftmost one overlapping with the offset. And
check if the offset aligning with one of the elements in btf_record_find().

> 
>>   	return 0;
>>   }
>>   
>> @@ -528,10 +535,14 @@ struct btf_field *btf_record_find(const struct btf_record *rec, u32 offset,
>>   				  u32 field_mask)
>>   {
>>   	struct btf_field *field;
>> +	struct btf_field key = {
>> +		.offset = offset,
>> +		.size = 0,	/* as a label for this key */
>> +	};
>>   
>>   	if (IS_ERR_OR_NULL(rec) || !(rec->field_mask & field_mask))
>>   		return NULL;
>> -	field = bsearch(&offset, rec->fields, rec->cnt, sizeof(rec->fields[0]), btf_field_cmp);
>> +	field = bsearch(&key, rec->fields, rec->cnt, sizeof(rec->fields[0]), btf_field_cmp);
>>   	if (!field || !(field->type & field_mask))
>>   		return NULL;
>>   	return field;
> 
> 

  reply	other threads:[~2024-04-12  2:00 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-10  0:41 [PATCH bpf-next 00/11] Enable BPF programs to declare arrays of kptr, bpf_rb_root, and bpf_list_head Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 01/11] bpf: Remove unnecessary checks on the offset of btf_field Kui-Feng Lee
2024-04-11 22:12   ` Eduard Zingerman
2024-04-10  0:41 ` [PATCH bpf-next 02/11] bpf: Remove unnecessary call to btf_field_type_size() Kui-Feng Lee
2024-04-11 22:12   ` Eduard Zingerman
2024-04-10  0:41 ` [PATCH bpf-next 03/11] bpf: Add nelems to struct btf_field_info and btf_field Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 04/11] bpf: check_map_kptr_access() compute the offset from the reg state Kui-Feng Lee
2024-04-11 22:13   ` Eduard Zingerman
2024-04-12  4:00     ` Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 05/11] bpf: initialize/free array of btf_field(s) Kui-Feng Lee
2024-04-11 22:13   ` Eduard Zingerman
2024-04-12  3:56     ` Kui-Feng Lee
2024-04-12 15:32       ` Eduard Zingerman
2024-04-12 17:00         ` Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 06/11] bpf: Find btf_field with the knowledge of arrays Kui-Feng Lee
2024-04-11 22:14   ` Eduard Zingerman
2024-04-12  2:00     ` Kui-Feng Lee [this message]
2024-04-10  0:41 ` [PATCH bpf-next 07/11] bpf: check_map_access() " Kui-Feng Lee
2024-04-11 22:14   ` Eduard Zingerman
2024-04-12 16:32     ` Kui-Feng Lee
2024-04-12 19:08       ` Eduard Zingerman
2024-04-12 19:29         ` Kui-Feng Lee
2024-04-12 19:50           ` Eduard Zingerman
2024-04-10  0:41 ` [PATCH bpf-next 08/11] bpf: Enable and verify btf_field arrays Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 09/11] selftests/bpf: Test global kptr arrays Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 10/11] selftests/bpf: Test global bpf_rb_root arrays Kui-Feng Lee
2024-04-10  0:41 ` [PATCH bpf-next 11/11] selftests/bpf: Test global bpf_list_head arrays Kui-Feng Lee

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=4754fd2d-e351-4f77-afd7-df13bf6e2479@gmail.com \
    --to=sinquersw@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=eddyz87@gmail.com \
    --cc=kernel-team@meta.com \
    --cc=kuifeng@meta.com \
    --cc=martin.lau@linux.dev \
    --cc=song@kernel.org \
    --cc=thinker.li@gmail.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