From patchwork Sun Apr 3 16:07:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Dolgov <9erthalion6@gmail.com> X-Patchwork-Id: 12799642 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB5C9C433FE for ; Sun, 3 Apr 2022 16:08:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236885AbiDCQKL (ORCPT ); Sun, 3 Apr 2022 12:10:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231406AbiDCQKJ (ORCPT ); Sun, 3 Apr 2022 12:10:09 -0400 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83AF039836 for ; Sun, 3 Apr 2022 09:08:14 -0700 (PDT) Received: by mail-ej1-x631.google.com with SMTP id bh17so15291232ejb.8 for ; Sun, 03 Apr 2022 09:08:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aw9Z8syibvVPGLl55rs0k1Ml1FM/2mk1tEZsyZQf12Y=; b=HPLRqzYQp9dur0uHs22n4Q32ucFcBdBHJvR7Pfr5ykE2SMpgaOfU2CMQPrXbxanWxv UjLiHcRo2JC9wAwu2MxIpuaLTG/1gVfeAnX4FGZc5yGGLMhFsfocev1UGurAX1jw4bof jTmR4Blpi7j1dqPaBedVV2jtTiY8bIFC9onHqQ1k0xEM9QWKEUEJB1JPYAd9+3ZhXLGG KEGyFvVXYxvKEZqUt6PgDO6toiP/4eO36sk8b18t2vVYllpW5u672wrrw16Tq7lSNpms Mk8O2b1c0AnpJ9kP4XBLX55xPHdbkhIUlMPe9EajyfUy08UQz40dbrWdXCaNRrGlP1fj Zpzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aw9Z8syibvVPGLl55rs0k1Ml1FM/2mk1tEZsyZQf12Y=; b=UK+Yr9RXECPyKSbrYQxbL9R2tx+i4O8UrCH9rpN752YHjQE/VCbwHW3yn0DhR5E6k/ UX+ipLWApx9KtHwbxoW4ymns84YcSR9W9S2z9hyidgqjBpxXQkRRd3KCKxgmYjFJcXQ/ NnXpNsRLgRc8a7OLxCz0T2Wu8KmrUSMROIjHYcH7dowbvEsHsaakr0zP0fPFgvX6qvr9 zkFhyUw9pApLpTesYggRCMjxXLHRKSyZ7qYvaTQTT+84aZYlDjV2d7GGtfu2pCHuI+bx dRJ/E860UctU0uUydHSLzqB68z6TE/DW6YAwo9QkkToHJO/+nlw6WebD9T3PDOj0L978 bsnA== X-Gm-Message-State: AOAM530nXuKiDpJ7qSDx96j5BaYREyApJT0L0ckql4V3BmQ0jrNXsvyZ 0Xodcyyvk8nYaaH22FTWcaCEaFRahG9zBw== X-Google-Smtp-Source: ABdhPJxiBkUQfgL+M/Tdeyp2luNqcDkuMQwXABcm0xHNXLYQQoEdjWfZI2Y7GXJhqeyqMu+AH8zM2w== X-Received: by 2002:a17:907:1b27:b0:6d9:ceb6:7967 with SMTP id mp39-20020a1709071b2700b006d9ceb67967mr7911250ejc.186.1649002092992; Sun, 03 Apr 2022 09:08:12 -0700 (PDT) Received: from erthalion.local (dslb-094-222-030-091.094.222.pools.vodafone-ip.de. [94.222.30.91]) by smtp.gmail.com with ESMTPSA id z12-20020a17090674cc00b006df9afdda91sm3332053ejl.185.2022.04.03.09.08.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 Apr 2022 09:08:12 -0700 (PDT) From: Dmitrii Dolgov <9erthalion6@gmail.com> To: bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org, yhs@fb.com, songliubraving@fb.com Cc: Dmitrii Dolgov <9erthalion6@gmail.com> Subject: [RFC PATCH bpf-next 1/2] bpf: tracing: Introduce prio field for bpf_prog Date: Sun, 3 Apr 2022 18:07:17 +0200 Message-Id: <20220403160718.13730-2-9erthalion6@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220403160718.13730-1-9erthalion6@gmail.com> References: <20220403160718.13730-1-9erthalion6@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org X-Patchwork-Delegate: bpf@iogearbox.net X-Patchwork-State: RFC Add prio field into bpf_prog_array_item. The field signals what is the priority of the item in the array. Use it in bpf_prog_array_copy to place the new item in the array according to the priority. The change doesn't cover bpf_prog_array_update_at yet. Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com> --- drivers/media/rc/bpf-lirc.c | 4 ++-- include/linux/bpf.h | 3 ++- include/linux/trace_events.h | 7 ++++--- include/uapi/linux/bpf.h | 1 + kernel/bpf/core.c | 19 +++++++++++++++++-- kernel/bpf/syscall.c | 2 +- kernel/events/core.c | 8 ++++---- kernel/trace/bpf_trace.c | 8 +++++--- tools/include/uapi/linux/bpf.h | 1 + 9 files changed, 37 insertions(+), 16 deletions(-) diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c index 3eff08d7b8e5..b240149bd004 100644 --- a/drivers/media/rc/bpf-lirc.c +++ b/drivers/media/rc/bpf-lirc.c @@ -160,7 +160,7 @@ static int lirc_bpf_attach(struct rc_dev *rcdev, struct bpf_prog *prog) goto unlock; } - ret = bpf_prog_array_copy(old_array, NULL, prog, 0, &new_array); + ret = bpf_prog_array_copy(old_array, NULL, prog, 0, 0, &new_array); if (ret < 0) goto unlock; @@ -193,7 +193,7 @@ static int lirc_bpf_detach(struct rc_dev *rcdev, struct bpf_prog *prog) } old_array = lirc_rcu_dereference(raw->progs); - ret = bpf_prog_array_copy(old_array, prog, NULL, 0, &new_array); + ret = bpf_prog_array_copy(old_array, prog, NULL, 0, 0, &new_array); /* * Do not use bpf_prog_array_delete_safe() as we would end up * with a dummy entry in the array, and the we would free the diff --git a/include/linux/bpf.h b/include/linux/bpf.h index bdb5298735ce..f00ac9e5bfa2 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1235,6 +1235,7 @@ struct bpf_prog_array_item { union { struct bpf_cgroup_storage *cgroup_storage[MAX_BPF_CGROUP_STORAGE_TYPE]; u64 bpf_cookie; + u32 prio; }; }; @@ -1274,7 +1275,7 @@ int bpf_prog_array_copy_info(struct bpf_prog_array *array, int bpf_prog_array_copy(struct bpf_prog_array *old_array, struct bpf_prog *exclude_prog, struct bpf_prog *include_prog, - u64 bpf_cookie, + u64 bpf_cookie, u32 prio, struct bpf_prog_array **new_array); struct bpf_run_ctx {}; diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index e6e95a9f07a5..06996f85def8 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -736,7 +736,7 @@ trace_trigger_soft_disabled(struct trace_event_file *file) #ifdef CONFIG_BPF_EVENTS unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx); -int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog, u64 bpf_cookie); +int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog, u64 bpf_cookie, u32 prio); void perf_event_detach_bpf_prog(struct perf_event *event); int perf_event_query_prog_array(struct perf_event *event, void __user *info); int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog); @@ -754,7 +754,7 @@ static inline unsigned int trace_call_bpf(struct trace_event_call *call, void *c } static inline int -perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog, u64 bpf_cookie) +perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog, u64 bpf_cookie, u32 prio) { return -EOPNOTSUPP; } @@ -871,7 +871,8 @@ extern void ftrace_profile_free_filter(struct perf_event *event); void perf_trace_buf_update(void *record, u16 type); void *perf_trace_buf_alloc(int size, struct pt_regs **regs, int *rctxp); -int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, u64 bpf_cookie); +int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, + u64 bpf_cookie, u32 prio); void perf_event_free_bpf_prog(struct perf_event *event); void bpf_trace_run1(struct bpf_prog *prog, u64 arg1); diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index d14b10b85e51..10054c034518 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1481,6 +1481,7 @@ union bpf_attr { * accessible through bpf_get_attach_cookie() BPF helper */ __u64 bpf_cookie; + __u32 prio; } perf_event; struct { __u32 flags; diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 13e9dbeeedf3..8a89cc69c74b 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2405,13 +2405,14 @@ int bpf_prog_array_update_at(struct bpf_prog_array *array, int index, int bpf_prog_array_copy(struct bpf_prog_array *old_array, struct bpf_prog *exclude_prog, struct bpf_prog *include_prog, - u64 bpf_cookie, + u64 bpf_cookie, u32 prio, struct bpf_prog_array **new_array) { int new_prog_cnt, carry_prog_cnt = 0; struct bpf_prog_array_item *existing, *new; struct bpf_prog_array *array; bool found_exclude = false; + bool found_less_prio = false; /* Figure out how many existing progs we need to carry over to * the new array. @@ -2458,16 +2459,30 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array, existing->prog == &dummy_bpf_prog.prog) continue; + if (include_prog && existing->prio <= prio) { + found_less_prio = true; + + new->prog = include_prog; + new->prio = prio; + new->bpf_cookie = bpf_cookie; + + new++; + } + new->prog = existing->prog; new->bpf_cookie = existing->bpf_cookie; + new->prio = existing->prio; new++; } } - if (include_prog) { + + if (include_prog && !found_less_prio) { new->prog = include_prog; new->bpf_cookie = bpf_cookie; + new->prio = prio; new++; } + new->prog = NULL; *new_array = array; return 0; diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index cdaa1152436a..72fb3d2c30a4 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -3009,7 +3009,7 @@ static int bpf_perf_link_attach(const union bpf_attr *attr, struct bpf_prog *pro } event = perf_file->private_data; - err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie); + err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie, 0); if (err) { bpf_link_cleanup(&link_primer); goto out_put_file; diff --git a/kernel/events/core.c b/kernel/events/core.c index cfde994ce61c..283464c870f2 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5753,7 +5753,7 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon if (IS_ERR(prog)) return PTR_ERR(prog); - err = perf_event_set_bpf_prog(event, prog, 0); + err = perf_event_set_bpf_prog(event, prog, 0, 0); if (err) { bpf_prog_put(prog); return err; @@ -10172,7 +10172,7 @@ static inline bool perf_event_is_tracing(struct perf_event *event) } int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, - u64 bpf_cookie) + u64 bpf_cookie, u32 prio) { bool is_kprobe, is_tracepoint, is_syscall_tp; @@ -10203,7 +10203,7 @@ int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, return -EACCES; } - return perf_event_attach_bpf_prog(event, prog, bpf_cookie); + return perf_event_attach_bpf_prog(event, prog, bpf_cookie, prio); } void perf_event_free_bpf_prog(struct perf_event *event) @@ -10226,7 +10226,7 @@ static void perf_event_free_filter(struct perf_event *event) } int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, - u64 bpf_cookie) + u64 bpf_cookie, u32 prio) { return -ENOENT; } diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 836f021cb609..be3b282f2909 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1877,7 +1877,7 @@ static DEFINE_MUTEX(bpf_event_mutex); int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog, - u64 bpf_cookie) + u64 bpf_cookie, u32 prio) { struct bpf_prog_array *old_array; struct bpf_prog_array *new_array; @@ -1904,7 +1904,9 @@ int perf_event_attach_bpf_prog(struct perf_event *event, goto unlock; } - ret = bpf_prog_array_copy(old_array, NULL, prog, bpf_cookie, &new_array); + ret = bpf_prog_array_copy(old_array, NULL, prog, bpf_cookie, + prio, &new_array); + if (ret < 0) goto unlock; @@ -1931,7 +1933,7 @@ void perf_event_detach_bpf_prog(struct perf_event *event) goto unlock; old_array = bpf_event_rcu_dereference(event->tp_event->prog_array); - ret = bpf_prog_array_copy(old_array, event->prog, NULL, 0, &new_array); + ret = bpf_prog_array_copy(old_array, event->prog, NULL, 0, 0, &new_array); if (ret == -ENOENT) goto unlock; if (ret < 0) { diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index d14b10b85e51..10054c034518 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1481,6 +1481,7 @@ union bpf_attr { * accessible through bpf_get_attach_cookie() BPF helper */ __u64 bpf_cookie; + __u32 prio; } perf_event; struct { __u32 flags; From patchwork Sun Apr 3 16:07:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Dolgov <9erthalion6@gmail.com> X-Patchwork-Id: 12799641 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8D23C433F5 for ; Sun, 3 Apr 2022 16:08:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231406AbiDCQKL (ORCPT ); Sun, 3 Apr 2022 12:10:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233255AbiDCQKL (ORCPT ); Sun, 3 Apr 2022 12:10:11 -0400 Received: from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com [IPv6:2a00:1450:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44F4B3982F for ; Sun, 3 Apr 2022 09:08:17 -0700 (PDT) Received: by mail-ej1-x62e.google.com with SMTP id yy13so15352003ejb.2 for ; Sun, 03 Apr 2022 09:08:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZmF+ymoe8wOdYdz0lGumCQH9uSAZdCIQqrCOPr17rPc=; b=DUookdZRR1A1cAEMlfp9QfVjiJQbPsOUrsssj+mvZHHxh9ZBA5z7zYUkM7zpSFQdFb h0UY4bTaH9y6ezfABiJ36g3pkyDyuAFk/TIQnKREjHMEKdb9HZsBLaSvuYRABrN6L213 uzo2LGK6VIoFvEkBT4ojXPaHBvxvmseLACYqYe8pb6GdYNTWNOA4yGZ7JN3ExdDr5zPv QswYYzUc6DB+bpppDmYDDtGjCudeEpsKCugVHRaxsOreBLFBfM9dMMlOi97pGsKWFlGy EAgwUZmLZ2Nyd9uYcupeEZrw9J9OmUqk4QygMzn6M725NhPX8PHTEumBOelHBBHicBX9 TwSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZmF+ymoe8wOdYdz0lGumCQH9uSAZdCIQqrCOPr17rPc=; b=sS5uO5vWufT1s4bYSae6akWYKUwtGQNF6xE3vClPXZIEclTByjO27uz0AfS2OXClG9 fXQ6F/pf5/KSJZDiYYQQkl7dM2Fj8PVoTb3eZ906Eu6o1T13HMGm78QoV85j0PxrdC66 LFXXmZCpiYpR1q8OdJpqkgbNvBfpZ0DAGWq3f+9gZ0ivrmPwAmJO1Xehh38/H+oALa/i Rg7Iuh3w90aow95rk7X1UMwg+JEOMHqqsnOcgegBD53/fNONze7R2sRMrl/gqoOOJsLg H+4SfBs/4dhB9NHioN0LEIRLUnURslWT3wI/rxkhSzSypHwRgB7ht+YXv1RuieqEas98 jpJQ== X-Gm-Message-State: AOAM5304e+Cu9CXdFTT5e+hboPHlYjlyYU3BHXJXkmfUGUTotKVxoXvI e0hi44D2QjJvarJPcuV8Dkx/qRSbk1Puyg== X-Google-Smtp-Source: ABdhPJw2LA+K8BX4UEtJ9kWe4Cqd8IZFPZZu7hoGmYfNWILcnIChlaw0xTu/LzFqGizIyZHjLoHb8w== X-Received: by 2002:a17:907:3e8d:b0:6e7:f1fe:5912 with SMTP id hs13-20020a1709073e8d00b006e7f1fe5912mr728542ejc.314.1649002095848; Sun, 03 Apr 2022 09:08:15 -0700 (PDT) Received: from erthalion.local (dslb-094-222-030-091.094.222.pools.vodafone-ip.de. [94.222.30.91]) by smtp.gmail.com with ESMTPSA id z12-20020a17090674cc00b006df9afdda91sm3332053ejl.185.2022.04.03.09.08.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 Apr 2022 09:08:15 -0700 (PDT) From: Dmitrii Dolgov <9erthalion6@gmail.com> To: bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org, yhs@fb.com, songliubraving@fb.com Cc: Dmitrii Dolgov <9erthalion6@gmail.com> Subject: [RFC PATCH bpf-next 2/2] libbpf: Allow setting bpf_prog priority Date: Sun, 3 Apr 2022 18:07:18 +0200 Message-Id: <20220403160718.13730-3-9erthalion6@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220403160718.13730-1-9erthalion6@gmail.com> References: <20220403160718.13730-1-9erthalion6@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org X-Patchwork-Delegate: bpf@iogearbox.net X-Patchwork-State: RFC Introduce prio field in opts structures (bpf_tracepoint_opts, bpf_link_create_opts, bpf_perf_event_opts) to pass a priority value for the bpf_prog when a new bpf link is created. This value will be further used in perf_event_set_bpf_prog to specify in which order to execute bpf_progs attached to the same tracepoint. Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com> --- kernel/bpf/syscall.c | 3 ++- tools/lib/bpf/bpf.c | 1 + tools/lib/bpf/bpf.h | 1 + tools/lib/bpf/libbpf.c | 4 +++- tools/lib/bpf/libbpf.h | 6 ++++-- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 72fb3d2c30a4..629852b35b21 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -3009,7 +3009,8 @@ static int bpf_perf_link_attach(const union bpf_attr *attr, struct bpf_prog *pro } event = perf_file->private_data; - err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie, 0); + err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie, + attr->link_create.perf_event.prio); if (err) { bpf_link_cleanup(&link_primer); goto out_put_file; diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index cf27251adb92..029c9809bf9b 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -851,6 +851,7 @@ int bpf_link_create(int prog_fd, int target_fd, break; case BPF_PERF_EVENT: attr.link_create.perf_event.bpf_cookie = OPTS_GET(opts, perf_event.bpf_cookie, 0); + attr.link_create.perf_event.prio = OPTS_GET(opts, perf_event.prio, 0); if (!OPTS_ZEROED(opts, perf_event)) return libbpf_err(-EINVAL); break; diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index f4b4afb6d4ba..9a8ec9081ba7 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -412,6 +412,7 @@ struct bpf_link_create_opts { union { struct { __u64 bpf_cookie; + __u32 prio; } perf_event; struct { __u32 flags; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 809fe209cdcc..e09c00b53772 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -9912,7 +9912,8 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *p if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_opts, - .perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0)); + .perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0), + .perf_event.prio = OPTS_GET(opts, prio, 0)); link_fd = bpf_link_create(prog_fd, pfd, BPF_PERF_EVENT, &link_opts); if (link_fd < 0) { @@ -10663,6 +10664,7 @@ struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *p return libbpf_err_ptr(-EINVAL); pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + pe_opts.prio = OPTS_GET(opts, prio, 0); pfd = perf_event_open_tracepoint(tp_category, tp_name); if (pfd < 0) { diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 05dde85e19a6..30f1808a4b49 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -394,8 +394,9 @@ struct bpf_perf_event_opts { size_t sz; /* custom user-provided value fetchable through bpf_get_attach_cookie() */ __u64 bpf_cookie; + __u32 prio; }; -#define bpf_perf_event_opts__last_field bpf_cookie +#define bpf_perf_event_opts__last_field prio LIBBPF_API struct bpf_link * bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); @@ -508,8 +509,9 @@ struct bpf_tracepoint_opts { size_t sz; /* custom user-provided value fetchable through bpf_get_attach_cookie() */ __u64 bpf_cookie; + __u32 prio; }; -#define bpf_tracepoint_opts__last_field bpf_cookie +#define bpf_tracepoint_opts__last_field prio LIBBPF_API struct bpf_link * bpf_program__attach_tracepoint(const struct bpf_program *prog,