All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin KaFai Lau <martin.lau@linux.dev>
To: Kui-Feng Lee <sinquersw@gmail.com>, thinker.li@gmail.com
Cc: kuifeng@meta.com, bpf@vger.kernel.org, ast@kernel.org,
	song@kernel.org, kernel-team@meta.com, andrii@kernel.org,
	drosen@google.com
Subject: Re: [PATCH bpf-next v13 04/14] bpf: add struct_ops_tab to btf.
Date: Fri, 15 Dec 2023 17:19:48 -0800	[thread overview]
Message-ID: <44dc6eb4-d524-4180-8970-4eef2a9b9f58@linux.dev> (raw)
In-Reply-To: <fc15849b-2f71-420e-aab4-7a20014cba49@gmail.com>

On 12/15/23 1:42 PM, Kui-Feng Lee wrote:
> 
> 
> On 12/14/23 18:22, Martin KaFai Lau wrote:
>> On 12/8/23 4:26 PM, thinker.li@gmail.com wrote:
>>> +const struct bpf_struct_ops_desc *btf_get_struct_ops(struct btf *btf, u32 
>>> *ret_cnt)
>>> +{
>>> +    if (!btf)
>>> +        return NULL;
>>> +    if (!btf->struct_ops_tab)
>>
>>          *ret_cnt = 0;
>>
>> unless the later patch checks the return value NULL before using *ret_cnt.
>> Anyway, better to set *ret_cnt to 0 if the btf has no struct_ops.
>>
>> The same should go for the "!btf" case above but I suspect the above !btf 
>> check is unnecessary also and the caller should have checked for !btf itself 
>> instead of expecting a list of struct_ops from a NULL btf. Lets continue the 
>> review on the later patches for now to confirm where the above !btf case might 
>> happen.
> 
> Checking callers, I didn't find anything that make btf here NULL so far.

> It is safe to remove !btf check. For the same reason as assigning
> *ret_cnt for safe, this check should be fine here as well, right?

If for safety, why ref_cnt is not checked for NULL also? The userspace passed-in 
btf should have been checked for NULL long time before reaching here. There is 
no need to be over protective here. It would really need a BUG_ON instead if btf 
was NULL here (don't add a BUG_ON though).

afaict, no function in btf.c is checking the btf argument for NULL also.

> 
> I don't have strong opinion here. What I though is to keep the values
> as it is without any side-effect if the function call fails and if
> possible. And, the callers should not expect the callee to set some
> specific values when a call fails.

For *ref_cnt stay uninit, there is a bug in patch 10 which exactly assumes 0 is 
set in *ret_cnt when there is no struct_ops. It is a good signal on how this 
function will be used.

I think it is arguable whether returning NULL here is failure. I would argue 
getting a 0 struct_ops_desc array is not a failure. It is why the !btf case 
confuses the return NULL case to mean a never would happen error instead of 
meaning there is no struct_ops. Taking out the !btf case, NULL means there is no 
struct_ops (instead of failure), so 0 cnt.

Anyhow, either assign 0 to *ret_cnt here, or fix patch 10 to init the local cnt 
0 and write a warning comment here in btf_get_struct_ops() saying ret_cnt won't 
be set when there is no struct_ops in the btf.

When looking at it again, how about moving the bpf_struct_ops_find_*() to btf.c. 
Then it will avoid the need of the new btf_get_struct_ops() function. 
bpf_struct_ops_find_*() can directly use the btf->struct_ops_tab.


> 
>>
>>> +        return NULL;
>>> +
>>> +    *ret_cnt = btf->struct_ops_tab->cnt;
>>> +    return (const struct bpf_struct_ops_desc *)btf->struct_ops_tab->ops;
>>> +}
>>


  reply	other threads:[~2023-12-16  1:19 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-09  0:26 [PATCH bpf-next v13 00/14] Registrating struct_ops types from modules thinker.li
2023-12-09  0:26 ` [PATCH bpf-next v13 01/14] bpf: refactory struct_ops type initialization to a function thinker.li
2023-12-09  0:26 ` [PATCH bpf-next v13 02/14] bpf: get type information with BPF_ID_LIST thinker.li
2023-12-15  1:59   ` Martin KaFai Lau
2023-12-09  0:26 ` [PATCH bpf-next v13 03/14] bpf, net: introduce bpf_struct_ops_desc thinker.li
2023-12-15  2:05   ` Martin KaFai Lau
2023-12-09  0:26 ` [PATCH bpf-next v13 04/14] bpf: add struct_ops_tab to btf thinker.li
2023-12-15  2:22   ` Martin KaFai Lau
2023-12-15 21:42     ` Kui-Feng Lee
2023-12-16  1:19       ` Martin KaFai Lau [this message]
2023-12-16  5:43         ` Kui-Feng Lee
2023-12-16 16:48           ` Martin KaFai Lau
2023-12-17  7:09             ` Kui-Feng Lee
2023-12-09  0:27 ` [PATCH bpf-next v13 05/14] bpf: make struct_ops_map support btfs other than btf_vmlinux thinker.li
2023-12-09  0:27 ` [PATCH bpf-next v13 06/14] bpf: lookup struct_ops types from a given module BTF thinker.li
2023-12-09  0:27 ` [PATCH bpf-next v13 07/14] bpf: pass attached BTF to the bpf_struct_ops subsystem thinker.li
2023-12-15  2:44   ` Martin KaFai Lau
2023-12-15 22:10     ` Kui-Feng Lee
2023-12-16  0:19       ` Martin KaFai Lau
2023-12-16  5:55         ` Kui-Feng Lee
2023-12-16  6:07           ` Kui-Feng Lee
2023-12-16 16:41             ` Martin KaFai Lau
2023-12-16 19:38               ` Kui-Feng Lee
2023-12-09  0:27 ` [PATCH bpf-next v13 08/14] bpf: hold module for bpf_struct_ops_map thinker.li
2023-12-15  5:54   ` Martin KaFai Lau
2023-12-15 23:25     ` Kui-Feng Lee
2023-12-09  0:27 ` [PATCH bpf-next v13 09/14] bpf: validate value_type thinker.li
2023-12-15  6:02   ` Martin KaFai Lau
2023-12-15 23:52     ` Kui-Feng Lee
2023-12-09  0:27 ` [PATCH bpf-next v13 10/14] bpf, net: switch to dynamic registration thinker.li
2023-12-15  6:51   ` Martin KaFai Lau
2023-12-09  0:27 ` [PATCH bpf-next v13 11/14] libbpf: Find correct module BTFs for struct_ops maps and progs thinker.li
2023-12-09  0:27 ` [PATCH bpf-next v13 12/14] bpf: export btf_ctx_access to modules thinker.li
2023-12-09  0:27 ` [PATCH bpf-next v13 13/14] selftests/bpf: test case for register_bpf_struct_ops() thinker.li
2023-12-15  7:17   ` Martin KaFai Lau
2023-12-17  7:32     ` Kui-Feng Lee
2023-12-09  0:27 ` [PATCH bpf-next v13 14/14] bpf: pass btf object id in bpf_map_info thinker.li
2023-12-15  7:46   ` Martin KaFai Lau
2023-12-17  7:35     ` 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=44dc6eb4-d524-4180-8970-4eef2a9b9f58@linux.dev \
    --to=martin.lau@linux.dev \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=drosen@google.com \
    --cc=kernel-team@meta.com \
    --cc=kuifeng@meta.com \
    --cc=sinquersw@gmail.com \
    --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 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.