-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bpf: Implement an interface to register bpf_iter targets
The target can call bpf_iter_reg_target() to register itself. The needed information: target: target name seq_ops: the seq_file operations for the target init_seq_private target callback to initialize seq_priv during file open fini_seq_private target callback to clean up seq_priv during file release seq_priv_size: the private_data size needed by the seq_file operations The target name represents a target which provides a seq_ops for iterating objects. The target can provide two callback functions, init_seq_private and fini_seq_private, called during file open/release time. For example, /proc/net/{tcp6, ipv6_route, netlink, ...}, net name space needs to be setup properly during file open and released properly during file release. Function bpf_iter_unreg_target() is also implemented to unregister a particular target. Signed-off-by: Yonghong Song <yhs@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200509175859.2474669-1-yhs@fb.com
- Loading branch information
Yonghong Song
authored and
Alexei Starovoitov
committed
May 10, 2020
1 parent
8086fba
commit ae24345
Showing
3 changed files
with
75 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* Copyright (c) 2020 Facebook */ | ||
|
||
#include <linux/fs.h> | ||
#include <linux/filter.h> | ||
#include <linux/bpf.h> | ||
|
||
struct bpf_iter_target_info { | ||
struct list_head list; | ||
const char *target; | ||
const struct seq_operations *seq_ops; | ||
bpf_iter_init_seq_priv_t init_seq_private; | ||
bpf_iter_fini_seq_priv_t fini_seq_private; | ||
u32 seq_priv_size; | ||
}; | ||
|
||
static struct list_head targets = LIST_HEAD_INIT(targets); | ||
static DEFINE_MUTEX(targets_mutex); | ||
|
||
int bpf_iter_reg_target(struct bpf_iter_reg *reg_info) | ||
{ | ||
struct bpf_iter_target_info *tinfo; | ||
|
||
tinfo = kmalloc(sizeof(*tinfo), GFP_KERNEL); | ||
if (!tinfo) | ||
return -ENOMEM; | ||
|
||
tinfo->target = reg_info->target; | ||
tinfo->seq_ops = reg_info->seq_ops; | ||
tinfo->init_seq_private = reg_info->init_seq_private; | ||
tinfo->fini_seq_private = reg_info->fini_seq_private; | ||
tinfo->seq_priv_size = reg_info->seq_priv_size; | ||
INIT_LIST_HEAD(&tinfo->list); | ||
|
||
mutex_lock(&targets_mutex); | ||
list_add(&tinfo->list, &targets); | ||
mutex_unlock(&targets_mutex); | ||
|
||
return 0; | ||
} | ||
|
||
void bpf_iter_unreg_target(const char *target) | ||
{ | ||
struct bpf_iter_target_info *tinfo; | ||
bool found = false; | ||
|
||
mutex_lock(&targets_mutex); | ||
list_for_each_entry(tinfo, &targets, list) { | ||
if (!strcmp(target, tinfo->target)) { | ||
list_del(&tinfo->list); | ||
kfree(tinfo); | ||
found = true; | ||
break; | ||
} | ||
} | ||
mutex_unlock(&targets_mutex); | ||
|
||
WARN_ON(found == false); | ||
} |