mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 14:04:27 -04:00
Merge tag 'bpf-next-7.3' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Pull bpf updates from Daniel Borkmann:
"Major changes:
- Redesign the verifier error reporting: failures now carry source
and instruction annotations along with the causal event history
that led to them, making program rejections far easier to debug and
repair (Kumar Kartikeya Dwivedi)
- Add arena argument support to kfuncs and struct_ops through the new
__arena and __arena__nullable suffixes (Tejun Heo, Puranjay Mohan,
Kumar Kartikeya Dwivedi, Ihor Solodrai)
- Signed BPF program loader rework to accommodate both BPF and
security community needs where the kernel runs the signature
verification at BPF_PROG_LOAD time before the LSM admission hook
(Daniel Borkmann)
- Add a set of ksock kfuncs which let BPF LSM and syscall programs
create, connect and send on UDP sockets in order to emit telemetry
data (Mahe Tardy)
- Unify helper and kfunc call argument verification and classify
kfunc arguments purely from BTF into a generated bpf_func_proto
which is computed once at add-call time (Amery Hung)
Other features and fixes:
- Enable EXECMEM_ROX_CACHE for BPF allocations on x86 (Mike Rapoport)
- Add bidirectional VLAN support to bpf_fib_lookup() through the new
BPF_FIB_LOOKUP_VLAN and BPF_FIB_LOOKUP_VLAN_INPUT flags (Avinash
Duduskar)
- Infer zext_dst from static register liveness analysis to fix 32-bit
zero-extension semantics, and remove the artificial limitations on
pointer types eligible for spilling (Eduard Zingerman)
- Inline the numeric open-coded iterator kfuncs so that bpf_for()
loops no longer pay a kfunc call on every iteration (Puranjay
Mohan)
- Add an arena-based bitmap data structure to libarena along with
serial and parallel selftests (Emil Tsalapatis)
- Teach resolve_btfids to discover kfuncs from the kernel's BTF ID
sets and to emit kfunc BTF decl tags, reducing the kernel build's
dependency on pahole features (Ihor Solodrai)
- Add BPF_F_ADJ_ROOM_DECAP_* flags to bpf_skb_adjust_room() so that
tunnel decapsulation can update the GSO and encapsulation state of
the skb (Nick Hudson)
- Fix the ring buffer pending_pos walk and the available-data
accounting on 32-bit position wrap (Israel Téllez García)
- Add memory usage accounting for arena maps and fix an mmap_lock
deadlock on arena lock failure (Jiayuan Chen)
- Add tracing_multi link info support to the kernel UAPI and bpftool,
and refactor the stack map code to run with preemption disabled
(Jiri Olsa)
- Support BPF_F_EGRESS in bpf_redirect_peer() to emit the skb in the
egress direction of the target's peer device (Jordan Rife)
- Add a KF_SPINLOCK_SAFE kfunc flag so that providers, in particular
modules, can declare kfuncs safe to call under bpf_spin_lock
instead of relying on the verifier's hard-coded allowlist (Kaitao
Cheng)
- Introduce global percpu data for BPF programs with libbpf probing
and bpftool skeleton support, and stop exposing uninitialized
kernel heap memory when copying per-CPU map values (Leon Hwang)
- Add s390 JIT support for load-acquire and store-release
instructions (Maxim Khmelevskii)
- Fix a CFI mismatch in the task work callback and an arm64 KASAN
false positive after bpf_throw() (Mykyta Yatsenko)
- Reject writes through untrusted BTF pointers and bound the
rdonly/rdwr_buf_size kfunc arguments (Nicholas Dudar)
- Invalidate RCU pointers only after the final spin unlock and
account for preempt and IRQ disabled regions as overlapping RCU
protection (Ning Ding)
- Support mixing bpf2bpf calls and tail calls on RV64, add signed
operations and 32-bit atomics to the RV32 JIT, and add timed
may_goto support (Pu Lehui, Kuan-Wei Chiu, Feng Jiang)
- Fix a use-after-free on mm_struct in bpf_find_vma() for foreign
tasks and an mmap_lock leak in the irq_work path (Sanghyun Park)
- Populate mmap-able BPF array map memory lazily which makes mmap()
O(1) instead of proportional to the map size (Song Liu)
- Introduce a jit_required flag and reject programs with inlined
helpers when no JIT is available, where the interpreter would
otherwise jump into an invalid address (Tiezhu Yang)
- Fix the x86 JIT per-CPU address resolution into an extended
register where the REX prefix dropped the high destination register
bit (Vineet Gupta)
- Reject MEM_ALLOC BTF accesses past object bounds, arena frees below
the arena base, and mixed arena and ordinary atomic paths (Yiyang
Chen)
- Fix the trampoline handling of 128-bit arguments and of return
values larger than 8 bytes (Yonghong Song)
- Ensure that any fault prone load is rewritten with exception table
handling, and fix the arena load-acquire and atomic fetch handling
in the x86, arm64, riscv and s390 JITs (Daniel Borkmann)
- Many more fixes and cleanups across the verifier, arena,
trampolines, sockmap, cgroup, ring buffer, x86/arm64/riscv/s390
JITs, libbpf, bpftool, resolve_btfids and selftests"
* tag 'bpf-next-7.3' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next: (373 commits)
selftests/bpf: Add tests for a store on a fault prone qdisc pointer
selftests/bpf: Add tests for fault prone loads out of RCU pointers
selftests/bpf: Add tests for pointer type merge at a shared load
selftests/bpf: Remove duplicate copies of the arena spinlock qnodes
selftests/bpf: Retry stat generation in cgroup_iter_memcg
selftests/bpf: Test pseudo-function policy diagnostics
bpf: Distinguish function references in policy diagnostics
bpf: Preserve source attribution without source text
selftests/bpf: Test kfunc argument diagnostics
bpf: Correct kfunc argument diagnostics
bpf: Use canonical stack argument names in diagnostics
bpf: Preserve R0 lineage across helper calls
selftests/bpf: Exercise negative optlen in cgroup getsockopt hook
bpf: Reject negative optlen in cgroup getsockopt hook
selftests/bpf: tc_tunnel - validate decap GSO and encapsulation state
bpf: Clear decap state on skb_adjust_room shrink path
bpf: Allow new DECAP flags and add guard rails
bpf: Add BPF_F_ADJ_ROOM_DECAP_* flags for tunnel decapsulation
bpf: Refactor masks for ADJ_ROOM flags and encap validation
bpf: Name the enum for BPF_FUNC_skb_adjust_room flags
...
This commit is contained in:
@@ -3038,8 +3038,34 @@ union bpf_attr {
|
||||
*
|
||||
* * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**,
|
||||
* **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**:
|
||||
* Indicate the new IP header version after decapsulating the outer
|
||||
* IP header. Used when the inner and outer IP versions are different.
|
||||
* Indicate the new IP header version after decapsulating the
|
||||
* outer IP header. Used when the inner and outer IP versions
|
||||
* are different. These flags only trigger a protocol change
|
||||
* without clearing any tunnel-specific GSO flags.
|
||||
*
|
||||
* * **BPF_F_ADJ_ROOM_DECAP_L4_GRE**:
|
||||
* Clear GRE tunnel GSO flags (SKB_GSO_GRE and SKB_GSO_GRE_CSUM)
|
||||
* when decapsulating a GRE tunnel.
|
||||
*
|
||||
* * **BPF_F_ADJ_ROOM_DECAP_L4_UDP**:
|
||||
* Clear UDP tunnel GSO flags (SKB_GSO_UDP_TUNNEL and
|
||||
* SKB_GSO_UDP_TUNNEL_CSUM) when decapsulating a UDP tunnel.
|
||||
*
|
||||
* * **BPF_F_ADJ_ROOM_DECAP_IPXIP4**:
|
||||
* Clear IPIP/SIT tunnel GSO flag (SKB_GSO_IPXIP4) when decapsulating
|
||||
* a tunnel with an outer IPv4 header (IPv4-in-IPv4 or IPv6-in-IPv4).
|
||||
*
|
||||
* * **BPF_F_ADJ_ROOM_DECAP_IPXIP6**:
|
||||
* Clear IPv6 encapsulation tunnel GSO flag (SKB_GSO_IPXIP6) when
|
||||
* decapsulating a tunnel with an outer IPv6 header (IPv6-in-IPv6
|
||||
* or IPv4-in-IPv6).
|
||||
*
|
||||
* When using the decapsulation flags above, the skb->encapsulation
|
||||
* flag is automatically cleared if all tunnel-specific GSO flags
|
||||
* (SKB_GSO_UDP_TUNNEL, SKB_GSO_UDP_TUNNEL_CSUM, SKB_GSO_GRE,
|
||||
* SKB_GSO_GRE_CSUM, SKB_GSO_IPXIP4, SKB_GSO_IPXIP6) have been
|
||||
* removed from the packet. This handles cases where all tunnel
|
||||
* layers have been decapsulated.
|
||||
*
|
||||
* A call to this helper is susceptible to change the underlying
|
||||
* packet buffer. Therefore, at load time, all checks on pointers
|
||||
@@ -3532,6 +3558,47 @@ union bpf_attr {
|
||||
* 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.
|
||||
* **BPF_FIB_LOOKUP_VLAN**
|
||||
* If the fib lookup resolves to a VLAN device whose
|
||||
* parent is a real (non-VLAN) device, set
|
||||
* *params*->h_vlan_proto and *params*->h_vlan_TCI from
|
||||
* the VLAN device and replace *params*->ifindex with the
|
||||
* parent's ifindex. *params*->h_vlan_TCI carries the VID
|
||||
* only, with PCP and DEI bits zero; a consumer wanting to
|
||||
* set egress priority writes PCP itself. *params*->smac is
|
||||
* the VLAN device's own address, which can differ from the
|
||||
* parent's. Only the immediate parent is resolved; if it
|
||||
* is itself a VLAN device (QinQ) or in another namespace,
|
||||
* the egress cannot be reduced to a physical device plus
|
||||
* one tag and the lookup returns
|
||||
* **BPF_FIB_LKUP_RET_VLAN_FAILURE** with *params*->ifindex
|
||||
* left at the input. To obtain the VLAN device's own
|
||||
* ifindex, repeat the lookup without
|
||||
* **BPF_FIB_LOOKUP_VLAN**, re-initializing *params*
|
||||
* first: output fields overwrite the inputs they share
|
||||
* storage with. The swap and the vlan fields
|
||||
* are written only on success; other output fields keep
|
||||
* the helper's existing behaviour, so a frag-needed result
|
||||
* still reports the route mtu in *params*->mtu_result.
|
||||
* This flag is only valid for XDP programs; tc programs
|
||||
* receive -EINVAL since they can redirect to the VLAN
|
||||
* device directly.
|
||||
* **BPF_FIB_LOOKUP_VLAN_INPUT**
|
||||
* Treat *params*->h_vlan_proto and *params*->h_vlan_TCI
|
||||
* as an input VLAN tag and run the lookup as if ingress
|
||||
* had happened on the VLAN subinterface carrying that tag
|
||||
* on *params*->ifindex. The VID is the low 12 bits of
|
||||
* *params*->h_vlan_TCI; *params*->h_vlan_proto must be
|
||||
* ETH_P_8021Q or ETH_P_8021AD in network byte order, else
|
||||
* **-EINVAL**. If *params*->ifindex is itself a VLAN
|
||||
* device, its inner (QinQ) subinterface is matched; for a
|
||||
* bond or team, pass the master's ifindex. An unmatched
|
||||
* tag, a down device, or one in another namespace returns
|
||||
* **BPF_FIB_LKUP_RET_NOT_FWDED**, mirroring real ingress.
|
||||
* A VID of 0 is looked up literally, so do not set this
|
||||
* flag for priority-tagged frames. Cannot be combined with
|
||||
* **BPF_FIB_LOOKUP_TBID** or **BPF_FIB_LOOKUP_OUTPUT**
|
||||
* (returns **-EINVAL**).
|
||||
*
|
||||
* *ctx* is either **struct xdp_md** for XDP programs or
|
||||
* **struct sk_buff** tc cls_act programs.
|
||||
@@ -4694,6 +4761,7 @@ union bpf_attr {
|
||||
* * **BPF_RB_RING_SIZE**: The size of ring buffer.
|
||||
* * **BPF_RB_CONS_POS**: Consumer position (can wrap around).
|
||||
* * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around).
|
||||
* * **BPF_RB_OVERWRITE_POS**: Overwrite position (can wrap around).
|
||||
*
|
||||
* Data returned is just a momentary snapshot of actual values
|
||||
* and could be inaccurate, so this facility should be used to
|
||||
@@ -5079,17 +5147,19 @@ union bpf_attr {
|
||||
* Description
|
||||
* Redirect the packet to another net device of index *ifindex*.
|
||||
* This helper is somewhat similar to **bpf_redirect**\ (), except
|
||||
* that the redirection happens to the *ifindex*' peer device and
|
||||
* the netns switch takes place from ingress to ingress without
|
||||
* going through the CPU's backlog queue.
|
||||
* that the redirection happens to the *ifindex*' peer device. If
|
||||
* *flags* is 0, the netns switch takes place from ingress to
|
||||
* ingress without going through the CPU's backlog queue. If the
|
||||
* **BPF_F_EGRESS** flag is provided then redirection happens in
|
||||
* the egress direction of the peer device.
|
||||
*
|
||||
* *skb*\ **->mark** and *skb*\ **->tstamp** are not cleared during
|
||||
* the netns switch.
|
||||
*
|
||||
* The *flags* argument is reserved and must be 0. The helper is
|
||||
* currently only supported for tc BPF program types at the
|
||||
* ingress hook and for veth and netkit target device types. The
|
||||
* peer device must reside in a different network namespace.
|
||||
* If the *flags* argument is 0, the helper is currently only
|
||||
* supported for tc BPF program types at the ingress hook and for
|
||||
* veth and netkit target device types. The peer device must reside
|
||||
* in a different network namespace.
|
||||
* Return
|
||||
* The helper returns **TC_ACT_REDIRECT** on success or
|
||||
* **TC_ACT_SHOT** on error.
|
||||
@@ -6239,7 +6309,7 @@ enum {
|
||||
};
|
||||
|
||||
/* BPF_FUNC_skb_adjust_room flags. */
|
||||
enum {
|
||||
enum bpf_adj_room_flags {
|
||||
BPF_F_ADJ_ROOM_FIXED_GSO = (1ULL << 0),
|
||||
BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = (1ULL << 1),
|
||||
BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = (1ULL << 2),
|
||||
@@ -6249,6 +6319,10 @@ enum {
|
||||
BPF_F_ADJ_ROOM_ENCAP_L2_ETH = (1ULL << 6),
|
||||
BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = (1ULL << 7),
|
||||
BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = (1ULL << 8),
|
||||
BPF_F_ADJ_ROOM_DECAP_L4_GRE = (1ULL << 9),
|
||||
BPF_F_ADJ_ROOM_DECAP_L4_UDP = (1ULL << 10),
|
||||
BPF_F_ADJ_ROOM_DECAP_IPXIP4 = (1ULL << 11),
|
||||
BPF_F_ADJ_ROOM_DECAP_IPXIP6 = (1ULL << 12),
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -6336,9 +6410,10 @@ enum {
|
||||
/* Flags for bpf_redirect and bpf_redirect_map helpers */
|
||||
enum {
|
||||
BPF_F_INGRESS = (1ULL << 0), /* used for skb path */
|
||||
BPF_F_EGRESS = (1ULL << 1), /* used for skb path */
|
||||
BPF_F_BROADCAST = (1ULL << 3), /* used for XDP path */
|
||||
BPF_F_EXCLUDE_INGRESS = (1ULL << 4), /* used for XDP path */
|
||||
#define BPF_F_REDIRECT_FLAGS (BPF_F_INGRESS | BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS)
|
||||
#define BPF_F_REDIRECT_FLAGS (BPF_F_INGRESS | BPF_F_EGRESS | BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS)
|
||||
};
|
||||
|
||||
#define __bpf_md_ptr(type, name) \
|
||||
@@ -6839,6 +6914,15 @@ struct bpf_link_info {
|
||||
__u32 flags;
|
||||
__u32 pid;
|
||||
} uprobe_multi;
|
||||
struct {
|
||||
__u32 attach_type;
|
||||
__u32 count; /* in/out: tracing_multi target count */
|
||||
__u32 btf_obj_id;
|
||||
__u32 :32;
|
||||
__aligned_u64 ids;
|
||||
__aligned_u64 addrs;
|
||||
__aligned_u64 cookies;
|
||||
} tracing_multi;
|
||||
struct {
|
||||
__u32 type; /* enum bpf_perf_event_type */
|
||||
__u32 :32;
|
||||
@@ -7327,6 +7411,8 @@ enum {
|
||||
BPF_FIB_LOOKUP_TBID = (1U << 3),
|
||||
BPF_FIB_LOOKUP_SRC = (1U << 4),
|
||||
BPF_FIB_LOOKUP_MARK = (1U << 5),
|
||||
BPF_FIB_LOOKUP_VLAN = (1U << 6),
|
||||
BPF_FIB_LOOKUP_VLAN_INPUT = (1U << 7),
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -7340,6 +7426,7 @@ enum {
|
||||
BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */
|
||||
BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */
|
||||
BPF_FIB_LKUP_RET_NO_SRC_ADDR, /* failed to derive IP src addr */
|
||||
BPF_FIB_LKUP_RET_VLAN_FAILURE, /* VLAN egress, parent unresolvable */
|
||||
};
|
||||
|
||||
struct bpf_fib_lookup {
|
||||
@@ -7393,7 +7480,13 @@ struct bpf_fib_lookup {
|
||||
|
||||
union {
|
||||
struct {
|
||||
/* output */
|
||||
/*
|
||||
* output with BPF_FIB_LOOKUP_VLAN: set from the
|
||||
* resolved egress VLAN device (see the flag); zeroed
|
||||
* on other successful lookups. input with
|
||||
* BPF_FIB_LOOKUP_VLAN_INPUT: the VLAN tag to scope
|
||||
* the lookup by.
|
||||
*/
|
||||
__be16 h_vlan_proto;
|
||||
__be16 h_vlan_TCI;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user