diff options
Diffstat (limited to 'kernel/bpf/helpers.c')
| -rw-r--r-- | kernel/bpf/helpers.c | 63 | 
1 files changed, 63 insertions, 0 deletions
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index d8b7b110a1c5..bafc53ddd350 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -12,6 +12,8 @@  #include <linux/filter.h>  #include <linux/ctype.h>  #include <linux/jiffies.h> +#include <linux/pid_namespace.h> +#include <linux/proc_ns.h>  #include "../../lib/kstrtox.h" @@ -338,6 +340,24 @@ const struct bpf_func_proto bpf_get_current_cgroup_id_proto = {  	.ret_type	= RET_INTEGER,  }; +BPF_CALL_1(bpf_get_current_ancestor_cgroup_id, int, ancestor_level) +{ +	struct cgroup *cgrp = task_dfl_cgroup(current); +	struct cgroup *ancestor; + +	ancestor = cgroup_ancestor(cgrp, ancestor_level); +	if (!ancestor) +		return 0; +	return cgroup_id(ancestor); +} + +const struct bpf_func_proto bpf_get_current_ancestor_cgroup_id_proto = { +	.func		= bpf_get_current_ancestor_cgroup_id, +	.gpl_only	= false, +	.ret_type	= RET_INTEGER, +	.arg1_type	= ARG_ANYTHING, +}; +  #ifdef CONFIG_CGROUP_BPF  DECLARE_PER_CPU(struct bpf_cgroup_storage*,  		bpf_cgroup_storage[MAX_BPF_CGROUP_STORAGE_TYPE]); @@ -499,3 +519,46 @@ const struct bpf_func_proto bpf_strtoul_proto = {  	.arg4_type	= ARG_PTR_TO_LONG,  };  #endif + +BPF_CALL_4(bpf_get_ns_current_pid_tgid, u64, dev, u64, ino, +	   struct bpf_pidns_info *, nsdata, u32, size) +{ +	struct task_struct *task = current; +	struct pid_namespace *pidns; +	int err = -EINVAL; + +	if (unlikely(size != sizeof(struct bpf_pidns_info))) +		goto clear; + +	if (unlikely((u64)(dev_t)dev != dev)) +		goto clear; + +	if (unlikely(!task)) +		goto clear; + +	pidns = task_active_pid_ns(task); +	if (unlikely(!pidns)) { +		err = -ENOENT; +		goto clear; +	} + +	if (!ns_match(&pidns->ns, (dev_t)dev, ino)) +		goto clear; + +	nsdata->pid = task_pid_nr_ns(task, pidns); +	nsdata->tgid = task_tgid_nr_ns(task, pidns); +	return 0; +clear: +	memset((void *)nsdata, 0, (size_t) size); +	return err; +} + +const struct bpf_func_proto bpf_get_ns_current_pid_tgid_proto = { +	.func		= bpf_get_ns_current_pid_tgid, +	.gpl_only	= false, +	.ret_type	= RET_INTEGER, +	.arg1_type	= ARG_ANYTHING, +	.arg2_type	= ARG_ANYTHING, +	.arg3_type      = ARG_PTR_TO_UNINIT_MEM, +	.arg4_type      = ARG_CONST_SIZE, +};  |