Compare commits

..

1 Commits

Author SHA1 Message Date
thiagoftsm
0dbbb4e7e0 Apply patch to run binaries on Debian 10 2024-04-21 15:02:37 +00:00
25 changed files with 77274 additions and 78558 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +0,0 @@
Alexei Starovoitov <ast@kernel.org> <alexei.starovoitov@gmail.com>
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
Benjamin Tissoires <bentiss@kernel.org> <benjamin.tissoires@redhat.com>
Björn Töpel <bjorn@kernel.org> <bjorn.topel@intel.com>
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>
Colin Ian King <colin.i.king@gmail.com> <colin.king@canonical.com>
Dan Carpenter <error27@gmail.com> <dan.carpenter@oracle.com>
Geliang Tang <geliang@kernel.org> <geliang.tang@suse.com>
Herbert Xu <herbert@gondor.apana.org.au>
Jakub Kicinski <kuba@kernel.org> <jakub.kicinski@netronome.com>
Leo Yan <leo.yan@linux.dev> <leo.yan@linaro.org>
Mark Starovoytov <mstarovo@pm.me> <mstarovoitov@marvell.com>
Maxim Mikityanskiy <maxtram95@gmail.com> <maximmi@mellanox.com>
Maxim Mikityanskiy <maxtram95@gmail.com> <maximmi@nvidia.com>
Quentin Monnet <qmo@kernel.org> <quentin@isovalent.com>
Quentin Monnet <qmo@kernel.org> <quentin.monnet@netronome.com>
Vadim Fedorenko <vadim.fedorenko@linux.dev> <vfedorenko@novek.ru>

View File

@@ -1 +1 @@
3e9bc0472b910d4115e16e9c2d684c7757cb6c60 443574b033876c85a35de4c65c14f7fe092222b2

View File

@@ -1 +1 @@
009367099eb61a4fc2af44d4eb06b6b4de7de6db 14bb1e8c8d4ad5d9d2febb7d19c70a3cf536e1e5

View File

@@ -1,69 +0,0 @@
From c71766e8ff7a7f950522d25896fba758585500df Mon Sep 17 00:00:00 2001
From: Song Liu <song@kernel.org>
Date: Mon, 22 Apr 2024 21:14:40 -0700
Subject: [PATCH] arch/Kconfig: Move SPECULATION_MITIGATIONS to arch/Kconfig
SPECULATION_MITIGATIONS is currently defined only for x86. As a result,
IS_ENABLED(CONFIG_SPECULATION_MITIGATIONS) is always false for other
archs. f337a6a21e2f effectively set "mitigations=off" by default on
non-x86 archs, which is not desired behavior. Jakub observed this
change when running bpf selftests on s390 and arm64.
Fix this by moving SPECULATION_MITIGATIONS to arch/Kconfig so that it is
available in all archs and thus can be used safely in kernel/cpu.c
Fixes: f337a6a21e2f ("x86/cpu: Actually turn off mitigations by default for SPECULATION_MITIGATIONS=n")
Cc: stable@vger.kernel.org
Cc: Sean Christopherson <seanjc@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Daniel Sneddon <daniel.sneddon@linux.intel.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Song Liu <song@kernel.org>
---
arch/Kconfig | 10 ++++++++++
arch/x86/Kconfig | 10 ----------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/arch/Kconfig b/arch/Kconfig
index 9f066785bb71..8f4af75005f8 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -1609,4 +1609,14 @@ config CC_HAS_SANE_FUNCTION_ALIGNMENT
# strict alignment always, even with -falign-functions.
def_bool CC_HAS_MIN_FUNCTION_ALIGNMENT || CC_IS_CLANG
+menuconfig SPECULATION_MITIGATIONS
+ bool "Mitigations for speculative execution vulnerabilities"
+ default y
+ help
+ Say Y here to enable options which enable mitigations for
+ speculative execution hardware vulnerabilities.
+
+ If you say N, all mitigations will be disabled. You really
+ should know what you are doing to say so.
+
endmenu
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 39886bab943a..50c890fce5e0 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2486,16 +2486,6 @@ config PREFIX_SYMBOLS
def_bool y
depends on CALL_PADDING && !CFI_CLANG
-menuconfig SPECULATION_MITIGATIONS
- bool "Mitigations for speculative execution vulnerabilities"
- default y
- help
- Say Y here to enable options which enable mitigations for
- speculative execution hardware vulnerabilities.
-
- If you say N, all mitigations will be disabled. You really
- should know what you are doing to say so.
-
if SPECULATION_MITIGATIONS
config MITIGATION_PAGE_TABLE_ISOLATION
--
2.43.0

View File

@@ -41,6 +41,7 @@ task_fd_query_rawtp
task_fd_query_tp task_fd_query_tp
tc_bpf tc_bpf
tcp_estats tcp_estats
tcp_rtt
test_global_funcs/arg_tag_ctx* test_global_funcs/arg_tag_ctx*
tp_attach_query tp_attach_query
usdt/urand_pid_attach usdt/urand_pid_attach

View File

