提交 48c23bd7 编写于 作者: R Ren Zhijie 提交者: Zheng Zengkai

sched: programmable: add bpf_sched_tg_tag_of helper function

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5KUFB
CVE: NA

--------------------------------

This helper function read the task group tag for a task.
The bpf prog obtains the tags to detect different workloads.
Signed-off-by: NRen Zhijie <renzhijie2@huawei.com>
Signed-off-by: NChen Hui <judy.chenhui@huawei.com>
上级 d5aa2997
...@@ -3777,6 +3777,14 @@ union bpf_attr { ...@@ -3777,6 +3777,14 @@ union bpf_attr {
* to be enabled. * to be enabled.
* Return * Return
* 1 if the sched entity belongs to a cgroup, 0 otherwise. * 1 if the sched entity belongs to a cgroup, 0 otherwise.
*
* long bpf_sched_tg_tag_of(struct task_group *tg)
* Description
* Return task group tag of *tg* if CONFIG_CGROUP_SCHED enabled.
* The bpf prog obtains the tags to detect different workloads.
* Return
* Task group tag, if CONFIG_CGROUP_SCHED enabled, 0 as default tag, or
* a negative error in case of failure.
*/ */
#define __BPF_FUNC_MAPPER(FN) \ #define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \ FN(unspec), \
...@@ -3940,6 +3948,7 @@ union bpf_attr { ...@@ -3940,6 +3948,7 @@ union bpf_attr {
FN(sched_entity_to_tgidpid), \ FN(sched_entity_to_tgidpid), \
FN(sched_entity_to_cgrpid), \ FN(sched_entity_to_cgrpid), \
FN(sched_entity_belongs_to_cgrp), \ FN(sched_entity_belongs_to_cgrp), \
FN(sched_tg_tag_of), \
/* */ /* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper /* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
...@@ -658,6 +658,7 @@ const struct bpf_func_proto bpf_probe_read_user_proto __weak; ...@@ -658,6 +658,7 @@ const struct bpf_func_proto bpf_probe_read_user_proto __weak;
const struct bpf_func_proto bpf_probe_read_user_str_proto __weak; const struct bpf_func_proto bpf_probe_read_user_str_proto __weak;
const struct bpf_func_proto bpf_probe_read_kernel_proto __weak; const struct bpf_func_proto bpf_probe_read_kernel_proto __weak;
const struct bpf_func_proto bpf_probe_read_kernel_str_proto __weak; const struct bpf_func_proto bpf_probe_read_kernel_str_proto __weak;
const struct bpf_func_proto bpf_sched_tg_tag_of_proto __weak;
const struct bpf_func_proto * const struct bpf_func_proto *
bpf_base_func_proto(enum bpf_func_id func_id) bpf_base_func_proto(enum bpf_func_id func_id)
...@@ -697,6 +698,8 @@ bpf_base_func_proto(enum bpf_func_id func_id) ...@@ -697,6 +698,8 @@ bpf_base_func_proto(enum bpf_func_id func_id)
return &bpf_ringbuf_discard_proto; return &bpf_ringbuf_discard_proto;
case BPF_FUNC_ringbuf_query: case BPF_FUNC_ringbuf_query:
return &bpf_ringbuf_query_proto; return &bpf_ringbuf_query_proto;
case BPF_FUNC_sched_tg_tag_of:
return &bpf_sched_tg_tag_of_proto;
default: default:
break; break;
} }
......
...@@ -5020,10 +5020,10 @@ static bool check_btf_id_ok(const struct bpf_func_proto *fn) ...@@ -5020,10 +5020,10 @@ static bool check_btf_id_ok(const struct bpf_func_proto *fn)
int i; int i;
for (i = 0; i < ARRAY_SIZE(fn->arg_type); i++) { for (i = 0; i < ARRAY_SIZE(fn->arg_type); i++) {
if (fn->arg_type[i] == ARG_PTR_TO_BTF_ID && !fn->arg_btf_id[i]) if (base_type(fn->arg_type[i]) == ARG_PTR_TO_BTF_ID && !fn->arg_btf_id[i])
return false; return false;
if (fn->arg_type[i] != ARG_PTR_TO_BTF_ID && fn->arg_btf_id[i]) if (base_type(fn->arg_type[i]) != ARG_PTR_TO_BTF_ID && fn->arg_btf_id[i])
return false; return false;
} }
......
...@@ -112,6 +112,29 @@ static const struct bpf_func_proto bpf_sched_entity_belongs_to_cgrp_proto = { ...@@ -112,6 +112,29 @@ static const struct bpf_func_proto bpf_sched_entity_belongs_to_cgrp_proto = {
.arg2_type = ARG_ANYTHING, .arg2_type = ARG_ANYTHING,
}; };
BPF_CALL_1(bpf_sched_tg_tag_of, struct task_group *, tg)
{
int ret = 0;
#ifdef CONFIG_CGROUP_SCHED
if (tg == NULL)
return -EINVAL;
ret = tg->tag;
#endif
return ret;
}
BTF_ID_LIST_SINGLE(btf_sched_tg_ids, struct, task_group)
const struct bpf_func_proto bpf_sched_tg_tag_of_proto = {
.func = bpf_sched_tg_tag_of,
.gpl_only = false,
.ret_type = RET_INTEGER,
.arg1_type = PTR_MAYBE_NULL | ARG_PTR_TO_BTF_ID,
.arg1_btf_id = &btf_sched_tg_ids[0],
};
static const struct bpf_func_proto * static const struct bpf_func_proto *
bpf_sched_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) bpf_sched_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{ {
......
...@@ -436,6 +436,7 @@ class PrinterHelpers(Printer): ...@@ -436,6 +436,7 @@ class PrinterHelpers(Printer):
'struct path', 'struct path',
'struct btf_ptr', 'struct btf_ptr',
'struct sched_entity', 'struct sched_entity',
'struct task_group',
] ]
known_types = { known_types = {
'...', '...',
...@@ -480,6 +481,7 @@ class PrinterHelpers(Printer): ...@@ -480,6 +481,7 @@ class PrinterHelpers(Printer):
'struct path', 'struct path',
'struct btf_ptr', 'struct btf_ptr',
'struct sched_entity', 'struct sched_entity',
'struct task_group',
} }
mapped_types = { mapped_types = {
'u8': '__u8', 'u8': '__u8',
......
...@@ -3777,6 +3777,14 @@ union bpf_attr { ...@@ -3777,6 +3777,14 @@ union bpf_attr {
* to be enabled. * to be enabled.
* Return * Return
* 1 if the sched entity belongs to a cgroup, 0 otherwise. * 1 if the sched entity belongs to a cgroup, 0 otherwise.
*
* long bpf_sched_tg_tag_of(struct task_group *tg)
* Description
* Return task group tag of *tg* if CONFIG_CGROUP_SCHED enabled.
* The bpf prog obtains the tags to detect different workloads.
* Return
* Task group tag, if CONFIG_CGROUP_SCHED enabled, 0 as default tag, or
* a negative error in case of failure.
*/ */
#define __BPF_FUNC_MAPPER(FN) \ #define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \ FN(unspec), \
...@@ -3940,6 +3948,7 @@ union bpf_attr { ...@@ -3940,6 +3948,7 @@ union bpf_attr {
FN(sched_entity_to_tgidpid), \ FN(sched_entity_to_tgidpid), \
FN(sched_entity_to_cgrpid), \ FN(sched_entity_to_cgrpid), \
FN(sched_entity_belongs_to_cgrp), \ FN(sched_entity_belongs_to_cgrp), \
FN(sched_tg_tag_of), \
/* */ /* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper /* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册