Commit 185da3da authored by Jakob Koschel's avatar Jakob Koschel Committed by Andrii Nakryiko

bpf: Replace usage of supported with dedicated list iterator variable

To move the list iterator variable into the list_for_each_entry_*()
macro in the future it should be avoided to use the list iterator
variable after the loop body.

To *never* use the list iterator variable after the loop it was
concluded to use a separate iterator variable instead of a
found boolean [1].

This removes the need to use the found variable (existed & supported)
and simply checking if the variable was set, can determine if the
break/goto was hit.

[1] https://lore.kernel.org/all/CAHk-=wgRr_D8CB-D9Kg-c=EHreAsk5SqXPwr9Y7k9sA6cWXJ6w@mail.gmail.com/Signed-off-by: default avatarJakob Koschel <jakobkoschel@gmail.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarYonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20220331091929.647057-1-jakobkoschel@gmail.com
parent 891663ac
...@@ -330,35 +330,34 @@ static void cache_btf_id(struct bpf_iter_target_info *tinfo, ...@@ -330,35 +330,34 @@ static void cache_btf_id(struct bpf_iter_target_info *tinfo,
bool bpf_iter_prog_supported(struct bpf_prog *prog) bool bpf_iter_prog_supported(struct bpf_prog *prog)
{ {
const char *attach_fname = prog->aux->attach_func_name; const char *attach_fname = prog->aux->attach_func_name;
struct bpf_iter_target_info *tinfo = NULL, *iter;
u32 prog_btf_id = prog->aux->attach_btf_id; u32 prog_btf_id = prog->aux->attach_btf_id;
const char *prefix = BPF_ITER_FUNC_PREFIX; const char *prefix = BPF_ITER_FUNC_PREFIX;
struct bpf_iter_target_info *tinfo;
int prefix_len = strlen(prefix); int prefix_len = strlen(prefix);
bool supported = false;
if (strncmp(attach_fname, prefix, prefix_len)) if (strncmp(attach_fname, prefix, prefix_len))
return false; return false;
mutex_lock(&targets_mutex); mutex_lock(&targets_mutex);
list_for_each_entry(tinfo, &targets, list) { list_for_each_entry(iter, &targets, list) {
if (tinfo->btf_id && tinfo->btf_id == prog_btf_id) { if (iter->btf_id && iter->btf_id == prog_btf_id) {
supported = true; tinfo = iter;
break; break;
} }
if (!strcmp(attach_fname + prefix_len, tinfo->reg_info->target)) { if (!strcmp(attach_fname + prefix_len, iter->reg_info->target)) {
cache_btf_id(tinfo, prog); cache_btf_id(iter, prog);
supported = true; tinfo = iter;
break; break;
} }
} }
mutex_unlock(&targets_mutex); mutex_unlock(&targets_mutex);
if (supported) { if (tinfo) {
prog->aux->ctx_arg_info_size = tinfo->reg_info->ctx_arg_info_size; prog->aux->ctx_arg_info_size = tinfo->reg_info->ctx_arg_info_size;
prog->aux->ctx_arg_info = tinfo->reg_info->ctx_arg_info; prog->aux->ctx_arg_info = tinfo->reg_info->ctx_arg_info;
} }
return supported; return tinfo != NULL;
} }
const struct bpf_func_proto * const struct bpf_func_proto *
...@@ -499,12 +498,11 @@ bool bpf_link_is_iter(struct bpf_link *link) ...@@ -499,12 +498,11 @@ bool bpf_link_is_iter(struct bpf_link *link)
int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr, int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr,
struct bpf_prog *prog) struct bpf_prog *prog)
{ {
struct bpf_iter_target_info *tinfo = NULL, *iter;
struct bpf_link_primer link_primer; struct bpf_link_primer link_primer;
struct bpf_iter_target_info *tinfo;
union bpf_iter_link_info linfo; union bpf_iter_link_info linfo;
struct bpf_iter_link *link; struct bpf_iter_link *link;
u32 prog_btf_id, linfo_len; u32 prog_btf_id, linfo_len;
bool existed = false;
bpfptr_t ulinfo; bpfptr_t ulinfo;
int err; int err;
...@@ -530,14 +528,14 @@ int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr, ...@@ -530,14 +528,14 @@ int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr,
prog_btf_id = prog->aux->attach_btf_id; prog_btf_id = prog->aux->attach_btf_id;
mutex_lock(&targets_mutex); mutex_lock(&targets_mutex);
list_for_each_entry(tinfo, &targets, list) { list_for_each_entry(iter, &targets, list) {
if (tinfo->btf_id == prog_btf_id) { if (iter->btf_id == prog_btf_id) {
existed = true; tinfo = iter;
break; break;
} }
} }
mutex_unlock(&targets_mutex); mutex_unlock(&targets_mutex);
if (!existed) if (!tinfo)
return -ENOENT; return -ENOENT;
link = kzalloc(sizeof(*link), GFP_USER | __GFP_NOWARN); link = kzalloc(sizeof(*link), GFP_USER | __GFP_NOWARN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment