Commit 93bc28d8 authored by Kui-Feng Lee's avatar Kui-Feng Lee Committed by Martin KaFai Lau
Browse files

selftests/bpf: Test struct_ops maps with a large number of struct_ops program.



Create and load a struct_ops map with a large number of struct_ops
programs to generate trampolines taking a size over multiple pages. The
map includes 40 programs. Their trampolines takes 6.6k+, more than 1.5
pages, on x86.

Signed-off-by: default avatarKui-Feng Lee <thinker.li@gmail.com>
Link: https://lore.kernel.org/r/20240224223418.526631-4-thinker.li@gmail.com


Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
parent 187e2af0
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -43,6 +43,50 @@ struct bpf_testmod_ops {
		int b;
	} unsupported;
	int data;

	/* The following pointers are used to test the maps having multiple
	 * pages of trampolines.
	 */
	int (*tramp_1)(int value);
	int (*tramp_2)(int value);
	int (*tramp_3)(int value);
	int (*tramp_4)(int value);
	int (*tramp_5)(int value);
	int (*tramp_6)(int value);
	int (*tramp_7)(int value);
	int (*tramp_8)(int value);
	int (*tramp_9)(int value);
	int (*tramp_10)(int value);
	int (*tramp_11)(int value);
	int (*tramp_12)(int value);
	int (*tramp_13)(int value);
	int (*tramp_14)(int value);
	int (*tramp_15)(int value);
	int (*tramp_16)(int value);
	int (*tramp_17)(int value);
	int (*tramp_18)(int value);
	int (*tramp_19)(int value);
	int (*tramp_20)(int value);
	int (*tramp_21)(int value);
	int (*tramp_22)(int value);
	int (*tramp_23)(int value);
	int (*tramp_24)(int value);
	int (*tramp_25)(int value);
	int (*tramp_26)(int value);
	int (*tramp_27)(int value);
	int (*tramp_28)(int value);
	int (*tramp_29)(int value);
	int (*tramp_30)(int value);
	int (*tramp_31)(int value);
	int (*tramp_32)(int value);
	int (*tramp_33)(int value);
	int (*tramp_34)(int value);
	int (*tramp_35)(int value);
	int (*tramp_36)(int value);
	int (*tramp_37)(int value);
	int (*tramp_38)(int value);
	int (*tramp_39)(int value);
	int (*tramp_40)(int value);
};

#endif /* _BPF_TESTMOD_H */
+30 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
#include <test_progs.h>

#include "struct_ops_multi_pages.skel.h"

static void do_struct_ops_multi_pages(void)
{
	struct struct_ops_multi_pages *skel;
	struct bpf_link *link;

	/* The size of all trampolines of skel->maps.multi_pages should be
	 * over 1 page (at least for x86).
	 */
	skel = struct_ops_multi_pages__open_and_load();
	if (!ASSERT_OK_PTR(skel, "struct_ops_multi_pages_open_and_load"))
		return;

	link = bpf_map__attach_struct_ops(skel->maps.multi_pages);
	ASSERT_OK_PTR(link, "attach_multi_pages");

	bpf_link__destroy(link);
	struct_ops_multi_pages__destroy(skel);
}

void test_struct_ops_multi_pages(void)
{
	if (test__start_subtest("multi_pages"))
		do_struct_ops_multi_pages();
}
+102 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include "../bpf_testmod/bpf_testmod.h"

char _license[] SEC("license") = "GPL";

#define TRAMP(x) \
	SEC("struct_ops/tramp_" #x)		\
	int BPF_PROG(tramp_ ## x, int a)	\
	{					\
		return a;			\
	}

TRAMP(1)
TRAMP(2)
TRAMP(3)
TRAMP(4)
TRAMP(5)
TRAMP(6)
TRAMP(7)
TRAMP(8)
TRAMP(9)
TRAMP(10)
TRAMP(11)
TRAMP(12)
TRAMP(13)
TRAMP(14)
TRAMP(15)
TRAMP(16)
TRAMP(17)
TRAMP(18)
TRAMP(19)
TRAMP(20)
TRAMP(21)
TRAMP(22)
TRAMP(23)
TRAMP(24)
TRAMP(25)
TRAMP(26)
TRAMP(27)
TRAMP(28)
TRAMP(29)
TRAMP(30)
TRAMP(31)
TRAMP(32)
TRAMP(33)
TRAMP(34)
TRAMP(35)
TRAMP(36)
TRAMP(37)
TRAMP(38)
TRAMP(39)
TRAMP(40)

#define F_TRAMP(x) .tramp_ ## x = (void *)tramp_ ## x

SEC(".struct_ops.link")
struct bpf_testmod_ops multi_pages = {
	F_TRAMP(1),
	F_TRAMP(2),
	F_TRAMP(3),
	F_TRAMP(4),
	F_TRAMP(5),
	F_TRAMP(6),
	F_TRAMP(7),
	F_TRAMP(8),
	F_TRAMP(9),
	F_TRAMP(10),
	F_TRAMP(11),
	F_TRAMP(12),
	F_TRAMP(13),
	F_TRAMP(14),
	F_TRAMP(15),
	F_TRAMP(16),
	F_TRAMP(17),
	F_TRAMP(18),
	F_TRAMP(19),
	F_TRAMP(20),
	F_TRAMP(21),
	F_TRAMP(22),
	F_TRAMP(23),
	F_TRAMP(24),
	F_TRAMP(25),
	F_TRAMP(26),
	F_TRAMP(27),
	F_TRAMP(28),
	F_TRAMP(29),
	F_TRAMP(30),
	F_TRAMP(31),
	F_TRAMP(32),
	F_TRAMP(33),
	F_TRAMP(34),
	F_TRAMP(35),
	F_TRAMP(36),
	F_TRAMP(37),
	F_TRAMP(38),
	F_TRAMP(39),
	F_TRAMP(40),
};