@@ -1115,7 +1115,6 @@ enum bpf_attach_type {
BPF_CGROUP_UNIX_GETSOCKNAME, BPF_CGROUP_UNIX_GETSOCKNAME,
BPF_NETKIT_PRIMARY, BPF_NETKIT_PRIMARY,
BPF_NETKIT_PEER, BPF_NETKIT_PEER,
BPF_TRACE_KPROBE_SESSION,
__MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
}; };
@@ -1136,7 +1135,6 @@ enum bpf_link_type {
BPF_LINK_TYPE_TCX = 11, BPF_LINK_TYPE_TCX = 11,
BPF_LINK_TYPE_UPROBE_MULTI = 12, BPF_LINK_TYPE_UPROBE_MULTI = 12,
BPF_LINK_TYPE_NETKIT = 13, BPF_LINK_TYPE_NETKIT = 13,
BPF_LINK_TYPE_SOCKMAP = 14,
__MAX_BPF_LINK_TYPE, __MAX_BPF_LINK_TYPE,
}; };
@@ -3396,10 +3394,6 @@ union bpf_attr {
* for the nexthop. If the src addr cannot be derived, * for the nexthop. If the src addr cannot be derived,
* **BPF_FIB_LKUP_RET_NO_SRC_ADDR** is returned. In this * **BPF_FIB_LKUP_RET_NO_SRC_ADDR** is returned. In this
* case, *params*->dmac and *params*->smac are not set either. * case, *params*->dmac and *params*->smac are not set either.
* **BPF_FIB_LOOKUP_MARK**
* Use the mark present in *params*->mark for the fib lookup.
* This option should not be used with BPF_FIB_LOOKUP_DIRECT,
* as it only has meaning for full lookups.
* *
* *ctx* is either **struct xdp_md** for XDP programs or * *ctx* is either **struct xdp_md** for XDP programs or
* **struct sk_buff** tc cls_act programs. * **struct sk_buff** tc cls_act programs.
@@ -5028,7 +5022,7 @@ union bpf_attr {
* bytes will be copied to *dst* * bytes will be copied to *dst*
* Return * Return
* The **hash_algo** is returned on success, * The **hash_algo** is returned on success,
* **-EOPNOTSUPP** if IMA is disabled or **-EINVAL** if * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if
* invalid arguments are passed. * invalid arguments are passed.
* *
* struct socket *bpf_sock_from_file(struct file *file) * struct socket *bpf_sock_from_file(struct file *file)
@@ -5514,7 +5508,7 @@ union bpf_attr {
* bytes will be copied to *dst* * bytes will be copied to *dst*
* Return * Return
* The **hash_algo** is returned on success, * The **hash_algo** is returned on success,
* **-EOPNOTSUPP** if the hash calculation failed or **-EINVAL** if * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if
* invalid arguments are passed. * invalid arguments are passed.
* *
* void *bpf_kptr_xchg(void *map_value, void *ptr) * void *bpf_kptr_xchg(void *map_value, void *ptr)
@@ -6726,10 +6720,6 @@ struct bpf_link_info {
__u32 ifindex; __u32 ifindex;
__u32 attach_type; __u32 attach_type;
} netkit; } netkit;
struct {
__u32 map_id;
__u32 attach_type;
} sockmap;
}; };
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
@@ -6948,8 +6938,6 @@ enum {
* socket transition to LISTEN state. * socket transition to LISTEN state.
*/ */
BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. BPF_SOCK_OPS_RTT_CB, /* Called on every RTT.
* Arg1: measured RTT input (mrtt)
* Arg2: updated srtt
*/ */
BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option. BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option.
* It will be called to handle * It will be called to handle
@@ -7132,7 +7120,6 @@ enum {
BPF_FIB_LOOKUP_SKIP_NEIGH = (1U << 2), BPF_FIB_LOOKUP_SKIP_NEIGH = (1U << 2),
BPF_FIB_LOOKUP_TBID = (1U << 3), BPF_FIB_LOOKUP_TBID = (1U << 3),
BPF_FIB_LOOKUP_SRC = (1U << 4), BPF_FIB_LOOKUP_SRC = (1U << 4),
BPF_FIB_LOOKUP_MARK = (1U << 5),
}; };
enum { enum {
@@ -7165,7 +7152,7 @@ struct bpf_fib_lookup {
/* output: MTU value */ /* output: MTU value */
__u16 mtu_result; __u16 mtu_result;
} __attribute__((packed, aligned(2))); };
/* input: L3 device index for lookup /* input: L3 device index for lookup
* output: device index from FIB lookup * output: device index from FIB lookup
*/ */
@@ -7210,19 +7197,8 @@ struct bpf_fib_lookup {
__u32 tbid; __u32 tbid;
}; };
union { __u8 smac[6]; /* ETH_ALEN */
/* input */ __u8 dmac[6]; /* ETH_ALEN */
struct {
__u32 mark; /* policy routing */
/* 2 4-byte holes for input */
};
/* output: source and dest mac */
struct {
__u8 smac[6]; /* ETH_ALEN */
__u8 dmac[6]; /* ETH_ALEN */
};
};
}; };
struct bpf_redir_neigh { struct bpf_redir_neigh {
@@ -7309,10 +7285,6 @@ struct bpf_timer {
__u64 __opaque[2]; __u64 __opaque[2];
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
struct bpf_wq {
__u64 __opaque[2];
} __attribute__((aligned(8)));
struct bpf_dynptr { struct bpf_dynptr {
__u64 __opaque[2]; __u64 __opaque[2];
} __attribute__((aligned(8))); } __attribute__((aligned(8)));

View File

@@ -1,37 +0,0 @@
#!/usr/bin/env bash
set -eu
usage () {
echo "USAGE: ./mailmap-update.sh <libbpf-repo> <linux-repo>"
exit 1
}
LIBBPF_REPO="${1-""}"
LINUX_REPO="${2-""}"
if [ -z "${LIBBPF_REPO}" ] || [ -z "${LINUX_REPO}" ]; then
echo "Error: libbpf or linux repos are not specified"
usage
fi
LIBBPF_MAILMAP="${LIBBPF_REPO}/.mailmap"
LINUX_MAILMAP="${LINUX_REPO}/.mailmap"
tmpfile="$(mktemp)"
cleanup() {
rm -f "${tmpfile}"
}
trap cleanup EXIT
grep_lines() {
local pattern="$1"
local file="$2"
grep "${pattern}" "${file}" || true
}
while read -r email; do
grep_lines "${email}$" "${LINUX_MAILMAP}" >> "${tmpfile}"
done < <(git log --format='<%ae>' | sort -u)
sort -u "${tmpfile}" > "${LIBBPF_MAILMAP}"

View File

@@ -295,22 +295,6 @@ Latest changes to BPF helper definitions.
" -- src/bpf_helper_defs.h " -- src/bpf_helper_defs.h
fi fi
echo "Regenerating .mailmap..."
cd_to "${LINUX_REPO}"
git checkout "${TIP_SYM_REF}"
cd_to "${LIBBPF_REPO}"
"${LIBBPF_REPO}"/scripts/mailmap-update.sh "${LIBBPF_REPO}" "${LINUX_REPO}"
# if anything changed, commit it
mailmap_changes=$(git status --porcelain .mailmap | wc -l)
if ((${mailmap_changes} == 1)); then
git add .mailmap
git commit -s -m "sync: update .mailmap
Update .mailmap based on libbpf's list of contributors and on the latest
.mailmap version in the upstream repository.
" -- .mailmap
fi
# Use generated cover-letter as a template for "sync commit" with # Use generated cover-letter as a template for "sync commit" with
# baseline and checkpoint commits from kernel repo (and leave summary # baseline and checkpoint commits from kernel repo (and leave summary
# from cover letter intact, of course) # from cover letter intact, of course)

View File

@@ -9,7 +9,7 @@ else
endif endif
LIBBPF_MAJOR_VERSION := 1 LIBBPF_MAJOR_VERSION := 1
LIBBPF_MINOR_VERSION := 5 LIBBPF_MINOR_VERSION := 4
LIBBPF_PATCH_VERSION := 0 LIBBPF_PATCH_VERSION := 0
LIBBPF_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).$(LIBBPF_PATCH_VERSION) LIBBPF_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).$(LIBBPF_PATCH_VERSION)
LIBBPF_MAJMIN_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).0 LIBBPF_MAJMIN_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).0

View File

@@ -766,7 +766,6 @@ int bpf_link_create(int prog_fd, int target_fd,
return libbpf_err(-EINVAL); return libbpf_err(-EINVAL);
break; break;
case BPF_TRACE_KPROBE_MULTI: case BPF_TRACE_KPROBE_MULTI:
case BPF_TRACE_KPROBE_SESSION:
attr.link_create.kprobe_multi.flags = OPTS_GET(opts, kprobe_multi.flags, 0); attr.link_create.kprobe_multi.flags = OPTS_GET(opts, kprobe_multi.flags, 0);
attr.link_create.kprobe_multi.cnt = OPTS_GET(opts, kprobe_multi.cnt, 0); attr.link_create.kprobe_multi.cnt = OPTS_GET(opts, kprobe_multi.cnt, 0);
attr.link_create.kprobe_multi.syms = ptr_to_u64(OPTS_GET(opts, kprobe_multi.syms, 0)); attr.link_create.kprobe_multi.syms = ptr_to_u64(OPTS_GET(opts, kprobe_multi.syms, 0));

View File

@@ -2,7 +2,7 @@
#ifndef __BPF_CORE_READ_H__ #ifndef __BPF_CORE_READ_H__
#define __BPF_CORE_READ_H__ #define __BPF_CORE_READ_H__
#include "bpf_helpers.h" #include <bpf/bpf_helpers.h>
/* /*
* enum bpf_field_info_kind is passed as a second argument into * enum bpf_field_info_kind is passed as a second argument into
@@ -104,7 +104,6 @@ enum bpf_enum_value_kind {
case 2: val = *(const unsigned short *)p; break; \ case 2: val = *(const unsigned short *)p; break; \
case 4: val = *(const unsigned int *)p; break; \ case 4: val = *(const unsigned int *)p; break; \
case 8: val = *(const unsigned long long *)p; break; \ case 8: val = *(const unsigned long long *)p; break; \
default: val = 0; break; \
} \ } \
val <<= __CORE_RELO(s, field, LSHIFT_U64); \ val <<= __CORE_RELO(s, field, LSHIFT_U64); \
if (__CORE_RELO(s, field, SIGNED)) \ if (__CORE_RELO(s, field, SIGNED)) \

View File

@@ -1851,10 +1851,6 @@ static long (* const bpf_skb_load_bytes_relative)(const void *skb, __u32 offset,
* for the nexthop. If the src addr cannot be derived, * for the nexthop. If the src addr cannot be derived,
* **BPF_FIB_LKUP_RET_NO_SRC_ADDR** is returned. In this * **BPF_FIB_LKUP_RET_NO_SRC_ADDR** is returned. In this
* case, *params*->dmac and *params*->smac are not set either. * case, *params*->dmac and *params*->smac are not set either.
* **BPF_FIB_LOOKUP_MARK**
* Use the mark present in *params*->mark for the fib lookup.
* This option should not be used with BPF_FIB_LOOKUP_DIRECT,
* as it only has meaning for full lookups.
* *
* *ctx* is either **struct xdp_md** for XDP programs or * *ctx* is either **struct xdp_md** for XDP programs or
* **struct sk_buff** tc cls_act programs. * **struct sk_buff** tc cls_act programs.
@@ -3802,7 +3798,7 @@ static __u64 (* const bpf_ktime_get_coarse_ns)(void) = (void *) 160;
* *
* Returns * Returns
* The **hash_algo** is returned on success, * The **hash_algo** is returned on success,
* **-EOPNOTSUPP** if IMA is disabled or **-EINVAL** if * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if
* invalid arguments are passed. * invalid arguments are passed.
*/ */
static long (* const bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = (void *) 161; static long (* const bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = (void *) 161;
@@ -4416,7 +4412,7 @@ static long (* const bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __
* *
* Returns * Returns
* The **hash_algo** is returned on success, * The **hash_algo** is returned on success,
* **-EOPNOTSUPP** if the hash calculation failed or **-EINVAL** if * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if
* invalid arguments are passed. * invalid arguments are passed.
*/ */
static long (* const bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = (void *) 193; static long (* const bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = (void *) 193;

View File

@@ -137,8 +137,7 @@
/* /*
* Helper function to perform a tail call with a constant/immediate map slot. * Helper function to perform a tail call with a constant/immediate map slot.
*/ */
#if (defined(__clang__) && __clang_major__ >= 8) || (!defined(__clang__) && __GNUC__ > 12) #if __clang_major__ >= 8 && defined(__bpf__)
#if defined(__bpf__)
static __always_inline void static __always_inline void
bpf_tail_call_static(void *ctx, const void *map, const __u32 slot) bpf_tail_call_static(void *ctx, const void *map, const __u32 slot)
{ {
@@ -166,7 +165,6 @@ bpf_tail_call_static(void *ctx, const void *map, const __u32 slot)
: "r0", "r1", "r2", "r3", "r4", "r5"); : "r0", "r1", "r2", "r3", "r4", "r5");
} }
#endif #endif
#endif
enum libbpf_pin_type { enum libbpf_pin_type {
LIBBPF_PIN_NONE, LIBBPF_PIN_NONE,
@@ -186,21 +184,10 @@ enum libbpf_tristate {
#define __kptr __attribute__((btf_type_tag("kptr"))) #define __kptr __attribute__((btf_type_tag("kptr")))
#define __percpu_kptr __attribute__((btf_type_tag("percpu_kptr"))) #define __percpu_kptr __attribute__((btf_type_tag("percpu_kptr")))
#if defined (__clang__) #define bpf_ksym_exists(sym) ({ \
#define bpf_ksym_exists(sym) ({ \ _Static_assert(!__builtin_constant_p(!!sym), #sym " should be marked as __weak"); \
_Static_assert(!__builtin_constant_p(!!sym), \ !!sym; \
#sym " should be marked as __weak"); \
!!sym; \
}) })
#elif __GNUC__ > 8
#define bpf_ksym_exists(sym) ({ \
_Static_assert(__builtin_has_attribute (*sym, __weak__), \
#sym " should be marked as __weak"); \
!!sym; \
})
#else
#define bpf_ksym_exists(sym) !!sym
#endif
#define __arg_ctx __attribute__((btf_decl_tag("arg:ctx"))) #define __arg_ctx __attribute__((btf_decl_tag("arg:ctx")))
#define __arg_nonnull __attribute((btf_decl_tag("arg:nonnull"))) #define __arg_nonnull __attribute((btf_decl_tag("arg:nonnull")))

View File

@@ -633,18 +633,18 @@ struct pt_regs;
#endif #endif
#define ___bpf_ctx_cast0() ctx #define ___bpf_ctx_cast0() ctx
#define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), ctx[0] #define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0]
#define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), ctx[1] #define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1]
#define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), ctx[2] #define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2]
#define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), ctx[3] #define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3]
#define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), ctx[4] #define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4]
#define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), ctx[5] #define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5]
#define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), ctx[6] #define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6]
#define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), ctx[7] #define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7]
#define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), ctx[8] #define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8]
#define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), ctx[9] #define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9]
#define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), ctx[10] #define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10]
#define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), ctx[11] #define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11]
#define ___bpf_ctx_cast(args...) ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) #define ___bpf_ctx_cast(args...) ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args)
/* /*
@@ -786,14 +786,14 @@ ____##name(unsigned long long *ctx ___bpf_ctx_decl(args))
struct pt_regs; struct pt_regs;
#define ___bpf_kprobe_args0() ctx #define ___bpf_kprobe_args0() ctx
#define ___bpf_kprobe_args1(x) ___bpf_kprobe_args0(), (unsigned long long)PT_REGS_PARM1(ctx) #define ___bpf_kprobe_args1(x) ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx)
#define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (unsigned long long)PT_REGS_PARM2(ctx) #define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx)
#define ___bpf_kprobe_args3(x, args...) ___bpf_kprobe_args2(args), (unsigned long long)PT_REGS_PARM3(ctx) #define ___bpf_kprobe_args3(x, args...) ___bpf_kprobe_args2(args), (void *)PT_REGS_PARM3(ctx)
#define ___bpf_kprobe_args4(x, args...) ___bpf_kprobe_args3(args), (unsigned long long)PT_REGS_PARM4(ctx) #define ___bpf_kprobe_args4(x, args...) ___bpf_kprobe_args3(args), (void *)PT_REGS_PARM4(ctx)
#define ___bpf_kprobe_args5(x, args...) ___bpf_kprobe_args4(args), (unsigned long long)PT_REGS_PARM5(ctx) #define ___bpf_kprobe_args5(x, args...) ___bpf_kprobe_args4(args), (void *)PT_REGS_PARM5(ctx)
#define ___bpf_kprobe_args6(x, args...) ___bpf_kprobe_args5(args), (unsigned long long)PT_REGS_PARM6(ctx) #define ___bpf_kprobe_args6(x, args...) ___bpf_kprobe_args5(args), (void *)PT_REGS_PARM6(ctx)
#define ___bpf_kprobe_args7(x, args...) ___bpf_kprobe_args6(args), (unsigned long long)PT_REGS_PARM7(ctx) #define ___bpf_kprobe_args7(x, args...) ___bpf_kprobe_args6(args), (void *)PT_REGS_PARM7(ctx)
#define ___bpf_kprobe_args8(x, args...) ___bpf_kprobe_args7(args), (unsigned long long)PT_REGS_PARM8(ctx) #define ___bpf_kprobe_args8(x, args...) ___bpf_kprobe_args7(args), (void *)PT_REGS_PARM8(ctx)
#define ___bpf_kprobe_args(args...) ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args) #define ___bpf_kprobe_args(args...) ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args)
/* /*
@@ -821,7 +821,7 @@ static __always_inline typeof(name(0)) \
____##name(struct pt_regs *ctx, ##args) ____##name(struct pt_regs *ctx, ##args)
#define ___bpf_kretprobe_args0() ctx #define ___bpf_kretprobe_args0() ctx
#define ___bpf_kretprobe_args1(x) ___bpf_kretprobe_args0(), (unsigned long long)PT_REGS_RC(ctx) #define ___bpf_kretprobe_args1(x) ___bpf_kretprobe_args0(), (void *)PT_REGS_RC(ctx)
#define ___bpf_kretprobe_args(args...) ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args) #define ___bpf_kretprobe_args(args...) ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args)
/* /*
@@ -845,24 +845,24 @@ static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args)
/* If kernel has CONFIG_ARCH_HAS_SYSCALL_WRAPPER, read pt_regs directly */ /* If kernel has CONFIG_ARCH_HAS_SYSCALL_WRAPPER, read pt_regs directly */
#define ___bpf_syscall_args0() ctx #define ___bpf_syscall_args0() ctx
#define ___bpf_syscall_args1(x) ___bpf_syscall_args0(), (unsigned long long)PT_REGS_PARM1_SYSCALL(regs) #define ___bpf_syscall_args1(x) ___bpf_syscall_args0(), (void *)PT_REGS_PARM1_SYSCALL(regs)
#define ___bpf_syscall_args2(x, args...) ___bpf_syscall_args1(args), (unsigned long long)PT_REGS_PARM2_SYSCALL(regs) #define ___bpf_syscall_args2(x, args...) ___bpf_syscall_args1(args), (void *)PT_REGS_PARM2_SYSCALL(regs)
#define ___bpf_syscall_args3(x, args...) ___bpf_syscall_args2(args), (unsigned long long)PT_REGS_PARM3_SYSCALL(regs) #define ___bpf_syscall_args3(x, args...) ___bpf_syscall_args2(args), (void *)PT_REGS_PARM3_SYSCALL(regs)
#define ___bpf_syscall_args4(x, args...) ___bpf_syscall_args3(args), (unsigned long long)PT_REGS_PARM4_SYSCALL(regs) #define ___bpf_syscall_args4(x, args...) ___bpf_syscall_args3(args), (void *)PT_REGS_PARM4_SYSCALL(regs)
#define ___bpf_syscall_args5(x, args...) ___bpf_syscall_args4(args), (unsigned long long)PT_REGS_PARM5_SYSCALL(regs) #define ___bpf_syscall_args5(x, args...) ___bpf_syscall_args4(args), (void *)PT_REGS_PARM5_SYSCALL(regs)
#define ___bpf_syscall_args6(x, args...) ___bpf_syscall_args5(args), (unsigned long long)PT_REGS_PARM6_SYSCALL(regs) #define ___bpf_syscall_args6(x, args...) ___bpf_syscall_args5(args), (void *)PT_REGS_PARM6_SYSCALL(regs)
#define ___bpf_syscall_args7(x, args...) ___bpf_syscall_args6(args), (unsigned long long)PT_REGS_PARM7_SYSCALL(regs) #define ___bpf_syscall_args7(x, args...) ___bpf_syscall_args6(args), (void *)PT_REGS_PARM7_SYSCALL(regs)
#define ___bpf_syscall_args(args...) ___bpf_apply(___bpf_syscall_args, ___bpf_narg(args))(args) #define ___bpf_syscall_args(args...) ___bpf_apply(___bpf_syscall_args, ___bpf_narg(args))(args)
/* If kernel doesn't have CONFIG_ARCH_HAS_SYSCALL_WRAPPER, we have to BPF_CORE_READ from pt_regs */ /* If kernel doesn't have CONFIG_ARCH_HAS_SYSCALL_WRAPPER, we have to BPF_CORE_READ from pt_regs */
#define ___bpf_syswrap_args0() ctx #define ___bpf_syswrap_args0() ctx
#define ___bpf_syswrap_args1(x) ___bpf_syswrap_args0(), (unsigned long long)PT_REGS_PARM1_CORE_SYSCALL(regs) #define ___bpf_syswrap_args1(x) ___bpf_syswrap_args0(), (void *)PT_REGS_PARM1_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args2(x, args...) ___bpf_syswrap_args1(args), (unsigned long long)PT_REGS_PARM2_CORE_SYSCALL(regs) #define ___bpf_syswrap_args2(x, args...) ___bpf_syswrap_args1(args), (void *)PT_REGS_PARM2_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args3(x, args...) ___bpf_syswrap_args2(args), (unsigned long long)PT_REGS_PARM3_CORE_SYSCALL(regs) #define ___bpf_syswrap_args3(x, args...) ___bpf_syswrap_args2(args), (void *)PT_REGS_PARM3_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args4(x, args...) ___bpf_syswrap_args3(args), (unsigned long long)PT_REGS_PARM4_CORE_SYSCALL(regs) #define ___bpf_syswrap_args4(x, args...) ___bpf_syswrap_args3(args), (void *)PT_REGS_PARM4_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args5(x, args...) ___bpf_syswrap_args4(args), (unsigned long long)PT_REGS_PARM5_CORE_SYSCALL(regs) #define ___bpf_syswrap_args5(x, args...) ___bpf_syswrap_args4(args), (void *)PT_REGS_PARM5_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args6(x, args...) ___bpf_syswrap_args5(args), (unsigned long long)PT_REGS_PARM6_CORE_SYSCALL(regs) #define ___bpf_syswrap_args6(x, args...) ___bpf_syswrap_args5(args), (void *)PT_REGS_PARM6_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args7(x, args...) ___bpf_syswrap_args6(args), (unsigned long long)PT_REGS_PARM7_CORE_SYSCALL(regs) #define ___bpf_syswrap_args7(x, args...) ___bpf_syswrap_args6(args), (void *)PT_REGS_PARM7_CORE_SYSCALL(regs)
#define ___bpf_syswrap_args(args...) ___bpf_apply(___bpf_syswrap_args, ___bpf_narg(args))(args) #define ___bpf_syswrap_args(args...) ___bpf_apply(___bpf_syswrap_args, ___bpf_narg(args))(args)
/* /*

View File

@@ -1929,7 +1929,6 @@ static int btf_dump_int_data(struct btf_dump *d,
if (d->typed_dump->is_array_terminated) if (d->typed_dump->is_array_terminated)
break; break;
if (*(char *)data == '\0') { if (*(char *)data == '\0') {
btf_dump_type_values(d, "'\\0'");
d->typed_dump->is_array_terminated = true; d->typed_dump->is_array_terminated = true;
break; break;
} }
@@ -2032,7 +2031,6 @@ static int btf_dump_array_data(struct btf_dump *d,
__u32 i, elem_type_id; __u32 i, elem_type_id;
__s64 elem_size; __s64 elem_size;
bool is_array_member; bool is_array_member;
bool is_array_terminated;
elem_type_id = array->type; elem_type_id = array->type;
elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL);
@@ -2068,15 +2066,12 @@ static int btf_dump_array_data(struct btf_dump *d,
*/ */
is_array_member = d->typed_dump->is_array_member; is_array_member = d->typed_dump->is_array_member;
d->typed_dump->is_array_member = true; d->typed_dump->is_array_member = true;
is_array_terminated = d->typed_dump->is_array_terminated;
d->typed_dump->is_array_terminated = false;
for (i = 0; i < array->nelems; i++, data += elem_size) { for (i = 0; i < array->nelems; i++, data += elem_size) {
if (d->typed_dump->is_array_terminated) if (d->typed_dump->is_array_terminated)
break; break;
btf_dump_dump_type_data(d, NULL, elem_type, elem_type_id, data, 0, 0); btf_dump_dump_type_data(d, NULL, elem_type, elem_type_id, data, 0, 0);
} }
d->typed_dump->is_array_member = is_array_member; d->typed_dump->is_array_member = is_array_member;
d->typed_dump->is_array_terminated = is_array_terminated;
d->typed_dump->depth--; d->typed_dump->depth--;
btf_dump_data_pfx(d); btf_dump_data_pfx(d);
btf_dump_type_values(d, "]"); btf_dump_type_values(d, "]");

View File

@@ -132,7 +132,6 @@ static const char * const attach_type_name[] = {
[BPF_TRACE_UPROBE_MULTI] = "trace_uprobe_multi", [BPF_TRACE_UPROBE_MULTI] = "trace_uprobe_multi",
[BPF_NETKIT_PRIMARY] = "netkit_primary", [BPF_NETKIT_PRIMARY] = "netkit_primary",
[BPF_NETKIT_PEER] = "netkit_peer", [BPF_NETKIT_PEER] = "netkit_peer",
[BPF_TRACE_KPROBE_SESSION] = "trace_kprobe_session",
}; };
static const char * const link_type_name[] = { static const char * const link_type_name[] = {
@@ -150,7 +149,6 @@ static const char * const link_type_name[] = {
[BPF_LINK_TYPE_TCX] = "tcx", [BPF_LINK_TYPE_TCX] = "tcx",
[BPF_LINK_TYPE_UPROBE_MULTI] = "uprobe_multi", [BPF_LINK_TYPE_UPROBE_MULTI] = "uprobe_multi",
[BPF_LINK_TYPE_NETKIT] = "netkit", [BPF_LINK_TYPE_NETKIT] = "netkit",
[BPF_LINK_TYPE_SOCKMAP] = "sockmap",
}; };
static const char * const map_type_name[] = { static const char * const map_type_name[] = {
@@ -1128,7 +1126,6 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map)
const struct btf_type *mtype, *kern_mtype; const struct btf_type *mtype, *kern_mtype;
__u32 mtype_id, kern_mtype_id; __u32 mtype_id, kern_mtype_id;
void *mdata, *kern_mdata; void *mdata, *kern_mdata;
struct bpf_program *prog;
__s64 msize, kern_msize; __s64 msize, kern_msize;
__u32 moff, kern_moff; __u32 moff, kern_moff;
__u32 kern_member_idx; __u32 kern_member_idx;
@@ -1146,28 +1143,18 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map)
kern_member = find_member_by_name(kern_btf, kern_type, mname); kern_member = find_member_by_name(kern_btf, kern_type, mname);
if (!kern_member) { if (!kern_member) {
if (!libbpf_is_mem_zeroed(mdata, msize)) { /* Skip all zeros or null fields if they are not
pr_warn("struct_ops init_kern %s: Cannot find member %s in kernel BTF\n", * presented in the kernel BTF.
*/
if (libbpf_is_mem_zeroed(mdata, msize)) {
pr_info("struct_ops %s: member %s not found in kernel, skipping it as it's set to zero\n",
map->name, mname); map->name, mname);
return -ENOTSUP; continue;
} }
if (st_ops->progs[i]) { pr_warn("struct_ops init_kern %s: Cannot find member %s in kernel BTF\n",
/* If we had declaratively set struct_ops callback, we need to
* force its autoload to false, because it doesn't have
* a chance of succeeding from POV of the current struct_ops map.
* If this program is still referenced somewhere else, though,
* then bpf_object_adjust_struct_ops_autoload() will update its
* autoload accordingly.
*/
st_ops->progs[i]->autoload = false;
st_ops->progs[i] = NULL;
}
/* Skip all-zero/NULL fields if they are not present in the kernel BTF */
pr_info("struct_ops %s: member %s not found in kernel, skipping it as it's set to zero\n",
map->name, mname); map->name, mname);
continue; return -ENOTSUP;
} }
kern_member_idx = kern_member - btf_members(kern_type); kern_member_idx = kern_member - btf_members(kern_type);
@@ -1193,19 +1180,13 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map)
} }
if (btf_is_ptr(mtype)) { if (btf_is_ptr(mtype)) {
prog = *(void **)mdata; struct bpf_program *prog;
/* just like for !kern_member case above, reset declaratively
* set (at compile time) program's autload to false,
* if user replaced it with another program or NULL
*/
if (st_ops->progs[i] && st_ops->progs[i] != prog)
st_ops->progs[i]->autoload = false;
/* Update the value from the shadow type */ /* Update the value from the shadow type */
prog = *(void **)mdata;
st_ops->progs[i] = prog; st_ops->progs[i] = prog;
if (!prog) if (!prog)
continue; continue;
if (!is_valid_st_ops_program(obj, prog)) { if (!is_valid_st_ops_program(obj, prog)) {
pr_warn("struct_ops init_kern %s: member %s is not a struct_ops program\n", pr_warn("struct_ops init_kern %s: member %s is not a struct_ops program\n",
map->name, mname); map->name, mname);
@@ -1989,20 +1970,6 @@ static struct extern_desc *find_extern_by_name(const struct bpf_object *obj,
return NULL; return NULL;
} }
static struct extern_desc *find_extern_by_name_with_len(const struct bpf_object *obj,
const void *name, int len)
{
const char *ext_name;
int i;
for (i = 0; i < obj->nr_extern; i++) {
ext_name = obj->externs[i].name;
if (strlen(ext_name) == len && strncmp(ext_name, name, len) == 0)
return &obj->externs[i];
}
return NULL;
}
static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val, static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val,
char value) char value)
{ {
@@ -7372,11 +7339,7 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog
__u32 log_level = prog->log_level; __u32 log_level = prog->log_level;
int ret, err; int ret, err;
/* Be more helpful by rejecting programs that can't be validated early if (prog->type == BPF_PROG_TYPE_UNSPEC) {
* with more meaningful and actionable error message.
*/
switch (prog->type) {
case BPF_PROG_TYPE_UNSPEC:
/* /*
* The program type must be set. Most likely we couldn't find a proper * The program type must be set. Most likely we couldn't find a proper
* section definition at load time, and thus we didn't infer the type. * section definition at load time, and thus we didn't infer the type.
@@ -7384,15 +7347,6 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog
pr_warn("prog '%s': missing BPF prog type, check ELF section name '%s'\n", pr_warn("prog '%s': missing BPF prog type, check ELF section name '%s'\n",
prog->name, prog->sec_name); prog->name, prog->sec_name);
return -EINVAL; return -EINVAL;
case BPF_PROG_TYPE_STRUCT_OPS:
if (prog->attach_btf_id == 0) {
pr_warn("prog '%s': SEC(\"struct_ops\") program isn't referenced anywhere, did you forget to use it?\n",
prog->name);
return -EINVAL;
}
break;
default:
break;
} }
if (!insns || !insns_cnt) if (!insns || !insns_cnt)
@@ -8032,10 +7986,7 @@ static int bpf_object__sanitize_maps(struct bpf_object *obj)
return 0; return 0;
} }
typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type, int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx)
const char *sym_name, void *ctx);
static int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx)
{ {
char sym_type, sym_name[500]; char sym_type, sym_name[500];
unsigned long long sym_addr; unsigned long long sym_addr;
@@ -8075,13 +8026,8 @@ static int kallsyms_cb(unsigned long long sym_addr, char sym_type,
struct bpf_object *obj = ctx; struct bpf_object *obj = ctx;
const struct btf_type *t; const struct btf_type *t;
struct extern_desc *ext; struct extern_desc *ext;
char *res;
res = strstr(sym_name, ".llvm."); ext = find_extern_by_name(obj, sym_name);
if (sym_type == 'd' && res)
ext = find_extern_by_name_with_len(obj, sym_name, res - sym_name);
else
ext = find_extern_by_name(obj, sym_name);
if (!ext || ext->type != EXT_KSYM) if (!ext || ext->type != EXT_KSYM)
return 0; return 0;
@@ -9303,7 +9249,6 @@ static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_lin
static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link); static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link); static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link);
static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link); static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
static int attach_kprobe_session(const struct bpf_program *prog, long cookie, struct bpf_link **link);
static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link); static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link); static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link);
static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link); static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link);
@@ -9320,7 +9265,6 @@ static const struct bpf_sec_def section_defs[] = {
SEC_DEF("uretprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe), SEC_DEF("uretprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe),
SEC_DEF("kprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi), SEC_DEF("kprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi),
SEC_DEF("kretprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi), SEC_DEF("kretprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi),
SEC_DEF("kprobe.session+", KPROBE, BPF_TRACE_KPROBE_SESSION, SEC_NONE, attach_kprobe_session),
SEC_DEF("uprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach_uprobe_multi), SEC_DEF("uprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach_uprobe_multi),
SEC_DEF("uretprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach_uprobe_multi), SEC_DEF("uretprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach_uprobe_multi),
SEC_DEF("uprobe.multi.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPABLE, attach_uprobe_multi), SEC_DEF("uprobe.multi.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPABLE, attach_uprobe_multi),
@@ -9891,28 +9835,16 @@ static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name,
enum bpf_attach_type attach_type, enum bpf_attach_type attach_type,
int *btf_obj_fd, int *btf_type_id) int *btf_obj_fd, int *btf_type_id)
{ {
int ret, i, mod_len; int ret, i;
const char *fn_name, *mod_name = NULL;
fn_name = strchr(attach_name, ':'); ret = find_attach_btf_id(obj->btf_vmlinux, attach_name, attach_type);
if (fn_name) { if (ret > 0) {
mod_name = attach_name; *btf_obj_fd = 0; /* vmlinux BTF */
mod_len = fn_name - mod_name; *btf_type_id = ret;
fn_name++; return 0;
}
if (!mod_name || strncmp(mod_name, "vmlinux", mod_len) == 0) {
ret = find_attach_btf_id(obj->btf_vmlinux,
mod_name ? fn_name : attach_name,
attach_type);
if (ret > 0) {
*btf_obj_fd = 0; /* vmlinux BTF */
*btf_type_id = ret;
return 0;
}
if (ret != -ENOENT)
return ret;
} }
if (ret != -ENOENT)
return ret;
ret = load_module_btfs(obj); ret = load_module_btfs(obj);
if (ret) if (ret)
@@ -9921,12 +9853,7 @@ static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name,
for (i = 0; i < obj->btf_module_cnt; i++) { for (i = 0; i < obj->btf_module_cnt; i++) {
const struct module_btf *mod = &obj->btf_modules[i]; const struct module_btf *mod = &obj->btf_modules[i];
if (mod_name && strncmp(mod->name, mod_name, mod_len) != 0) ret = find_attach_btf_id(mod->btf, attach_name, attach_type);
continue;
ret = find_attach_btf_id(mod->btf,
mod_name ? fn_name : attach_name,
attach_type);
if (ret > 0) { if (ret > 0) {
*btf_obj_fd = mod->fd; *btf_obj_fd = mod->fd;
*btf_type_id = ret; *btf_type_id = ret;
@@ -11430,14 +11357,13 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
struct kprobe_multi_resolve res = { struct kprobe_multi_resolve res = {
.pattern = pattern, .pattern = pattern,
}; };
enum bpf_attach_type attach_type;
struct bpf_link *link = NULL; struct bpf_link *link = NULL;
char errmsg[STRERR_BUFSIZE]; char errmsg[STRERR_BUFSIZE];
const unsigned long *addrs; const unsigned long *addrs;
int err, link_fd, prog_fd; int err, link_fd, prog_fd;
bool retprobe, session;
const __u64 *cookies; const __u64 *cookies;
const char **syms; const char **syms;
bool retprobe;
size_t cnt; size_t cnt;
if (!OPTS_VALID(opts, bpf_kprobe_multi_opts)) if (!OPTS_VALID(opts, bpf_kprobe_multi_opts))
@@ -11476,12 +11402,6 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
} }
retprobe = OPTS_GET(opts, retprobe, false); retprobe = OPTS_GET(opts, retprobe, false);
session = OPTS_GET(opts, session, false);
if (retprobe && session)
return libbpf_err_ptr(-EINVAL);
attach_type = session ? BPF_TRACE_KPROBE_SESSION : BPF_TRACE_KPROBE_MULTI;
lopts.kprobe_multi.syms = syms; lopts.kprobe_multi.syms = syms;
lopts.kprobe_multi.addrs = addrs; lopts.kprobe_multi.addrs = addrs;
@@ -11496,7 +11416,7 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
} }
link->detach = &bpf_link__detach_fd; link->detach = &bpf_link__detach_fd;
link_fd = bpf_link_create(prog_fd, 0, attach_type, &lopts); link_fd = bpf_link_create(prog_fd, 0, BPF_TRACE_KPROBE_MULTI, &lopts);
if (link_fd < 0) { if (link_fd < 0) {
err = -errno; err = -errno;
pr_warn("prog '%s': failed to attach: %s\n", pr_warn("prog '%s': failed to attach: %s\n",
@@ -11593,7 +11513,7 @@ static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, stru
n = sscanf(spec, "%m[a-zA-Z0-9_.*?]", &pattern); n = sscanf(spec, "%m[a-zA-Z0-9_.*?]", &pattern);
if (n < 1) { if (n < 1) {
pr_warn("kprobe multi pattern is invalid: %s\n", spec); pr_warn("kprobe multi pattern is invalid: %s\n", pattern);
return -EINVAL; return -EINVAL;
} }
@@ -11602,32 +11522,6 @@ static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, stru
return libbpf_get_error(*link); return libbpf_get_error(*link);
} }
static int attach_kprobe_session(const struct bpf_program *prog, long cookie,
struct bpf_link **link)
{
LIBBPF_OPTS(bpf_kprobe_multi_opts, opts, .session = true);
const char *spec;
char *pattern;
int n;
*link = NULL;
/* no auto-attach for SEC("kprobe.session") */
if (strcmp(prog->sec_name, "kprobe.session") == 0)
return 0;
spec = prog->sec_name + sizeof("kprobe.session/") - 1;
n = sscanf(spec, "%m[a-zA-Z0-9_.*?]", &pattern);
if (n < 1) {
pr_warn("kprobe session pattern is invalid: %s\n", spec);
return -EINVAL;
}
*link = bpf_program__attach_kprobe_multi_opts(prog, pattern, &opts);
free(pattern);
return *link ? 0 : -errno;
}
static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link) static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link)
{ {
char *probe_type = NULL, *binary_path = NULL, *func_name = NULL; char *probe_type = NULL, *binary_path = NULL, *func_name = NULL;
@@ -12617,12 +12511,6 @@ bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd)
return bpf_program_attach_fd(prog, netns_fd, "netns", NULL); return bpf_program_attach_fd(prog, netns_fd, "netns", NULL);
} }
struct bpf_link *
bpf_program__attach_sockmap(const struct bpf_program *prog, int map_fd)
{
return bpf_program_attach_fd(prog, map_fd, "sockmap", NULL);
}
struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex) struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex)
{ {
/* target_fd/target_ifindex use the same field in LINK_CREATE */ /* target_fd/target_ifindex use the same field in LINK_CREATE */

View File

@@ -539,12 +539,10 @@ struct bpf_kprobe_multi_opts {
size_t cnt; size_t cnt;
/* create return kprobes */ /* create return kprobes */
bool retprobe; bool retprobe;
/* create session kprobes */
bool session;
size_t :0; size_t :0;
}; };
#define bpf_kprobe_multi_opts__last_field session #define bpf_kprobe_multi_opts__last_field retprobe
LIBBPF_API struct bpf_link * LIBBPF_API struct bpf_link *
bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,
@@ -797,8 +795,6 @@ bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd);
LIBBPF_API struct bpf_link * LIBBPF_API struct bpf_link *
bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd); bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd);
LIBBPF_API struct bpf_link * LIBBPF_API struct bpf_link *
bpf_program__attach_sockmap(const struct bpf_program *prog, int map_fd);
LIBBPF_API struct bpf_link *
bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex); bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex);
LIBBPF_API struct bpf_link * LIBBPF_API struct bpf_link *
bpf_program__attach_freplace(const struct bpf_program *prog, bpf_program__attach_freplace(const struct bpf_program *prog,
@@ -1297,7 +1293,6 @@ LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd,
ring_buffer_sample_fn sample_cb, void *ctx); ring_buffer_sample_fn sample_cb, void *ctx);
LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms); LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms);
LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb); LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb);
LIBBPF_API int ring_buffer__consume_n(struct ring_buffer *rb, size_t n);
LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb); LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb);
/** /**
@@ -1372,17 +1367,6 @@ LIBBPF_API int ring__map_fd(const struct ring *r);
*/ */
LIBBPF_API int ring__consume(struct ring *r); LIBBPF_API int ring__consume(struct ring *r);
/**
* @brief **ring__consume_n()** consumes up to a requested amount of items from
* a ringbuffer without event polling.
*
* @param r A ringbuffer object.
* @param n Maximum amount of items to consume.
* @return The number of items consumed, or a negative number if any of the
* callbacks return an error.
*/
LIBBPF_API int ring__consume_n(struct ring *r, size_t n);
struct user_ring_buffer_opts { struct user_ring_buffer_opts {
size_t sz; /* size of this struct, for forward/backward compatibility */ size_t sz; /* size of this struct, for forward/backward compatibility */
}; };

View File

@@ -416,10 +416,3 @@ LIBBPF_1.4.0 {
btf__new_split; btf__new_split;
btf_ext__raw_data; btf_ext__raw_data;
} LIBBPF_1.3.0; } LIBBPF_1.3.0;
LIBBPF_1.5.0 {
global:
bpf_program__attach_sockmap;
ring__consume_n;
ring_buffer__consume_n;
} LIBBPF_1.4.0;

View File

@@ -518,6 +518,11 @@ int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void
__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
__u32 kind); __u32 kind);
typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type,
const char *sym_name, void *ctx);
int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *arg);
/* handle direct returned errors */ /* handle direct returned errors */
static inline int libbpf_err(int ret) static inline int libbpf_err(int ret)
{ {

View File

@@ -97,6 +97,9 @@ __u32 get_kernel_version(void)
if (sscanf(info.release, "%u.%u.%u", &major, &minor, &patch) != 3) if (sscanf(info.release, "%u.%u.%u", &major, &minor, &patch) != 3)
return 0; return 0;
if (major == 4 && minor == 19 && patch > 255)
return KERNEL_VERSION(major, minor, 255);
return KERNEL_VERSION(major, minor, patch); return KERNEL_VERSION(major, minor, patch);
} }
@@ -448,8 +451,7 @@ int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, enum bpf_func_id helpe
/* If BPF verifier doesn't recognize BPF helper ID (enum bpf_func_id) /* If BPF verifier doesn't recognize BPF helper ID (enum bpf_func_id)
* at all, it will emit something like "invalid func unknown#181". * at all, it will emit something like "invalid func unknown#181".
* If BPF verifier recognizes BPF helper but it's not supported for * If BPF verifier recognizes BPF helper but it's not supported for
* given BPF program type, it will emit "unknown func bpf_sys_bpf#166" * given BPF program type, it will emit "unknown func bpf_sys_bpf#166".
* or "program of this type cannot use helper bpf_sys_bpf#166".
* In both cases, provided combination of BPF program type and BPF * In both cases, provided combination of BPF program type and BPF
* helper is not supported by the kernel. * helper is not supported by the kernel.
* In all other cases, probe_prog_load() above will either succeed (e.g., * In all other cases, probe_prog_load() above will either succeed (e.g.,
@@ -458,8 +460,7 @@ int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, enum bpf_func_id helpe
* that), or we'll get some more specific BPF verifier error about * that), or we'll get some more specific BPF verifier error about
* some unsatisfied conditions. * some unsatisfied conditions.
*/ */
if (ret == 0 && (strstr(buf, "invalid func ") || strstr(buf, "unknown func ") || if (ret == 0 && (strstr(buf, "invalid func ") || strstr(buf, "unknown func ")))
strstr(buf, "program of this type cannot use helper ")))
return 0; return 0;
return 1; /* assume supported */ return 1; /* assume supported */
} }

View File

@@ -4,6 +4,6 @@
#define __LIBBPF_VERSION_H #define __LIBBPF_VERSION_H
#define LIBBPF_MAJOR_VERSION 1 #define LIBBPF_MAJOR_VERSION 1
#define LIBBPF_MINOR_VERSION 5 #define LIBBPF_MINOR_VERSION 4
#endif /* __LIBBPF_VERSION_H */ #endif /* __LIBBPF_VERSION_H */

View File

@@ -231,7 +231,7 @@ static inline int roundup_len(__u32 len)
return (len + 7) / 8 * 8; return (len + 7) / 8 * 8;
} }
static int64_t ringbuf_process_ring(struct ring *r, size_t n) static int64_t ringbuf_process_ring(struct ring *r)
{ {
int *len_ptr, len, err; int *len_ptr, len, err;
/* 64-bit to avoid overflow in case of extreme application behavior */ /* 64-bit to avoid overflow in case of extreme application behavior */
@@ -268,42 +268,12 @@ static int64_t ringbuf_process_ring(struct ring *r, size_t n)
} }
smp_store_release(r->consumer_pos, cons_pos); smp_store_release(r->consumer_pos, cons_pos);
if (cnt >= n)
goto done;
} }
} while (got_new_data); } while (got_new_data);
done: done:
return cnt; return cnt;
} }
/* Consume available ring buffer(s) data without event polling, up to n
* records.
*
* Returns number of records consumed across all registered ring buffers (or
* n, whichever is less), or negative number if any of the callbacks return
* error.
*/
int ring_buffer__consume_n(struct ring_buffer *rb, size_t n)
{
int64_t err, res = 0;
int i;
for (i = 0; i < rb->ring_cnt; i++) {
struct ring *ring = rb->rings[i];
err = ringbuf_process_ring(ring, n);
if (err < 0)
return libbpf_err(err);
res += err;
n -= err;
if (n == 0)
break;
}
return res > INT_MAX ? INT_MAX : res;
}
/* Consume available ring buffer(s) data without event polling. /* Consume available ring buffer(s) data without event polling.
* Returns number of records consumed across all registered ring buffers (or * Returns number of records consumed across all registered ring buffers (or
* INT_MAX, whichever is less), or negative number if any of the callbacks * INT_MAX, whichever is less), or negative number if any of the callbacks
@@ -317,15 +287,13 @@ int ring_buffer__consume(struct ring_buffer *rb)
for (i = 0; i < rb->ring_cnt; i++) { for (i = 0; i < rb->ring_cnt; i++) {
struct ring *ring = rb->rings[i]; struct ring *ring = rb->rings[i];
err = ringbuf_process_ring(ring, INT_MAX); err = ringbuf_process_ring(ring);
if (err < 0) if (err < 0)
return libbpf_err(err); return libbpf_err(err);
res += err; res += err;
if (res > INT_MAX) {
res = INT_MAX;
break;
}
} }
if (res > INT_MAX)
return INT_MAX;
return res; return res;
} }
@@ -346,13 +314,13 @@ int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms)
__u32 ring_id = rb->events[i].data.fd; __u32 ring_id = rb->events[i].data.fd;
struct ring *ring = rb->rings[ring_id]; struct ring *ring = rb->rings[ring_id];
err = ringbuf_process_ring(ring, INT_MAX); err = ringbuf_process_ring(ring);
if (err < 0) if (err < 0)
return libbpf_err(err); return libbpf_err(err);
res += err; res += err;
} }
if (res > INT_MAX) if (res > INT_MAX)
res = INT_MAX; return INT_MAX;
return res; return res;
} }
@@ -403,22 +371,17 @@ int ring__map_fd(const struct ring *r)
return r->map_fd; return r->map_fd;
} }
int ring__consume_n(struct ring *r, size_t n) int ring__consume(struct ring *r)
{ {
int64_t res; int64_t res;
res = ringbuf_process_ring(r, n); res = ringbuf_process_ring(r);
if (res < 0) if (res < 0)
return libbpf_err(res); return libbpf_err(res);
return res > INT_MAX ? INT_MAX : res; return res > INT_MAX ? INT_MAX : res;
} }
int ring__consume(struct ring *r)
{
return ring__consume_n(r, INT_MAX);
}
static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb) static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb)
{ {
if (rb->consumer_pos) { if (rb->consumer_pos) {

View File

@@ -2,7 +2,6 @@
#undef _GNU_SOURCE #undef _GNU_SOURCE
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
#include "str_error.h" #include "str_error.h"
/* make sure libbpf doesn't use kernel-only integer typedefs */ /* make sure libbpf doesn't use kernel-only integer typedefs */
@@ -16,18 +15,7 @@
char *libbpf_strerror_r(int err, char *dst, int len) char *libbpf_strerror_r(int err, char *dst, int len)
{ {
int ret = strerror_r(err < 0 ? -err : err, dst, len); int ret = strerror_r(err < 0 ? -err : err, dst, len);
/* on glibc <2.13, ret == -1 and errno is set, if strerror_r() can't if (ret)
* handle the error, on glibc >=2.13 *positive* (errno-like) error snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret);
* code is returned directly
*/
if (ret == -1)
ret = errno;
if (ret) {
if (ret == EINVAL)
/* strerror_r() doesn't recognize this specific error */
snprintf(dst, len, "unknown error (%d)", err < 0 ? err : -err);
else
snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret);
}
return dst; return dst;
} }

View File

@@ -214,18 +214,18 @@ long bpf_usdt_cookie(struct pt_regs *ctx)
/* we rely on ___bpf_apply() and ___bpf_narg() macros already defined in bpf_tracing.h */ /* we rely on ___bpf_apply() and ___bpf_narg() macros already defined in bpf_tracing.h */
#define ___bpf_usdt_args0() ctx #define ___bpf_usdt_args0() ctx
#define ___bpf_usdt_args1(x) ___bpf_usdt_args0(), ({ long _x; bpf_usdt_arg(ctx, 0, &_x); _x; }) #define ___bpf_usdt_args1(x) ___bpf_usdt_args0(), ({ long _x; bpf_usdt_arg(ctx, 0, &_x); (void *)_x; })
#define ___bpf_usdt_args2(x, args...) ___bpf_usdt_args1(args), ({ long _x; bpf_usdt_arg(ctx, 1, &_x); _x; }) #define ___bpf_usdt_args2(x, args...) ___bpf_usdt_args1(args), ({ long _x; bpf_usdt_arg(ctx, 1, &_x); (void *)_x; })
#define ___bpf_usdt_args3(x, args...) ___bpf_usdt_args2(args), ({ long _x; bpf_usdt_arg(ctx, 2, &_x); _x; }) #define ___bpf_usdt_args3(x, args...) ___bpf_usdt_args2(args), ({ long _x; bpf_usdt_arg(ctx, 2, &_x); (void *)_x; })
#define ___bpf_usdt_args4(x, args...) ___bpf_usdt_args3(args), ({ long _x; bpf_usdt_arg(ctx, 3, &_x); _x; }) #define ___bpf_usdt_args4(x, args...) ___bpf_usdt_args3(args), ({ long _x; bpf_usdt_arg(ctx, 3, &_x); (void *)_x; })
#define ___bpf_usdt_args5(x, args...) ___bpf_usdt_args4(args), ({ long _x; bpf_usdt_arg(ctx, 4, &_x); _x; }) #define ___bpf_usdt_args5(x, args...) ___bpf_usdt_args4(args), ({ long _x; bpf_usdt_arg(ctx, 4, &_x); (void *)_x; })
#define ___bpf_usdt_args6(x, args...) ___bpf_usdt_args5(args), ({ long _x; bpf_usdt_arg(ctx, 5, &_x); _x; }) #define ___bpf_usdt_args6(x, args...) ___bpf_usdt_args5(args), ({ long _x; bpf_usdt_arg(ctx, 5, &_x); (void *)_x; })
#define ___bpf_usdt_args7(x, args...) ___bpf_usdt_args6(args), ({ long _x; bpf_usdt_arg(ctx, 6, &_x); _x; }) #define ___bpf_usdt_args7(x, args...) ___bpf_usdt_args6(args), ({ long _x; bpf_usdt_arg(ctx, 6, &_x); (void *)_x; })
#define ___bpf_usdt_args8(x, args...) ___bpf_usdt_args7(args), ({ long _x; bpf_usdt_arg(ctx, 7, &_x); _x; }) #define ___bpf_usdt_args8(x, args...) ___bpf_usdt_args7(args), ({ long _x; bpf_usdt_arg(ctx, 7, &_x); (void *)_x; })
#define ___bpf_usdt_args9(x, args...) ___bpf_usdt_args8(args), ({ long _x; bpf_usdt_arg(ctx, 8, &_x); _x; }) #define ___bpf_usdt_args9(x, args...) ___bpf_usdt_args8(args), ({ long _x; bpf_usdt_arg(ctx, 8, &_x); (void *)_x; })
#define ___bpf_usdt_args10(x, args...) ___bpf_usdt_args9(args), ({ long _x; bpf_usdt_arg(ctx, 9, &_x); _x; }) #define ___bpf_usdt_args10(x, args...) ___bpf_usdt_args9(args), ({ long _x; bpf_usdt_arg(ctx, 9, &_x); (void *)_x; })
#define ___bpf_usdt_args11(x, args...) ___bpf_usdt_args10(args), ({ long _x; bpf_usdt_arg(ctx, 10, &_x); _x; }) #define ___bpf_usdt_args11(x, args...) ___bpf_usdt_args10(args), ({ long _x; bpf_usdt_arg(ctx, 10, &_x); (void *)_x; })
#define ___bpf_usdt_args12(x, args...) ___bpf_usdt_args11(args), ({ long _x; bpf_usdt_arg(ctx, 11, &_x); _x; }) #define ___bpf_usdt_args12(x, args...) ___bpf_usdt_args11(args), ({ long _x; bpf_usdt_arg(ctx, 11, &_x); (void *)_x; })
#define ___bpf_usdt_args(args...) ___bpf_apply(___bpf_usdt_args, ___bpf_narg(args))(args) #define ___bpf_usdt_args(args...) ___bpf_apply(___bpf_usdt_args, ___bpf_narg(args))(args)
/* /*