提交 ba17a51b 编写于 作者: G Guan Jing 提交者: Zheng Zengkai

samples: bpf: Add bpf sched pick task sample

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

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

The sample bpf program pick_next_task_kern.o sets the online task to be
the next task to run, When there are online tasks and offline tasks on rq.
Signed-off-by: NGuan Jing <guanjing6@huawei.com>
上级 403f0d0c
...@@ -56,6 +56,7 @@ tprogs-y += ibumad ...@@ -56,6 +56,7 @@ tprogs-y += ibumad
tprogs-y += hbm tprogs-y += hbm
tprogs-y += sched_preempt tprogs-y += sched_preempt
tprogs-y += sched_select_core tprogs-y += sched_select_core
tprogs-y += sched_pick_task
# Libbpf dependencies # Libbpf dependencies
LIBBPF = $(TOOLS_PATH)/lib/bpf/libbpf.a LIBBPF = $(TOOLS_PATH)/lib/bpf/libbpf.a
...@@ -115,6 +116,7 @@ ibumad-objs := bpf_load.o ibumad_user.o $(TRACE_HELPERS) ...@@ -115,6 +116,7 @@ ibumad-objs := bpf_load.o ibumad_user.o $(TRACE_HELPERS)
hbm-objs := bpf_load.o hbm.o $(CGROUP_HELPERS) hbm-objs := bpf_load.o hbm.o $(CGROUP_HELPERS)
sched_preempt-objs := sched_preempt_user.o sched_preempt-objs := sched_preempt_user.o
sched_select_core-objs := sched_select_core_user.o sched_select_core-objs := sched_select_core_user.o
sched_pick_task-objs := sched_pick_task_user.o
# Tell kbuild to always build the programs # Tell kbuild to always build the programs
always-y := $(tprogs-y) always-y := $(tprogs-y)
...@@ -178,6 +180,7 @@ always-y += hbm_edt_kern.o ...@@ -178,6 +180,7 @@ always-y += hbm_edt_kern.o
always-y += xdpsock_kern.o always-y += xdpsock_kern.o
always-y += sched_preempt_kern.o always-y += sched_preempt_kern.o
always-y += sched_select_core_kern.o always-y += sched_select_core_kern.o
always-y += sched_pick_task_kern.o
ifeq ($(ARCH), arm) ifeq ($(ARCH), arm)
# Strip all except -D__LINUX_ARM_ARCH__ option needed to handle linux # Strip all except -D__LINUX_ARM_ARCH__ option needed to handle linux
......
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2022. Huawei Technologies Co., Ltd. All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/version.h>
#include <linux/sched.h>
#include <uapi/linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include <bpf/libbpf_sched.h>
#define PICK_CURR 1
#define PICK_NOMAL 0
#define ERROR -1
enum task_type {
TASK_TYPE_OFFLINE = -1,
TASK_TYPE_ONLINE,
TASK_TYPE_MAX
};
/*
* Only implements the effect of the task selection strategy
* and needs to be used in conjunction with preempt and
* load balance. If quota is not configured, the priority
* inversion leads to system crash.
*/
SEC("sched/cfs_tag_pick_next_entity")
int BPF_PROG(sched_cfs_tag_pick_next_entity, struct sched_entity *curr, struct sched_entity *next)
{
int curr_type = 0;
int next_type = 0;
if (curr == NULL || next == NULL)
return PICK_NOMAL;
curr_type = libbpf_sched_se_tag_of(curr);
next_type = libbpf_sched_se_tag_of(next);
if (curr_type > next_type)
return PICK_CURR;
return PICK_NOMAL;
}
char _license[] SEC("license") = "GPL";
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2022. Huawei Technologies Co., Ltd. All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/resource.h>
#include <bpf/libbpf.h>
#define TRACE_DIR "/sys/kernel/debug/tracing/"
#define BUF_SIZE (4096)
/* read trace logs from debug fs */
void read_trace_pipe(void)
{
int trace_fd;
trace_fd = open(TRACE_DIR "trace_pipe", O_RDONLY, 0);
if (trace_fd < 0)
return;
while (1) {
static char buf[BUF_SIZE];
ssize_t sz;
sz = read(trace_fd, buf, sizeof(buf) - 1);
if (sz > 0) {
buf[sz] = 0;
puts(buf);
}
}
}
int main(int argc, char **argv)
{
char filename[256];
struct bpf_object *obj;
struct bpf_program *prog;
struct bpf_link *link;
int err;
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
/* Open BPF application */
obj = bpf_object__open_file(filename, NULL);
if (libbpf_get_error(obj)) {
fprintf(stderr, "ERROR: opening BPF object file failed\n");
return 1;
}
/* Load and verify BPF program */
err = bpf_object__load(obj);
if (err) {
fprintf(stderr, "ERROR: loading BPF object file failed\n");
goto cleanup;
}
prog = bpf_object__find_program_by_name(obj, "sched_cfs_tag_pick_next_entity");
if (libbpf_get_error(prog)) {
fprintf(stderr, "ERROR: finding a prog in obj file failed\n");
goto cleanup;
}
link = bpf_program__attach(prog);
if (libbpf_get_error(link)) {
fprintf(stderr, "ERROR: loading BPF object file failed\n");
link = NULL;
goto cleanup;
}
printf("preempt BPF started, hit Ctrl+C to stop!\n");
read_trace_pipe();
cleanup:
bpf_link__destroy(link);
bpf_object__close(obj);
out:
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册