tools/testing/selftests/bpf/progs/map_ptr_kern.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/progs/map_ptr_kern.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/progs/map_ptr_kern.c
Extension
.c
Size
17590 bytes
Lines
721
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct bpf_map {
	enum bpf_map_type map_type;
	__u32 key_size;
	__u32 value_size;
	__u32 max_entries;
	__u32 id;
} __attribute__((preserve_access_index));

static inline int check_bpf_map_fields(struct bpf_map *map, __u32 key_size,
				       __u32 value_size, __u32 max_entries)
{
	VERIFY(map->map_type == g_map_type);
	VERIFY(map->key_size == key_size);
	VERIFY(map->value_size == value_size);
	VERIFY(map->max_entries == max_entries);
	VERIFY(map->id > 0);

	return 1;
}

static inline int check_bpf_map_ptr(struct bpf_map *indirect,
				    struct bpf_map *direct)
{
	VERIFY(indirect->map_type == direct->map_type);
	VERIFY(indirect->key_size == direct->key_size);
	VERIFY(indirect->value_size == direct->value_size);
	VERIFY(indirect->max_entries == direct->max_entries);
	VERIFY(indirect->id == direct->id);

	return 1;
}

static inline int check(struct bpf_map *indirect, struct bpf_map *direct,
			__u32 key_size, __u32 value_size, __u32 max_entries)
{
	VERIFY(check_bpf_map_ptr(indirect, direct));
	VERIFY(check_bpf_map_fields(indirect, key_size, value_size,
				    max_entries));
	return 1;
}

static inline int check_default(struct bpf_map *indirect,
				struct bpf_map *direct)
{
	VERIFY(check(indirect, direct, sizeof(__u32), sizeof(__u32),
		     MAX_ENTRIES));
	return 1;
}

static __noinline int
check_default_noinline(struct bpf_map *indirect, struct bpf_map *direct)
{
	VERIFY(check(indirect, direct, sizeof(__u32), sizeof(__u32),
		     MAX_ENTRIES));
	return 1;
}

typedef struct {
	int counter;
} atomic_t;

struct bpf_htab {
	struct bpf_map map;
	atomic_t count;
	__u32 n_buckets;
	__u32 elem_size;
} __attribute__((preserve_access_index));

struct {
	__uint(type, BPF_MAP_TYPE_HASH);
	__uint(map_flags, BPF_F_NO_PREALLOC); /* to test bpf_htab.count */
	__uint(max_entries, MAX_ENTRIES);
	__type(key, __u32);
	__type(value, __u32);
} m_hash SEC(".maps");

__s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym;

static inline int check_hash(void)
{
	struct bpf_htab *hash = (struct bpf_htab *)&m_hash;
	struct bpf_map *map = (struct bpf_map *)&m_hash;
	int i;

	VERIFY(check_default_noinline(&hash->map, map));

	VERIFY(hash->n_buckets == MAX_ENTRIES);
	VERIFY(hash->elem_size == 64);

	VERIFY(hash->count.counter == 0);

Annotation

Implementation Notes