Commit 36b5d471 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Daniel Borkmann

selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h

Split off few legacy things from bpf_helpers.h into separate
bpf_legacy.h file:
- load_{byte|half|word};
- remove extra inner_idx and numa_node fields from bpf_map_def and
  introduce bpf_map_def_legacy for use in samples;
- move BPF_ANNOTATE_KV_PAIR into bpf_legacy.h.

Adjust samples and selftests accordingly by either including
bpf_legacy.h and using bpf_map_def_legacy, or switching to BTF-defined
maps altogether.
Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Acked-by: default avatarSong Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20191008175942.1769476-3-andriin@fb.com
parent cf0e9718
...@@ -59,21 +59,18 @@ ...@@ -59,21 +59,18 @@
#define BYTES_PER_NS(delta, rate) ((((u64)(delta)) * (rate)) >> 20) #define BYTES_PER_NS(delta, rate) ((((u64)(delta)) * (rate)) >> 20)
#define BYTES_TO_NS(bytes, rate) div64_u64(((u64)(bytes)) << 20, (u64)(rate)) #define BYTES_TO_NS(bytes, rate) div64_u64(((u64)(bytes)) << 20, (u64)(rate))
struct bpf_map_def SEC("maps") queue_state = { struct {
.type = BPF_MAP_TYPE_CGROUP_STORAGE, __uint(type, BPF_MAP_TYPE_CGROUP_STORAGE);
.key_size = sizeof(struct bpf_cgroup_storage_key), __type(key, struct bpf_cgroup_storage_key);
.value_size = sizeof(struct hbm_vqueue), __type(value, struct hbm_vqueue);
}; } queue_state SEC(".maps");
BPF_ANNOTATE_KV_PAIR(queue_state, struct bpf_cgroup_storage_key,
struct hbm_vqueue); struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
struct bpf_map_def SEC("maps") queue_stats = { __uint(max_entries, 1);
.type = BPF_MAP_TYPE_ARRAY, __type(key, u32);
.key_size = sizeof(u32), __type(value, struct hvm_queue_stats);
.value_size = sizeof(struct hbm_queue_stats), } queue_stats SEC(".maps");
.max_entries = 1,
};
BPF_ANNOTATE_KV_PAIR(queue_stats, int, struct hbm_queue_stats);
struct hbm_pkt_info { struct hbm_pkt_info {
int cwnd; int cwnd;
......
...@@ -9,25 +9,26 @@ ...@@ -9,25 +9,26 @@
#include <linux/version.h> #include <linux/version.h>
#include <uapi/linux/bpf.h> #include <uapi/linux/bpf.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
#define MAX_ENTRIES 1000 #define MAX_ENTRIES 1000
#define MAX_NR_CPUS 1024 #define MAX_NR_CPUS 1024
struct bpf_map_def SEC("maps") hash_map = { struct bpf_map_def_legacy SEC("maps") hash_map = {
.type = BPF_MAP_TYPE_HASH, .type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
.max_entries = MAX_ENTRIES, .max_entries = MAX_ENTRIES,
}; };
struct bpf_map_def SEC("maps") lru_hash_map = { struct bpf_map_def_legacy SEC("maps") lru_hash_map = {
.type = BPF_MAP_TYPE_LRU_HASH, .type = BPF_MAP_TYPE_LRU_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
.max_entries = 10000, .max_entries = 10000,
}; };
struct bpf_map_def SEC("maps") nocommon_lru_hash_map = { struct bpf_map_def_legacy SEC("maps") nocommon_lru_hash_map = {
.type = BPF_MAP_TYPE_LRU_HASH, .type = BPF_MAP_TYPE_LRU_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
...@@ -35,7 +36,7 @@ struct bpf_map_def SEC("maps") nocommon_lru_hash_map = { ...@@ -35,7 +36,7 @@ struct bpf_map_def SEC("maps") nocommon_lru_hash_map = {
.map_flags = BPF_F_NO_COMMON_LRU, .map_flags = BPF_F_NO_COMMON_LRU,
}; };
struct bpf_map_def SEC("maps") inner_lru_hash_map = { struct bpf_map_def_legacy SEC("maps") inner_lru_hash_map = {
.type = BPF_MAP_TYPE_LRU_HASH, .type = BPF_MAP_TYPE_LRU_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
...@@ -44,20 +45,20 @@ struct bpf_map_def SEC("maps") inner_lru_hash_map = { ...@@ -44,20 +45,20 @@ struct bpf_map_def SEC("maps") inner_lru_hash_map = {
.numa_node = 0, .numa_node = 0,
}; };
struct bpf_map_def SEC("maps") array_of_lru_hashs = { struct bpf_map_def_legacy SEC("maps") array_of_lru_hashs = {
.type = BPF_MAP_TYPE_ARRAY_OF_MAPS, .type = BPF_MAP_TYPE_ARRAY_OF_MAPS,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.max_entries = MAX_NR_CPUS, .max_entries = MAX_NR_CPUS,
}; };
struct bpf_map_def SEC("maps") percpu_hash_map = { struct bpf_map_def_legacy SEC("maps") percpu_hash_map = {
.type = BPF_MAP_TYPE_PERCPU_HASH, .type = BPF_MAP_TYPE_PERCPU_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
.max_entries = MAX_ENTRIES, .max_entries = MAX_ENTRIES,
}; };
struct bpf_map_def SEC("maps") hash_map_alloc = { struct bpf_map_def_legacy SEC("maps") hash_map_alloc = {
.type = BPF_MAP_TYPE_HASH, .type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
...@@ -65,7 +66,7 @@ struct bpf_map_def SEC("maps") hash_map_alloc = { ...@@ -65,7 +66,7 @@ struct bpf_map_def SEC("maps") hash_map_alloc = {
.map_flags = BPF_F_NO_PREALLOC, .map_flags = BPF_F_NO_PREALLOC,
}; };
struct bpf_map_def SEC("maps") percpu_hash_map_alloc = { struct bpf_map_def_legacy SEC("maps") percpu_hash_map_alloc = {
.type = BPF_MAP_TYPE_PERCPU_HASH, .type = BPF_MAP_TYPE_PERCPU_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
...@@ -73,7 +74,7 @@ struct bpf_map_def SEC("maps") percpu_hash_map_alloc = { ...@@ -73,7 +74,7 @@ struct bpf_map_def SEC("maps") percpu_hash_map_alloc = {
.map_flags = BPF_F_NO_PREALLOC, .map_flags = BPF_F_NO_PREALLOC,
}; };
struct bpf_map_def SEC("maps") lpm_trie_map_alloc = { struct bpf_map_def_legacy SEC("maps") lpm_trie_map_alloc = {
.type = BPF_MAP_TYPE_LPM_TRIE, .type = BPF_MAP_TYPE_LPM_TRIE,
.key_size = 8, .key_size = 8,
.value_size = sizeof(long), .value_size = sizeof(long),
...@@ -81,14 +82,14 @@ struct bpf_map_def SEC("maps") lpm_trie_map_alloc = { ...@@ -81,14 +82,14 @@ struct bpf_map_def SEC("maps") lpm_trie_map_alloc = {
.map_flags = BPF_F_NO_PREALLOC, .map_flags = BPF_F_NO_PREALLOC,
}; };
struct bpf_map_def SEC("maps") array_map = { struct bpf_map_def_legacy SEC("maps") array_map = {
.type = BPF_MAP_TYPE_ARRAY, .type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
.max_entries = MAX_ENTRIES, .max_entries = MAX_ENTRIES,
}; };
struct bpf_map_def SEC("maps") lru_hash_lookup_map = { struct bpf_map_def_legacy SEC("maps") lru_hash_lookup_map = {
.type = BPF_MAP_TYPE_LRU_HASH, .type = BPF_MAP_TYPE_LRU_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(long), .value_size = sizeof(long),
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/udp.h> #include <linux/udp.h>
#include <uapi/linux/bpf.h> #include <uapi/linux/bpf.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
#define DEFAULT_PKTGEN_UDP_PORT 9 #define DEFAULT_PKTGEN_UDP_PORT 9
#define IP_MF 0x2000 #define IP_MF 0x2000
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <uapi/linux/if_packet.h> #include <uapi/linux/if_packet.h>
#include <uapi/linux/ip.h> #include <uapi/linux/ip.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
struct bpf_map_def SEC("maps") my_map = { struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_ARRAY, .type = BPF_MAP_TYPE_ARRAY,
......
#include <uapi/linux/bpf.h> #include <uapi/linux/bpf.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
#include <uapi/linux/in.h> #include <uapi/linux/in.h>
#include <uapi/linux/if.h> #include <uapi/linux/if.h>
#include <uapi/linux/if_ether.h> #include <uapi/linux/if_ether.h>
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
*/ */
#include <uapi/linux/bpf.h> #include <uapi/linux/bpf.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
#include <uapi/linux/in.h> #include <uapi/linux/in.h>
#include <uapi/linux/if.h> #include <uapi/linux/if.h>
#include <uapi/linux/if_ether.h> #include <uapi/linux/if_ether.h>
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <uapi/linux/filter.h> #include <uapi/linux/filter.h>
#include <uapi/linux/pkt_cls.h> #include <uapi/linux/pkt_cls.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
/* compiler workaround */ /* compiler workaround */
#define _htonl __builtin_bswap32 #define _htonl __builtin_bswap32
......
...@@ -11,11 +11,12 @@ ...@@ -11,11 +11,12 @@
#include <uapi/linux/bpf.h> #include <uapi/linux/bpf.h>
#include <uapi/linux/in6.h> #include <uapi/linux/in6.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
#define MAX_NR_PORTS 65536 #define MAX_NR_PORTS 65536
/* map #0 */ /* map #0 */
struct bpf_map_def SEC("maps") port_a = { struct bpf_map_def_legacy SEC("maps") port_a = {
.type = BPF_MAP_TYPE_ARRAY, .type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(int), .value_size = sizeof(int),
...@@ -23,7 +24,7 @@ struct bpf_map_def SEC("maps") port_a = { ...@@ -23,7 +24,7 @@ struct bpf_map_def SEC("maps") port_a = {
}; };
/* map #1 */ /* map #1 */
struct bpf_map_def SEC("maps") port_h = { struct bpf_map_def_legacy SEC("maps") port_h = {
.type = BPF_MAP_TYPE_HASH, .type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(int), .value_size = sizeof(int),
...@@ -31,7 +32,7 @@ struct bpf_map_def SEC("maps") port_h = { ...@@ -31,7 +32,7 @@ struct bpf_map_def SEC("maps") port_h = {
}; };
/* map #2 */ /* map #2 */
struct bpf_map_def SEC("maps") reg_result_h = { struct bpf_map_def_legacy SEC("maps") reg_result_h = {
.type = BPF_MAP_TYPE_HASH, .type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(int), .value_size = sizeof(int),
...@@ -39,7 +40,7 @@ struct bpf_map_def SEC("maps") reg_result_h = { ...@@ -39,7 +40,7 @@ struct bpf_map_def SEC("maps") reg_result_h = {
}; };
/* map #3 */ /* map #3 */
struct bpf_map_def SEC("maps") inline_result_h = { struct bpf_map_def_legacy SEC("maps") inline_result_h = {
.type = BPF_MAP_TYPE_HASH, .type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(int), .value_size = sizeof(int),
...@@ -47,7 +48,7 @@ struct bpf_map_def SEC("maps") inline_result_h = { ...@@ -47,7 +48,7 @@ struct bpf_map_def SEC("maps") inline_result_h = {
}; };
/* map #4 */ /* Test case #0 */ /* map #4 */ /* Test case #0 */
struct bpf_map_def SEC("maps") a_of_port_a = { struct bpf_map_def_legacy SEC("maps") a_of_port_a = {
.type = BPF_MAP_TYPE_ARRAY_OF_MAPS, .type = BPF_MAP_TYPE_ARRAY_OF_MAPS,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.inner_map_idx = 0, /* map_fd[0] is port_a */ .inner_map_idx = 0, /* map_fd[0] is port_a */
...@@ -55,7 +56,7 @@ struct bpf_map_def SEC("maps") a_of_port_a = { ...@@ -55,7 +56,7 @@ struct bpf_map_def SEC("maps") a_of_port_a = {
}; };
/* map #5 */ /* Test case #1 */ /* map #5 */ /* Test case #1 */
struct bpf_map_def SEC("maps") h_of_port_a = { struct bpf_map_def_legacy SEC("maps") h_of_port_a = {
.type = BPF_MAP_TYPE_HASH_OF_MAPS, .type = BPF_MAP_TYPE_HASH_OF_MAPS,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.inner_map_idx = 0, /* map_fd[0] is port_a */ .inner_map_idx = 0, /* map_fd[0] is port_a */
...@@ -63,7 +64,7 @@ struct bpf_map_def SEC("maps") h_of_port_a = { ...@@ -63,7 +64,7 @@ struct bpf_map_def SEC("maps") h_of_port_a = {
}; };
/* map #6 */ /* Test case #2 */ /* map #6 */ /* Test case #2 */
struct bpf_map_def SEC("maps") h_of_port_h = { struct bpf_map_def_legacy SEC("maps") h_of_port_h = {
.type = BPF_MAP_TYPE_HASH_OF_MAPS, .type = BPF_MAP_TYPE_HASH_OF_MAPS,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.inner_map_idx = 1, /* map_fd[1] is port_h */ .inner_map_idx = 1, /* map_fd[1] is port_h */
......
...@@ -21,19 +21,8 @@ ...@@ -21,19 +21,8 @@
*/ */
#define SEC(NAME) __attribute__((section(NAME), used)) #define SEC(NAME) __attribute__((section(NAME), used))
/* llvm builtin functions that eBPF C program may use to
* emit BPF_LD_ABS and BPF_LD_IND instructions
*/
struct sk_buff;
unsigned long long load_byte(void *skb,
unsigned long long off) asm("llvm.bpf.load.byte");
unsigned long long load_half(void *skb,
unsigned long long off) asm("llvm.bpf.load.half");
unsigned long long load_word(void *skb,
unsigned long long off) asm("llvm.bpf.load.word");
/* a helper structure used by eBPF C program /* a helper structure used by eBPF C program
* to describe map attributes to elf_bpf loader * to describe BPF map attributes to libbpf loader
*/ */
struct bpf_map_def { struct bpf_map_def {
unsigned int type; unsigned int type;
...@@ -41,19 +30,8 @@ struct bpf_map_def { ...@@ -41,19 +30,8 @@ struct bpf_map_def {
unsigned int value_size; unsigned int value_size;
unsigned int max_entries; unsigned int max_entries;
unsigned int map_flags; unsigned int map_flags;
unsigned int inner_map_idx;
unsigned int numa_node;
}; };
#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
struct ____btf_map_##name { \
type_key key; \
type_val value; \
}; \
struct ____btf_map_##name \
__attribute__ ((section(".maps." #name), used)) \
____btf_map_##name = { }
/* Scan the ARCH passed in from ARCH env variable (see Makefile) */ /* Scan the ARCH passed in from ARCH env variable (see Makefile) */
#if defined(__TARGET_ARCH_x86) #if defined(__TARGET_ARCH_x86)
#define bpf_target_x86 #define bpf_target_x86
......
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
#ifndef __BPF_LEGACY__
#define __BPF_LEGACY__
/*
* legacy bpf_map_def with extra fields supported only by bpf_load(), do not
* use outside of samples/bpf
*/
struct bpf_map_def_legacy {
unsigned int type;
unsigned int key_size;
unsigned int value_size;
unsigned int max_entries;
unsigned int map_flags;
unsigned int inner_map_idx;
unsigned int numa_node;
};
#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
struct ____btf_map_##name { \
type_key key; \
type_val value; \
}; \
struct ____btf_map_##name \
__attribute__ ((section(".maps." #name), used)) \
____btf_map_##name = { }
/* llvm builtin functions that eBPF C program may use to
* emit BPF_LD_ABS and BPF_LD_IND instructions
*/
unsigned long long load_byte(void *skb,
unsigned long long off) asm("llvm.bpf.load.byte");
unsigned long long load_half(void *skb,
unsigned long long off) asm("llvm.bpf.load.half");
unsigned long long load_word(void *skb,
unsigned long long off) asm("llvm.bpf.load.word");
#endif
...@@ -14,13 +14,12 @@ struct sockopt_sk { ...@@ -14,13 +14,12 @@ struct sockopt_sk {
__u8 val; __u8 val;
}; };
struct bpf_map_def SEC("maps") socket_storage_map = { struct {
.type = BPF_MAP_TYPE_SK_STORAGE, __uint(type, BPF_MAP_TYPE_SK_STORAGE);
.key_size = sizeof(int), __uint(map_flags, BPF_F_NO_PREALLOC);
.value_size = sizeof(struct sockopt_sk), __type(key, int);
.map_flags = BPF_F_NO_PREALLOC, __type(value, struct sockopt_sk);
}; } socket_storage_map SEC(".maps");
BPF_ANNOTATE_KV_PAIR(socket_storage_map, int, struct sockopt_sk);
SEC("cgroup/getsockopt") SEC("cgroup/getsockopt")
int _getsockopt(struct bpf_sockopt *ctx) int _getsockopt(struct bpf_sockopt *ctx)
......
...@@ -13,13 +13,12 @@ struct tcp_rtt_storage { ...@@ -13,13 +13,12 @@ struct tcp_rtt_storage {
__u32 icsk_retransmits; __u32 icsk_retransmits;
}; };
struct bpf_map_def SEC("maps") socket_storage_map = { struct {
.type = BPF_MAP_TYPE_SK_STORAGE, __uint(type, BPF_MAP_TYPE_SK_STORAGE);
.key_size = sizeof(int), __uint(map_flags, BPF_F_NO_PREALLOC);
.value_size = sizeof(struct tcp_rtt_storage), __type(key, int);
.map_flags = BPF_F_NO_PREALLOC, __type(value, struct tcp_rtt_storage);
}; } socket_storage_map SEC(".maps");
BPF_ANNOTATE_KV_PAIR(socket_storage_map, int, struct tcp_rtt_storage);
SEC("sockops") SEC("sockops")
int _sockops(struct bpf_sock_ops *ctx) int _sockops(struct bpf_sock_ops *ctx)
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
/* Copyright (c) 2018 Facebook */ /* Copyright (c) 2018 Facebook */
#include <linux/bpf.h> #include <linux/bpf.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
int _version SEC("version") = 1; int _version SEC("version") = 1;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
/* Copyright (c) 2018 Facebook */ /* Copyright (c) 2018 Facebook */
#include <linux/bpf.h> #include <linux/bpf.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#include "bpf_legacy.h"
int _version SEC("version") = 1; int _version SEC("version") = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment