All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH,bpf-next 0/2] samples: bpf: update map definition to new syntax BTF-defined map
@ 2019-11-05 22:51 Daniel T. Lee
  2019-11-05 22:51 ` [PATCH,bpf-next 1/2] samples: bpf: update outdated error message Daniel T. Lee
  2019-11-05 22:51 ` [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
  0 siblings, 2 replies; 6+ messages in thread
From: Daniel T. Lee @ 2019-11-05 22:51 UTC (permalink / raw)
  To: Daniel Borkmann, Alexei Starovoitov, Andrii Nakryiko; +Cc: netdev, bpf

Since, the new syntax of BTF-defined map has been introduced,
the syntax for using maps under samples directory are mixed up.
For example, some are already using the new syntax, and some are using
existing syntax by calling them as 'legacy'.

As stated at commit abd29c931459 ("libbpf: allow specifying map
definitions using BTF"), the BTF-defined map has more compatablility
with extending supported map definition features.

Also, unifying the map definition to BTF-defined map will help reduce
confusion between new syntax and existing syntax.

The commit doesn't replace all of the map to new BTF-defined map,
because some of the samples still use bpf_load instead of libbpf, which
can't properly create BTF-defined map.

This will only updates the samples which uses libbpf API for loading bpf
program. (ex. bpf_prog_load_xattr)

This patchset fixes some of the outdated error message regarded to loading
bpf program (load_bpf_file -> bpf_prog_load_xattr), and updates map
definition to new syntax of BTF-defined map.

Daniel T. Lee (2):
  samples: bpf: update outdated error message
  samples: bpf: update map definition to new syntax BTF-defined map

 samples/bpf/hbm.c                   |   2 +-
 samples/bpf/sockex1_kern.c          |  12 ++--
 samples/bpf/sockex2_kern.c          |  12 ++--
 samples/bpf/xdp1_kern.c             |  12 ++--
 samples/bpf/xdp1_user.c             |   2 +-
 samples/bpf/xdp2_kern.c             |  12 ++--
 samples/bpf/xdp_adjust_tail_kern.c  |  12 ++--
 samples/bpf/xdp_fwd_kern.c          |  13 ++--
 samples/bpf/xdp_redirect_cpu_kern.c | 108 ++++++++++++++--------------
 samples/bpf/xdp_redirect_kern.c     |  24 +++----
 samples/bpf/xdp_redirect_map_kern.c |  24 +++----
 samples/bpf/xdp_router_ipv4_kern.c  |  64 ++++++++---------
 samples/bpf/xdp_rxq_info_kern.c     |  36 +++++-----
 samples/bpf/xdp_rxq_info_user.c     |   6 +-
 samples/bpf/xdp_sample_pkts_user.c  |   2 +-
 samples/bpf/xdp_tx_iptunnel_kern.c  |  26 +++----
 samples/bpf/xdp_tx_iptunnel_user.c  |   2 +-
 17 files changed, 184 insertions(+), 185 deletions(-)

-- 
2.23.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH,bpf-next 1/2] samples: bpf: update outdated error message
  2019-11-05 22:51 [PATCH,bpf-next 0/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
@ 2019-11-05 22:51 ` Daniel T. Lee
  2019-11-06  2:15   ` Andrii Nakryiko
  2019-11-05 22:51 ` [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
  1 sibling, 1 reply; 6+ messages in thread
From: Daniel T. Lee @ 2019-11-05 22:51 UTC (permalink / raw)
  To: Daniel Borkmann, Alexei Starovoitov, Andrii Nakryiko; +Cc: netdev, bpf

Currently, under samples, several methods are being used to load bpf
program.

Since using libbpf is preferred solution, lots of previously used
'load_bpf_file' from bpf_load are replaced with 'bpf_prog_load_xattr'
from libbpf.

But some of the error messages still show up as 'load_bpf_file' instead
of 'bpf_prog_load_xattr'.

This commit fixes outdated errror messages under samples and fixes some
code style issues.

Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
---
 samples/bpf/hbm.c                  | 2 +-
 samples/bpf/xdp1_user.c            | 2 +-
 samples/bpf/xdp_rxq_info_user.c    | 6 +++---
 samples/bpf/xdp_sample_pkts_user.c | 2 +-
 samples/bpf/xdp_tx_iptunnel_user.c | 2 +-
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/samples/bpf/hbm.c b/samples/bpf/hbm.c
index e0fbab9bec83..829b68d87687 100644
--- a/samples/bpf/hbm.c
+++ b/samples/bpf/hbm.c
@@ -147,7 +147,7 @@ static int prog_load(char *prog)
 	}
 
 	if (ret) {
-		printf("ERROR: load_bpf_file failed for: %s\n", prog);
+		printf("ERROR: bpf_prog_load_xattr failed for: %s\n", prog);
 		printf("  Output from verifier:\n%s\n------\n", bpf_log_buf);
 		ret = -1;
 	} else {
diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
index a8e5fa02e8a8..3e553eed95a7 100644
--- a/samples/bpf/xdp1_user.c
+++ b/samples/bpf/xdp1_user.c
@@ -139,7 +139,7 @@ int main(int argc, char **argv)
 	map_fd = bpf_map__fd(map);
 
 	if (!prog_fd) {
-		printf("load_bpf_file: %s\n", strerror(errno));
+		printf("bpf_prog_load_xattr: %s\n", strerror(errno));
 		return 1;
 	}
 
diff --git a/samples/bpf/xdp_rxq_info_user.c b/samples/bpf/xdp_rxq_info_user.c
index c7e4e45d824a..51e0d810e070 100644
--- a/samples/bpf/xdp_rxq_info_user.c
+++ b/samples/bpf/xdp_rxq_info_user.c
@@ -51,8 +51,8 @@ static const struct option long_options[] = {
 	{"sec",		required_argument,	NULL, 's' },
 	{"no-separators", no_argument,		NULL, 'z' },
 	{"action",	required_argument,	NULL, 'a' },
-	{"readmem", 	no_argument,		NULL, 'r' },
-	{"swapmac", 	no_argument,		NULL, 'm' },
+	{"readmem",	no_argument,		NULL, 'r' },
+	{"swapmac",	no_argument,		NULL, 'm' },
 	{"force",	no_argument,		NULL, 'F' },
 	{0, 0, NULL,  0 }
 };
@@ -499,7 +499,7 @@ int main(int argc, char **argv)
 	map_fd = bpf_map__fd(map);
 
 	if (!prog_fd) {
-		fprintf(stderr, "ERR: load_bpf_file: %s\n", strerror(errno));
+		fprintf(stderr, "ERR: bpf_prog_load_xattr: %s\n", strerror(errno));
 		return EXIT_FAIL;
 	}
 
diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c
index 3002714e3cd5..a5760e8bf2c4 100644
--- a/samples/bpf/xdp_sample_pkts_user.c
+++ b/samples/bpf/xdp_sample_pkts_user.c
@@ -150,7 +150,7 @@ int main(int argc, char **argv)
 		return 1;
 
 	if (!prog_fd) {
-		printf("load_bpf_file: %s\n", strerror(errno));
+		printf("bpf_prog_load_xattr: %s\n", strerror(errno));
 		return 1;
 	}
 
diff --git a/samples/bpf/xdp_tx_iptunnel_user.c b/samples/bpf/xdp_tx_iptunnel_user.c
index dfb68582e243..2fe4c7f5ffe5 100644
--- a/samples/bpf/xdp_tx_iptunnel_user.c
+++ b/samples/bpf/xdp_tx_iptunnel_user.c
@@ -268,7 +268,7 @@ int main(int argc, char **argv)
 		return 1;
 
 	if (!prog_fd) {
-		printf("load_bpf_file: %s\n", strerror(errno));
+		printf("bpf_prog_load_xattr: %s\n", strerror(errno));
 		return 1;
 	}
 
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map
  2019-11-05 22:51 [PATCH,bpf-next 0/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
  2019-11-05 22:51 ` [PATCH,bpf-next 1/2] samples: bpf: update outdated error message Daniel T. Lee
@ 2019-11-05 22:51 ` Daniel T. Lee
  2019-11-06  2:14   ` Andrii Nakryiko
  1 sibling, 1 reply; 6+ messages in thread
From: Daniel T. Lee @ 2019-11-05 22:51 UTC (permalink / raw)
  To: Daniel Borkmann, Alexei Starovoitov, Andrii Nakryiko; +Cc: netdev, bpf

Since, the new syntax of BTF-defined map has been introduced,
the syntax for using maps under samples directory are mixed up.
For example, some are already using the new syntax, and some are using
existing syntax by calling them as 'legacy'.

As stated at commit abd29c931459 ("libbpf: allow specifying map
definitions using BTF"), the BTF-defined map has more compatablility
with extending supported map definition features.

The commit doesn't replace all of the map to new BTF-defined map,
because some of the samples still use bpf_load instead of libbpf, which
can't properly create BTF-defined map.

This will only updates the samples which uses libbpf API for loading bpf
program. (ex. bpf_prog_load_xattr)

Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
---
 samples/bpf/sockex1_kern.c          |  12 ++--
 samples/bpf/sockex2_kern.c          |  12 ++--
 samples/bpf/xdp1_kern.c             |  12 ++--
 samples/bpf/xdp2_kern.c             |  12 ++--
 samples/bpf/xdp_adjust_tail_kern.c  |  12 ++--
 samples/bpf/xdp_fwd_kern.c          |  13 ++--
 samples/bpf/xdp_redirect_cpu_kern.c | 108 ++++++++++++++--------------
 samples/bpf/xdp_redirect_kern.c     |  24 +++----
 samples/bpf/xdp_redirect_map_kern.c |  24 +++----
 samples/bpf/xdp_router_ipv4_kern.c  |  64 ++++++++---------
 samples/bpf/xdp_rxq_info_kern.c     |  36 +++++-----
 samples/bpf/xdp_tx_iptunnel_kern.c  |  26 +++----
 12 files changed, 177 insertions(+), 178 deletions(-)

diff --git a/samples/bpf/sockex1_kern.c b/samples/bpf/sockex1_kern.c
index f96943f443ab..493f102711c0 100644
--- a/samples/bpf/sockex1_kern.c
+++ b/samples/bpf/sockex1_kern.c
@@ -5,12 +5,12 @@
 #include "bpf_helpers.h"
 #include "bpf_legacy.h"
 
-struct bpf_map_def SEC("maps") my_map = {
-	.type = BPF_MAP_TYPE_ARRAY,
-	.key_size = sizeof(u32),
-	.value_size = sizeof(long),
-	.max_entries = 256,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(long));
+	__uint(max_entries, 256);
+} my_map SEC(".maps");
 
 SEC("socket1")
 int bpf_prog1(struct __sk_buff *skb)
diff --git a/samples/bpf/sockex2_kern.c b/samples/bpf/sockex2_kern.c
index 5566fa7d92fa..bd756494625b 100644
--- a/samples/bpf/sockex2_kern.c
+++ b/samples/bpf/sockex2_kern.c
@@ -190,12 +190,12 @@ struct pair {
 	long bytes;
 };
 
-struct bpf_map_def SEC("maps") hash_map = {
-	.type = BPF_MAP_TYPE_HASH,
-	.key_size = sizeof(__be32),
-	.value_size = sizeof(struct pair),
-	.max_entries = 1024,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_HASH);
+	__uint(key_size, sizeof(__be32));
+	__uint(value_size, sizeof(struct pair));
+	__uint(max_entries, 1024);
+} hash_map SEC(".maps");
 
 SEC("socket2")
 int bpf_prog2(struct __sk_buff *skb)
diff --git a/samples/bpf/xdp1_kern.c b/samples/bpf/xdp1_kern.c
index 219742106bfd..a0a181164087 100644
--- a/samples/bpf/xdp1_kern.c
+++ b/samples/bpf/xdp1_kern.c
@@ -14,12 +14,12 @@
 #include <linux/ipv6.h>
 #include "bpf_helpers.h"
 
-struct bpf_map_def SEC("maps") rxcnt = {
-	.type = BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size = sizeof(u32),
-	.value_size = sizeof(long),
-	.max_entries = 256,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(long));
+	__uint(max_entries, 256);
+} rxcnt SEC(".maps");
 
 static int parse_ipv4(void *data, u64 nh_off, void *data_end)
 {
diff --git a/samples/bpf/xdp2_kern.c b/samples/bpf/xdp2_kern.c
index e01288867d15..21564a95561b 100644
--- a/samples/bpf/xdp2_kern.c
+++ b/samples/bpf/xdp2_kern.c
@@ -14,12 +14,12 @@
 #include <linux/ipv6.h>
 #include "bpf_helpers.h"
 
-struct bpf_map_def SEC("maps") rxcnt = {
-	.type = BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size = sizeof(u32),
-	.value_size = sizeof(long),
-	.max_entries = 256,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(long));
+	__uint(max_entries, 256);
+} rxcnt SEC(".maps");
 
 static void swap_src_dst_mac(void *data)
 {
diff --git a/samples/bpf/xdp_adjust_tail_kern.c b/samples/bpf/xdp_adjust_tail_kern.c
index c616508befb9..6de45a4a2c3e 100644
--- a/samples/bpf/xdp_adjust_tail_kern.c
+++ b/samples/bpf/xdp_adjust_tail_kern.c
@@ -28,12 +28,12 @@
 /* volatile to prevent compiler optimizations */
 static volatile __u32 max_pcktsz = MAX_PCKT_SIZE;
 
-struct bpf_map_def SEC("maps") icmpcnt = {
-	.type = BPF_MAP_TYPE_ARRAY,
-	.key_size = sizeof(__u32),
-	.value_size = sizeof(__u64),
-	.max_entries = 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(key_size, sizeof(__u32));
+	__uint(value_size, sizeof(__u64));
+	__uint(max_entries, 1);
+} icmpcnt SEC(".maps");
 
 static __always_inline void count_icmp(void)
 {
diff --git a/samples/bpf/xdp_fwd_kern.c b/samples/bpf/xdp_fwd_kern.c
index 701a30f258b1..d013029aeaa2 100644
--- a/samples/bpf/xdp_fwd_kern.c
+++ b/samples/bpf/xdp_fwd_kern.c
@@ -23,13 +23,12 @@
 
 #define IPV6_FLOWINFO_MASK              cpu_to_be32(0x0FFFFFFF)
 
-/* For TX-traffic redirect requires net_device ifindex to be in this devmap */
-struct bpf_map_def SEC("maps") xdp_tx_ports = {
-	.type = BPF_MAP_TYPE_DEVMAP,
-	.key_size = sizeof(int),
-	.value_size = sizeof(int),
-	.max_entries = 64,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_DEVMAP);
+	__uint(key_size, sizeof(int));
+	__uint(value_size, sizeof(int));
+	__uint(max_entries, 64);
+} xdp_tx_ports SEC(".maps");
 
 /* from include/net/ip.h */
 static __always_inline int ip_decrease_ttl(struct iphdr *iph)
diff --git a/samples/bpf/xdp_redirect_cpu_kern.c b/samples/bpf/xdp_redirect_cpu_kern.c
index a306d1c75622..1f472506aa54 100644
--- a/samples/bpf/xdp_redirect_cpu_kern.c
+++ b/samples/bpf/xdp_redirect_cpu_kern.c
@@ -18,12 +18,12 @@
 #define MAX_CPUS 64 /* WARNING - sync with _user.c */
 
 /* Special map type that can XDP_REDIRECT frames to another CPU */
-struct bpf_map_def SEC("maps") cpu_map = {
-	.type		= BPF_MAP_TYPE_CPUMAP,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(u32),
-	.max_entries	= MAX_CPUS,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_CPUMAP);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(u32));
+	__uint(max_entries, MAX_CPUS);
+} cpu_map SEC(".maps");
 
 /* Common stats data record to keep userspace more simple */
 struct datarec {
@@ -35,67 +35,67 @@ struct datarec {
 /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success
  * feedback.  Redirect TX errors can be caught via a tracepoint.
  */
-struct bpf_map_def SEC("maps") rx_cnt = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, 1);
+} rx_cnt SEC(".maps");
 
 /* Used by trace point */
-struct bpf_map_def SEC("maps") redirect_err_cnt = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= 2,
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, 2);
 	/* TODO: have entries for all possible errno's */
-};
+} redirect_err_cnt SEC(".maps");
 
 /* Used by trace point */
-struct bpf_map_def SEC("maps") cpumap_enqueue_cnt = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= MAX_CPUS,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, MAX_CPUS);
+} cpumap_enqueue_cnt SEC(".maps");
 
 /* Used by trace point */
-struct bpf_map_def SEC("maps") cpumap_kthread_cnt = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, 1);
+} cpumap_kthread_cnt SEC(".maps");
 
 /* Set of maps controlling available CPU, and for iterating through
  * selectable redirect CPUs.
  */
-struct bpf_map_def SEC("maps") cpus_available = {
-	.type		= BPF_MAP_TYPE_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(u32),
-	.max_entries	= MAX_CPUS,
-};
-struct bpf_map_def SEC("maps") cpus_count = {
-	.type		= BPF_MAP_TYPE_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(u32),
-	.max_entries	= 1,
-};
-struct bpf_map_def SEC("maps") cpus_iterator = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(u32),
-	.max_entries	= 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(u32));
+	__uint(max_entries, MAX_CPUS);
+} cpus_available SEC(".maps");
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(u32));
+	__uint(max_entries, 1);
+} cpus_count SEC(".maps");
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(u32));
+	__uint(max_entries, 1);
+} cpus_iterator SEC(".maps");
 
 /* Used by trace point */
-struct bpf_map_def SEC("maps") exception_cnt = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, 1);
+} exception_cnt SEC(".maps");
 
 /* Helper parse functions */
 
diff --git a/samples/bpf/xdp_redirect_kern.c b/samples/bpf/xdp_redirect_kern.c
index 8abb151e385f..205fa07eb135 100644
--- a/samples/bpf/xdp_redirect_kern.c
+++ b/samples/bpf/xdp_redirect_kern.c
@@ -19,22 +19,22 @@
 #include <linux/ipv6.h>
 #include "bpf_helpers.h"
 
-struct bpf_map_def SEC("maps") tx_port = {
-	.type = BPF_MAP_TYPE_ARRAY,
-	.key_size = sizeof(int),
-	.value_size = sizeof(int),
-	.max_entries = 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(key_size, sizeof(int));
+	__uint(value_size, sizeof(int));
+	__uint(max_entries, 1);
+} tx_port SEC(".maps");
 
 /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success
  * feedback.  Redirect TX errors can be caught via a tracepoint.
  */
-struct bpf_map_def SEC("maps") rxcnt = {
-	.type = BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size = sizeof(u32),
-	.value_size = sizeof(long),
-	.max_entries = 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(long));
+	__uint(max_entries, 1);
+} rxcnt SEC(".maps");
 
 static void swap_src_dst_mac(void *data)
 {
diff --git a/samples/bpf/xdp_redirect_map_kern.c b/samples/bpf/xdp_redirect_map_kern.c
index 740a529ba84f..ed5870e305a3 100644
--- a/samples/bpf/xdp_redirect_map_kern.c
+++ b/samples/bpf/xdp_redirect_map_kern.c
@@ -19,22 +19,22 @@
 #include <linux/ipv6.h>
 #include "bpf_helpers.h"
 
-struct bpf_map_def SEC("maps") tx_port = {
-	.type = BPF_MAP_TYPE_DEVMAP,
-	.key_size = sizeof(int),
-	.value_size = sizeof(int),
-	.max_entries = 100,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_DEVMAP);
+	__uint(key_size, sizeof(int));
+	__uint(value_size, sizeof(int));
+	__uint(max_entries, 100);
+} tx_port SEC(".maps");
 
 /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success
  * feedback.  Redirect TX errors can be caught via a tracepoint.
  */
-struct bpf_map_def SEC("maps") rxcnt = {
-	.type = BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size = sizeof(u32),
-	.value_size = sizeof(long),
-	.max_entries = 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(long));
+	__uint(max_entries, 1);
+} rxcnt SEC(".maps");
 
 static void swap_src_dst_mac(void *data)
 {
diff --git a/samples/bpf/xdp_router_ipv4_kern.c b/samples/bpf/xdp_router_ipv4_kern.c
index 993f56bc7b9a..92809c5d8c63 100644
--- a/samples/bpf/xdp_router_ipv4_kern.c
+++ b/samples/bpf/xdp_router_ipv4_kern.c
@@ -42,44 +42,44 @@ struct direct_map {
 };
 
 /* Map for trie implementation*/
-struct bpf_map_def SEC("maps") lpm_map = {
-	.type = BPF_MAP_TYPE_LPM_TRIE,
-	.key_size = 8,
-	.value_size = sizeof(struct trie_value),
-	.max_entries = 50,
-	.map_flags = BPF_F_NO_PREALLOC,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_LPM_TRIE);
+	__uint(key_size, 8);
+	__uint(value_size, sizeof(struct trie_value));
+	__uint(max_entries, 50);
+	__uint(map_flags, BPF_F_NO_PREALLOC);
+} lpm_map SEC(".maps");
 
 /* Map for counter*/
-struct bpf_map_def SEC("maps") rxcnt = {
-	.type = BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size = sizeof(u32),
-	.value_size = sizeof(u64),
-	.max_entries = 256,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(u64));
+	__uint(max_entries, 256);
+} rxcnt SEC(".maps");
 
 /* Map for ARP table*/
-struct bpf_map_def SEC("maps") arp_table = {
-	.type = BPF_MAP_TYPE_HASH,
-	.key_size = sizeof(__be32),
-	.value_size = sizeof(__be64),
-	.max_entries = 50,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_HASH);
+	__uint(key_size, sizeof(__be32));
+	__uint(value_size, sizeof(__be64));
+	__uint(max_entries, 50);
+} arp_table SEC(".maps");
 
 /* Map to keep the exact match entries in the route table*/
-struct bpf_map_def SEC("maps") exact_match = {
-	.type = BPF_MAP_TYPE_HASH,
-	.key_size = sizeof(__be32),
-	.value_size = sizeof(struct direct_map),
-	.max_entries = 50,
-};
-
-struct bpf_map_def SEC("maps") tx_port = {
-	.type = BPF_MAP_TYPE_DEVMAP,
-	.key_size = sizeof(int),
-	.value_size = sizeof(int),
-	.max_entries = 100,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_HASH);
+	__uint(key_size, sizeof(__be32));
+	__uint(value_size, sizeof(struct direct_map));
+	__uint(max_entries, 50);
+} exact_match SEC(".maps");
+
+struct {
+	__uint(type, BPF_MAP_TYPE_DEVMAP);
+	__uint(key_size, sizeof(int));
+	__uint(value_size, sizeof(int));
+	__uint(max_entries, 100);
+} tx_port SEC(".maps");
 
 /* Function to set source and destination mac of the packet */
 static inline void set_src_dst_mac(void *data, void *src, void *dst)
diff --git a/samples/bpf/xdp_rxq_info_kern.c b/samples/bpf/xdp_rxq_info_kern.c
index 222a83eed1cb..6a78f399113d 100644
--- a/samples/bpf/xdp_rxq_info_kern.c
+++ b/samples/bpf/xdp_rxq_info_kern.c
@@ -23,12 +23,13 @@ enum cfg_options_flags {
 	READ_MEM = 0x1U,
 	SWAP_MAC = 0x2U,
 };
-struct bpf_map_def SEC("maps") config_map = {
-	.type		= BPF_MAP_TYPE_ARRAY,
-	.key_size	= sizeof(int),
-	.value_size	= sizeof(struct config),
-	.max_entries	= 1,
-};
+
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(key_size, sizeof(int));
+	__uint(value_size, sizeof(struct config));
+	__uint(max_entries, 1);
+} config_map SEC(".maps");
 
 /* Common stats data record (shared with userspace) */
 struct datarec {
@@ -36,22 +37,22 @@ struct datarec {
 	__u64 issue;
 };
 
-struct bpf_map_def SEC("maps") stats_global_map = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, 1);
+} stats_global_map SEC(".maps");
 
 #define MAX_RXQs 64
 
 /* Stats per rx_queue_index (per CPU) */
-struct bpf_map_def SEC("maps") rx_queue_index_map = {
-	.type		= BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size	= sizeof(u32),
-	.value_size	= sizeof(struct datarec),
-	.max_entries	= MAX_RXQs + 1,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(u32));
+	__uint(value_size, sizeof(struct datarec));
+	__uint(max_entries, MAX_RXQs + 1);
+} rx_queue_index_map SEC(".maps");
 
 static __always_inline
 void swap_src_dst_mac(void *data)
diff --git a/samples/bpf/xdp_tx_iptunnel_kern.c b/samples/bpf/xdp_tx_iptunnel_kern.c
index 0f4f6e8c8611..044b6f3edfeb 100644
--- a/samples/bpf/xdp_tx_iptunnel_kern.c
+++ b/samples/bpf/xdp_tx_iptunnel_kern.c
@@ -19,19 +19,19 @@
 #include "bpf_helpers.h"
 #include "xdp_tx_iptunnel_common.h"
 
-struct bpf_map_def SEC("maps") rxcnt = {
-	.type = BPF_MAP_TYPE_PERCPU_ARRAY,
-	.key_size = sizeof(__u32),
-	.value_size = sizeof(__u64),
-	.max_entries = 256,
-};
-
-struct bpf_map_def SEC("maps") vip2tnl = {
-	.type = BPF_MAP_TYPE_HASH,
-	.key_size = sizeof(struct vip),
-	.value_size = sizeof(struct iptnl_info),
-	.max_entries = MAX_IPTNL_ENTRIES,
-};
+struct {
+	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+	__uint(key_size, sizeof(__u32));
+	__uint(value_size, sizeof(__u64));
+	__uint(max_entries, 256);
+} rxcnt SEC(".maps");
+
+struct {
+	__uint(type, BPF_MAP_TYPE_HASH);
+	__uint(key_size, sizeof(struct vip));
+	__uint(value_size, sizeof(struct iptnl_info));
+	__uint(max_entries, MAX_IPTNL_ENTRIES);
+} vip2tnl SEC(".maps");
 
 static __always_inline void count_tx(u32 protocol)
 {
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map
  2019-11-05 22:51 ` [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
@ 2019-11-06  2:14   ` Andrii Nakryiko
  2019-11-07  0:44     ` Daniel T. Lee
  0 siblings, 1 reply; 6+ messages in thread
From: Andrii Nakryiko @ 2019-11-06  2:14 UTC (permalink / raw)
  To: Daniel T. Lee
  Cc: Daniel Borkmann, Alexei Starovoitov, Andrii Nakryiko, Networking, bpf

On Tue, Nov 5, 2019 at 2:52 PM Daniel T. Lee <danieltimlee@gmail.com> wrote:
>
> Since, the new syntax of BTF-defined map has been introduced,
> the syntax for using maps under samples directory are mixed up.
> For example, some are already using the new syntax, and some are using
> existing syntax by calling them as 'legacy'.
>
> As stated at commit abd29c931459 ("libbpf: allow specifying map
> definitions using BTF"), the BTF-defined map has more compatablility
> with extending supported map definition features.
>
> The commit doesn't replace all of the map to new BTF-defined map,
> because some of the samples still use bpf_load instead of libbpf, which
> can't properly create BTF-defined map.
>
> This will only updates the samples which uses libbpf API for loading bpf
> program. (ex. bpf_prog_load_xattr)
>
> Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
> ---


Please try to stick to __type() for key/value, where possible (all the
arrays, hashes, per-cpu arrays definitely work). Some of the special
CPUMAP, DEVMAP might not work. Not sure about TRIEs, please try.

>  samples/bpf/sockex1_kern.c          |  12 ++--
>  samples/bpf/sockex2_kern.c          |  12 ++--
>  samples/bpf/xdp1_kern.c             |  12 ++--
>  samples/bpf/xdp2_kern.c             |  12 ++--
>  samples/bpf/xdp_adjust_tail_kern.c  |  12 ++--
>  samples/bpf/xdp_fwd_kern.c          |  13 ++--
>  samples/bpf/xdp_redirect_cpu_kern.c | 108 ++++++++++++++--------------
>  samples/bpf/xdp_redirect_kern.c     |  24 +++----
>  samples/bpf/xdp_redirect_map_kern.c |  24 +++----
>  samples/bpf/xdp_router_ipv4_kern.c  |  64 ++++++++---------
>  samples/bpf/xdp_rxq_info_kern.c     |  36 +++++-----
>  samples/bpf/xdp_tx_iptunnel_kern.c  |  26 +++----
>  12 files changed, 177 insertions(+), 178 deletions(-)
>
> diff --git a/samples/bpf/sockex1_kern.c b/samples/bpf/sockex1_kern.c
> index f96943f443ab..493f102711c0 100644
> --- a/samples/bpf/sockex1_kern.c
> +++ b/samples/bpf/sockex1_kern.c
> @@ -5,12 +5,12 @@
>  #include "bpf_helpers.h"
>  #include "bpf_legacy.h"
>
> -struct bpf_map_def SEC("maps") my_map = {
> -       .type = BPF_MAP_TYPE_ARRAY,
> -       .key_size = sizeof(u32),
> -       .value_size = sizeof(long),
> -       .max_entries = 256,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(long));
> +       __uint(max_entries, 256);
> +} my_map SEC(".maps");
>
>  SEC("socket1")
>  int bpf_prog1(struct __sk_buff *skb)
> diff --git a/samples/bpf/sockex2_kern.c b/samples/bpf/sockex2_kern.c
> index 5566fa7d92fa..bd756494625b 100644
> --- a/samples/bpf/sockex2_kern.c
> +++ b/samples/bpf/sockex2_kern.c
> @@ -190,12 +190,12 @@ struct pair {
>         long bytes;
>  };
>
> -struct bpf_map_def SEC("maps") hash_map = {
> -       .type = BPF_MAP_TYPE_HASH,
> -       .key_size = sizeof(__be32),
> -       .value_size = sizeof(struct pair),
> -       .max_entries = 1024,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_HASH);
> +       __uint(key_size, sizeof(__be32));
> +       __uint(value_size, sizeof(struct pair));

let's use __type(key, __be32) and __type(value, struct pair) here and
in most other places where we have maps supporting BTF

> +       __uint(max_entries, 1024);
> +} hash_map SEC(".maps");
>
>  SEC("socket2")
>  int bpf_prog2(struct __sk_buff *skb)
> diff --git a/samples/bpf/xdp1_kern.c b/samples/bpf/xdp1_kern.c
> index 219742106bfd..a0a181164087 100644
> --- a/samples/bpf/xdp1_kern.c
> +++ b/samples/bpf/xdp1_kern.c
> @@ -14,12 +14,12 @@
>  #include <linux/ipv6.h>
>  #include "bpf_helpers.h"
>
> -struct bpf_map_def SEC("maps") rxcnt = {
> -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size = sizeof(u32),
> -       .value_size = sizeof(long),
> -       .max_entries = 256,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(long));
> +       __uint(max_entries, 256);
> +} rxcnt SEC(".maps");
>
>  static int parse_ipv4(void *data, u64 nh_off, void *data_end)
>  {
> diff --git a/samples/bpf/xdp2_kern.c b/samples/bpf/xdp2_kern.c
> index e01288867d15..21564a95561b 100644
> --- a/samples/bpf/xdp2_kern.c
> +++ b/samples/bpf/xdp2_kern.c
> @@ -14,12 +14,12 @@
>  #include <linux/ipv6.h>
>  #include "bpf_helpers.h"
>
> -struct bpf_map_def SEC("maps") rxcnt = {
> -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size = sizeof(u32),
> -       .value_size = sizeof(long),
> -       .max_entries = 256,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(long));
> +       __uint(max_entries, 256);
> +} rxcnt SEC(".maps");
>
>  static void swap_src_dst_mac(void *data)
>  {
> diff --git a/samples/bpf/xdp_adjust_tail_kern.c b/samples/bpf/xdp_adjust_tail_kern.c
> index c616508befb9..6de45a4a2c3e 100644
> --- a/samples/bpf/xdp_adjust_tail_kern.c
> +++ b/samples/bpf/xdp_adjust_tail_kern.c
> @@ -28,12 +28,12 @@
>  /* volatile to prevent compiler optimizations */
>  static volatile __u32 max_pcktsz = MAX_PCKT_SIZE;
>
> -struct bpf_map_def SEC("maps") icmpcnt = {
> -       .type = BPF_MAP_TYPE_ARRAY,
> -       .key_size = sizeof(__u32),
> -       .value_size = sizeof(__u64),
> -       .max_entries = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_ARRAY);
> +       __uint(key_size, sizeof(__u32));
> +       __uint(value_size, sizeof(__u64));
> +       __uint(max_entries, 1);
> +} icmpcnt SEC(".maps");
>
>  static __always_inline void count_icmp(void)
>  {
> diff --git a/samples/bpf/xdp_fwd_kern.c b/samples/bpf/xdp_fwd_kern.c
> index 701a30f258b1..d013029aeaa2 100644
> --- a/samples/bpf/xdp_fwd_kern.c
> +++ b/samples/bpf/xdp_fwd_kern.c
> @@ -23,13 +23,12 @@
>
>  #define IPV6_FLOWINFO_MASK              cpu_to_be32(0x0FFFFFFF)
>
> -/* For TX-traffic redirect requires net_device ifindex to be in this devmap */
> -struct bpf_map_def SEC("maps") xdp_tx_ports = {
> -       .type = BPF_MAP_TYPE_DEVMAP,
> -       .key_size = sizeof(int),
> -       .value_size = sizeof(int),
> -       .max_entries = 64,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_DEVMAP);
> +       __uint(key_size, sizeof(int));
> +       __uint(value_size, sizeof(int));
> +       __uint(max_entries, 64);
> +} xdp_tx_ports SEC(".maps");

DEVMAP might be special, I don't remember, so key_size/value_size
might be necessary

>
>  /* from include/net/ip.h */
>  static __always_inline int ip_decrease_ttl(struct iphdr *iph)
> diff --git a/samples/bpf/xdp_redirect_cpu_kern.c b/samples/bpf/xdp_redirect_cpu_kern.c
> index a306d1c75622..1f472506aa54 100644
> --- a/samples/bpf/xdp_redirect_cpu_kern.c
> +++ b/samples/bpf/xdp_redirect_cpu_kern.c
> @@ -18,12 +18,12 @@
>  #define MAX_CPUS 64 /* WARNING - sync with _user.c */
>
>  /* Special map type that can XDP_REDIRECT frames to another CPU */
> -struct bpf_map_def SEC("maps") cpu_map = {
> -       .type           = BPF_MAP_TYPE_CPUMAP,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(u32),
> -       .max_entries    = MAX_CPUS,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_CPUMAP);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(u32));
> +       __uint(max_entries, MAX_CPUS);
> +} cpu_map SEC(".maps");
>

same for CPUMAP, but would be nice to double-check.

>  /* Common stats data record to keep userspace more simple */
>  struct datarec {
> @@ -35,67 +35,67 @@ struct datarec {
>  /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success
>   * feedback.  Redirect TX errors can be caught via a tracepoint.
>   */
> -struct bpf_map_def SEC("maps") rx_cnt = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, 1);
> +} rx_cnt SEC(".maps");
>
>  /* Used by trace point */
> -struct bpf_map_def SEC("maps") redirect_err_cnt = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = 2,
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, 2);
>         /* TODO: have entries for all possible errno's */
> -};
> +} redirect_err_cnt SEC(".maps");
>
>  /* Used by trace point */
> -struct bpf_map_def SEC("maps") cpumap_enqueue_cnt = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = MAX_CPUS,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, MAX_CPUS);
> +} cpumap_enqueue_cnt SEC(".maps");
>
>  /* Used by trace point */
> -struct bpf_map_def SEC("maps") cpumap_kthread_cnt = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, 1);
> +} cpumap_kthread_cnt SEC(".maps");
>
>  /* Set of maps controlling available CPU, and for iterating through
>   * selectable redirect CPUs.
>   */
> -struct bpf_map_def SEC("maps") cpus_available = {
> -       .type           = BPF_MAP_TYPE_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(u32),
> -       .max_entries    = MAX_CPUS,
> -};
> -struct bpf_map_def SEC("maps") cpus_count = {
> -       .type           = BPF_MAP_TYPE_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(u32),
> -       .max_entries    = 1,
> -};
> -struct bpf_map_def SEC("maps") cpus_iterator = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(u32),
> -       .max_entries    = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(u32));
> +       __uint(max_entries, MAX_CPUS);
> +} cpus_available SEC(".maps");
> +struct {
> +       __uint(type, BPF_MAP_TYPE_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(u32));
> +       __uint(max_entries, 1);
> +} cpus_count SEC(".maps");
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(u32));
> +       __uint(max_entries, 1);
> +} cpus_iterator SEC(".maps");
>
>  /* Used by trace point */
> -struct bpf_map_def SEC("maps") exception_cnt = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, 1);
> +} exception_cnt SEC(".maps");
>
>  /* Helper parse functions */
>
> diff --git a/samples/bpf/xdp_redirect_kern.c b/samples/bpf/xdp_redirect_kern.c
> index 8abb151e385f..205fa07eb135 100644
> --- a/samples/bpf/xdp_redirect_kern.c
> +++ b/samples/bpf/xdp_redirect_kern.c
> @@ -19,22 +19,22 @@
>  #include <linux/ipv6.h>
>  #include "bpf_helpers.h"
>
> -struct bpf_map_def SEC("maps") tx_port = {
> -       .type = BPF_MAP_TYPE_ARRAY,
> -       .key_size = sizeof(int),
> -       .value_size = sizeof(int),
> -       .max_entries = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_ARRAY);
> +       __uint(key_size, sizeof(int));
> +       __uint(value_size, sizeof(int));
> +       __uint(max_entries, 1);
> +} tx_port SEC(".maps");
>
>  /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success
>   * feedback.  Redirect TX errors can be caught via a tracepoint.
>   */
> -struct bpf_map_def SEC("maps") rxcnt = {
> -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size = sizeof(u32),
> -       .value_size = sizeof(long),
> -       .max_entries = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(long));
> +       __uint(max_entries, 1);
> +} rxcnt SEC(".maps");
>
>  static void swap_src_dst_mac(void *data)
>  {
> diff --git a/samples/bpf/xdp_redirect_map_kern.c b/samples/bpf/xdp_redirect_map_kern.c
> index 740a529ba84f..ed5870e305a3 100644
> --- a/samples/bpf/xdp_redirect_map_kern.c
> +++ b/samples/bpf/xdp_redirect_map_kern.c
> @@ -19,22 +19,22 @@
>  #include <linux/ipv6.h>
>  #include "bpf_helpers.h"
>
> -struct bpf_map_def SEC("maps") tx_port = {
> -       .type = BPF_MAP_TYPE_DEVMAP,
> -       .key_size = sizeof(int),
> -       .value_size = sizeof(int),
> -       .max_entries = 100,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_DEVMAP);
> +       __uint(key_size, sizeof(int));
> +       __uint(value_size, sizeof(int));
> +       __uint(max_entries, 100);
> +} tx_port SEC(".maps");
>
>  /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success
>   * feedback.  Redirect TX errors can be caught via a tracepoint.
>   */
> -struct bpf_map_def SEC("maps") rxcnt = {
> -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size = sizeof(u32),
> -       .value_size = sizeof(long),
> -       .max_entries = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(long));
> +       __uint(max_entries, 1);
> +} rxcnt SEC(".maps");
>
>  static void swap_src_dst_mac(void *data)
>  {
> diff --git a/samples/bpf/xdp_router_ipv4_kern.c b/samples/bpf/xdp_router_ipv4_kern.c
> index 993f56bc7b9a..92809c5d8c63 100644
> --- a/samples/bpf/xdp_router_ipv4_kern.c
> +++ b/samples/bpf/xdp_router_ipv4_kern.c
> @@ -42,44 +42,44 @@ struct direct_map {
>  };
>
>  /* Map for trie implementation*/
> -struct bpf_map_def SEC("maps") lpm_map = {
> -       .type = BPF_MAP_TYPE_LPM_TRIE,
> -       .key_size = 8,
> -       .value_size = sizeof(struct trie_value),
> -       .max_entries = 50,
> -       .map_flags = BPF_F_NO_PREALLOC,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_LPM_TRIE);
> +       __uint(key_size, 8);
> +       __uint(value_size, sizeof(struct trie_value));
> +       __uint(max_entries, 50);
> +       __uint(map_flags, BPF_F_NO_PREALLOC);
> +} lpm_map SEC(".maps");
>
>  /* Map for counter*/
> -struct bpf_map_def SEC("maps") rxcnt = {
> -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size = sizeof(u32),
> -       .value_size = sizeof(u64),
> -       .max_entries = 256,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(u64));
> +       __uint(max_entries, 256);
> +} rxcnt SEC(".maps");
>
>  /* Map for ARP table*/
> -struct bpf_map_def SEC("maps") arp_table = {
> -       .type = BPF_MAP_TYPE_HASH,
> -       .key_size = sizeof(__be32),
> -       .value_size = sizeof(__be64),
> -       .max_entries = 50,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_HASH);
> +       __uint(key_size, sizeof(__be32));
> +       __uint(value_size, sizeof(__be64));
> +       __uint(max_entries, 50);
> +} arp_table SEC(".maps");
>
>  /* Map to keep the exact match entries in the route table*/
> -struct bpf_map_def SEC("maps") exact_match = {
> -       .type = BPF_MAP_TYPE_HASH,
> -       .key_size = sizeof(__be32),
> -       .value_size = sizeof(struct direct_map),
> -       .max_entries = 50,
> -};
> -
> -struct bpf_map_def SEC("maps") tx_port = {
> -       .type = BPF_MAP_TYPE_DEVMAP,
> -       .key_size = sizeof(int),
> -       .value_size = sizeof(int),
> -       .max_entries = 100,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_HASH);
> +       __uint(key_size, sizeof(__be32));
> +       __uint(value_size, sizeof(struct direct_map));
> +       __uint(max_entries, 50);
> +} exact_match SEC(".maps");
> +
> +struct {
> +       __uint(type, BPF_MAP_TYPE_DEVMAP);
> +       __uint(key_size, sizeof(int));
> +       __uint(value_size, sizeof(int));
> +       __uint(max_entries, 100);
> +} tx_port SEC(".maps");
>
>  /* Function to set source and destination mac of the packet */
>  static inline void set_src_dst_mac(void *data, void *src, void *dst)
> diff --git a/samples/bpf/xdp_rxq_info_kern.c b/samples/bpf/xdp_rxq_info_kern.c
> index 222a83eed1cb..6a78f399113d 100644
> --- a/samples/bpf/xdp_rxq_info_kern.c
> +++ b/samples/bpf/xdp_rxq_info_kern.c
> @@ -23,12 +23,13 @@ enum cfg_options_flags {
>         READ_MEM = 0x1U,
>         SWAP_MAC = 0x2U,
>  };
> -struct bpf_map_def SEC("maps") config_map = {
> -       .type           = BPF_MAP_TYPE_ARRAY,
> -       .key_size       = sizeof(int),
> -       .value_size     = sizeof(struct config),
> -       .max_entries    = 1,
> -};
> +
> +struct {
> +       __uint(type, BPF_MAP_TYPE_ARRAY);
> +       __uint(key_size, sizeof(int));
> +       __uint(value_size, sizeof(struct config));
> +       __uint(max_entries, 1);
> +} config_map SEC(".maps");
>
>  /* Common stats data record (shared with userspace) */
>  struct datarec {
> @@ -36,22 +37,22 @@ struct datarec {
>         __u64 issue;
>  };
>
> -struct bpf_map_def SEC("maps") stats_global_map = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, 1);
> +} stats_global_map SEC(".maps");
>
>  #define MAX_RXQs 64
>
>  /* Stats per rx_queue_index (per CPU) */
> -struct bpf_map_def SEC("maps") rx_queue_index_map = {
> -       .type           = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size       = sizeof(u32),
> -       .value_size     = sizeof(struct datarec),
> -       .max_entries    = MAX_RXQs + 1,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(u32));
> +       __uint(value_size, sizeof(struct datarec));
> +       __uint(max_entries, MAX_RXQs + 1);
> +} rx_queue_index_map SEC(".maps");
>
>  static __always_inline
>  void swap_src_dst_mac(void *data)
> diff --git a/samples/bpf/xdp_tx_iptunnel_kern.c b/samples/bpf/xdp_tx_iptunnel_kern.c
> index 0f4f6e8c8611..044b6f3edfeb 100644
> --- a/samples/bpf/xdp_tx_iptunnel_kern.c
> +++ b/samples/bpf/xdp_tx_iptunnel_kern.c
> @@ -19,19 +19,19 @@
>  #include "bpf_helpers.h"
>  #include "xdp_tx_iptunnel_common.h"
>
> -struct bpf_map_def SEC("maps") rxcnt = {
> -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> -       .key_size = sizeof(__u32),
> -       .value_size = sizeof(__u64),
> -       .max_entries = 256,
> -};
> -
> -struct bpf_map_def SEC("maps") vip2tnl = {
> -       .type = BPF_MAP_TYPE_HASH,
> -       .key_size = sizeof(struct vip),
> -       .value_size = sizeof(struct iptnl_info),
> -       .max_entries = MAX_IPTNL_ENTRIES,
> -};
> +struct {
> +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> +       __uint(key_size, sizeof(__u32));
> +       __uint(value_size, sizeof(__u64));
> +       __uint(max_entries, 256);
> +} rxcnt SEC(".maps");
> +
> +struct {
> +       __uint(type, BPF_MAP_TYPE_HASH);
> +       __uint(key_size, sizeof(struct vip));
> +       __uint(value_size, sizeof(struct iptnl_info));
> +       __uint(max_entries, MAX_IPTNL_ENTRIES);
> +} vip2tnl SEC(".maps");
>
>  static __always_inline void count_tx(u32 protocol)
>  {
> --
> 2.23.0
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH,bpf-next 1/2] samples: bpf: update outdated error message
  2019-11-05 22:51 ` [PATCH,bpf-next 1/2] samples: bpf: update outdated error message Daniel T. Lee
@ 2019-11-06  2:15   ` Andrii Nakryiko
  0 siblings, 0 replies; 6+ messages in thread
From: Andrii Nakryiko @ 2019-11-06  2:15 UTC (permalink / raw)
  To: Daniel T. Lee
  Cc: Daniel Borkmann, Alexei Starovoitov, Andrii Nakryiko, Networking, bpf

On Tue, Nov 5, 2019 at 2:51 PM Daniel T. Lee <danieltimlee@gmail.com> wrote:
>
> Currently, under samples, several methods are being used to load bpf
> program.
>
> Since using libbpf is preferred solution, lots of previously used
> 'load_bpf_file' from bpf_load are replaced with 'bpf_prog_load_xattr'
> from libbpf.
>
> But some of the error messages still show up as 'load_bpf_file' instead
> of 'bpf_prog_load_xattr'.
>
> This commit fixes outdated errror messages under samples and fixes some
> code style issues.
>
> Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
> ---

Acked-by: Andrii Nakryiko <andriin@fb.com>

[...]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map
  2019-11-06  2:14   ` Andrii Nakryiko
@ 2019-11-07  0:44     ` Daniel T. Lee
  0 siblings, 0 replies; 6+ messages in thread
From: Daniel T. Lee @ 2019-11-07  0:44 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: Daniel Borkmann, Alexei Starovoitov, Andrii Nakryiko, Networking, bpf

On Wed, Nov 6, 2019 at 11:14 AM Andrii Nakryiko
<andrii.nakryiko@gmail.com> wrote:
>
> On Tue, Nov 5, 2019 at 2:52 PM Daniel T. Lee <danieltimlee@gmail.com> wrote:
> >
> > Since, the new syntax of BTF-defined map has been introduced,
> > the syntax for using maps under samples directory are mixed up.
> > For example, some are already using the new syntax, and some are using
> > existing syntax by calling them as 'legacy'.
> >
> > As stated at commit abd29c931459 ("libbpf: allow specifying map
> > definitions using BTF"), the BTF-defined map has more compatablility
> > with extending supported map definition features.
> >
> > The commit doesn't replace all of the map to new BTF-defined map,
> > because some of the samples still use bpf_load instead of libbpf, which
> > can't properly create BTF-defined map.
> >
> > This will only updates the samples which uses libbpf API for loading bpf
> > program. (ex. bpf_prog_load_xattr)
> >
> > Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
> > ---
>
>
> Please try to stick to __type() for key/value, where possible (all the
> arrays, hashes, per-cpu arrays definitely work). Some of the special
> CPUMAP, DEVMAP might not work. Not sure about TRIEs, please try.
>

Will apply feedback right away!
Thanks for the review!

> >  samples/bpf/sockex1_kern.c          |  12 ++--
> >  samples/bpf/sockex2_kern.c          |  12 ++--
> >  samples/bpf/xdp1_kern.c             |  12 ++--
> >  samples/bpf/xdp2_kern.c             |  12 ++--
> >  samples/bpf/xdp_adjust_tail_kern.c  |  12 ++--
> >  samples/bpf/xdp_fwd_kern.c          |  13 ++--
> >  samples/bpf/xdp_redirect_cpu_kern.c | 108 ++++++++++++++--------------
> >  samples/bpf/xdp_redirect_kern.c     |  24 +++----
> >  samples/bpf/xdp_redirect_map_kern.c |  24 +++----
> >  samples/bpf/xdp_router_ipv4_kern.c  |  64 ++++++++---------
> >  samples/bpf/xdp_rxq_info_kern.c     |  36 +++++-----
> >  samples/bpf/xdp_tx_iptunnel_kern.c  |  26 +++----
> >  12 files changed, 177 insertions(+), 178 deletions(-)
> >
> > diff --git a/samples/bpf/sockex1_kern.c b/samples/bpf/sockex1_kern.c
> > index f96943f443ab..493f102711c0 100644
> > --- a/samples/bpf/sockex1_kern.c
> > +++ b/samples/bpf/sockex1_kern.c
> > @@ -5,12 +5,12 @@
> >  #include "bpf_helpers.h"
> >  #include "bpf_legacy.h"
> >
> > -struct bpf_map_def SEC("maps") my_map = {
> > -       .type = BPF_MAP_TYPE_ARRAY,
> > -       .key_size = sizeof(u32),
> > -       .value_size = sizeof(long),
> > -       .max_entries = 256,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_ARRAY);
> > +       __uint(key_size, sizeof(u32));
> > +       __uint(value_size, sizeof(long));
> > +       __uint(max_entries, 256);
> > +} my_map SEC(".maps");
> >
> >  SEC("socket1")
> >  int bpf_prog1(struct __sk_buff *skb)
> > diff --git a/samples/bpf/sockex2_kern.c b/samples/bpf/sockex2_kern.c
> > index 5566fa7d92fa..bd756494625b 100644
> > --- a/samples/bpf/sockex2_kern.c
> > +++ b/samples/bpf/sockex2_kern.c
> > @@ -190,12 +190,12 @@ struct pair {
> >         long bytes;
> >  };
> >
> > -struct bpf_map_def SEC("maps") hash_map = {
> > -       .type = BPF_MAP_TYPE_HASH,
> > -       .key_size = sizeof(__be32),
> > -       .value_size = sizeof(struct pair),
> > -       .max_entries = 1024,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_HASH);
> > +       __uint(key_size, sizeof(__be32));
> > +       __uint(value_size, sizeof(struct pair));
>
> let's use __type(key, __be32) and __type(value, struct pair) here and
> in most other places where we have maps supporting BTF
>
> > +       __uint(max_entries, 1024);
> > +} hash_map SEC(".maps");
> >
> >  SEC("socket2")
> >  int bpf_prog2(struct __sk_buff *skb)
> > diff --git a/samples/bpf/xdp1_kern.c b/samples/bpf/xdp1_kern.c
> > index 219742106bfd..a0a181164087 100644
> > --- a/samples/bpf/xdp1_kern.c
> > +++ b/samples/bpf/xdp1_kern.c
> > @@ -14,12 +14,12 @@
> >  #include <linux/ipv6.h>
> >  #include "bpf_helpers.h"
> >
> > -struct bpf_map_def SEC("maps") rxcnt = {
> > -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> > -       .key_size = sizeof(u32),
> > -       .value_size = sizeof(long),
> > -       .max_entries = 256,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> > +       __uint(key_size, sizeof(u32));
> > +       __uint(value_size, sizeof(long));
> > +       __uint(max_entries, 256);
> > +} rxcnt SEC(".maps");
> >
> >  static int parse_ipv4(void *data, u64 nh_off, void *data_end)
> >  {
> > diff --git a/samples/bpf/xdp2_kern.c b/samples/bpf/xdp2_kern.c
> > index e01288867d15..21564a95561b 100644
> > --- a/samples/bpf/xdp2_kern.c
> > +++ b/samples/bpf/xdp2_kern.c
> > @@ -14,12 +14,12 @@
> >  #include <linux/ipv6.h>
> >  #include "bpf_helpers.h"
> >
> > -struct bpf_map_def SEC("maps") rxcnt = {
> > -       .type = BPF_MAP_TYPE_PERCPU_ARRAY,
> > -       .key_size = sizeof(u32),
> > -       .value_size = sizeof(long),
> > -       .max_entries = 256,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> > +       __uint(key_size, sizeof(u32));
> > +       __uint(value_size, sizeof(long));
> > +       __uint(max_entries, 256);
> > +} rxcnt SEC(".maps");
> >
> >  static void swap_src_dst_mac(void *data)
> >  {
> > diff --git a/samples/bpf/xdp_adjust_tail_kern.c b/samples/bpf/xdp_adjust_tail_kern.c
> > index c616508befb9..6de45a4a2c3e 100644
> > --- a/samples/bpf/xdp_adjust_tail_kern.c
> > +++ b/samples/bpf/xdp_adjust_tail_kern.c
> > @@ -28,12 +28,12 @@
> >  /* volatile to prevent compiler optimizations */
> >  static volatile __u32 max_pcktsz = MAX_PCKT_SIZE;
> >
> > -struct bpf_map_def SEC("maps") icmpcnt = {
> > -       .type = BPF_MAP_TYPE_ARRAY,
> > -       .key_size = sizeof(__u32),
> > -       .value_size = sizeof(__u64),
> > -       .max_entries = 1,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_ARRAY);
> > +       __uint(key_size, sizeof(__u32));
> > +       __uint(value_size, sizeof(__u64));
> > +       __uint(max_entries, 1);
> > +} icmpcnt SEC(".maps");
> >
> >  static __always_inline void count_icmp(void)
> >  {
> > diff --git a/samples/bpf/xdp_fwd_kern.c b/samples/bpf/xdp_fwd_kern.c
> > index 701a30f258b1..d013029aeaa2 100644
> > --- a/samples/bpf/xdp_fwd_kern.c
> > +++ b/samples/bpf/xdp_fwd_kern.c
> > @@ -23,13 +23,12 @@
> >
> >  #define IPV6_FLOWINFO_MASK              cpu_to_be32(0x0FFFFFFF)
> >
> > -/* For TX-traffic redirect requires net_device ifindex to be in this devmap */
> > -struct bpf_map_def SEC("maps") xdp_tx_ports = {
> > -       .type = BPF_MAP_TYPE_DEVMAP,
> > -       .key_size = sizeof(int),
> > -       .value_size = sizeof(int),
> > -       .max_entries = 64,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_DEVMAP);
> > +       __uint(key_size, sizeof(int));
> > +       __uint(value_size, sizeof(int));
> > +       __uint(max_entries, 64);
> > +} xdp_tx_ports SEC(".maps");
>
> DEVMAP might be special, I don't remember, so key_size/value_size
> might be necessary

As you've mentioned, DEVMAP does not work with __type.

>
> >
> >  /* from include/net/ip.h */
> >  static __always_inline int ip_decrease_ttl(struct iphdr *iph)
> > diff --git a/samples/bpf/xdp_redirect_cpu_kern.c b/samples/bpf/xdp_redirect_cpu_kern.c
> > index a306d1c75622..1f472506aa54 100644
> > --- a/samples/bpf/xdp_redirect_cpu_kern.c
> > +++ b/samples/bpf/xdp_redirect_cpu_kern.c
> > @@ -18,12 +18,12 @@
> >  #define MAX_CPUS 64 /* WARNING - sync with _user.c */
> >
> >  /* Special map type that can XDP_REDIRECT frames to another CPU */
> > -struct bpf_map_def SEC("maps") cpu_map = {
> > -       .type           = BPF_MAP_TYPE_CPUMAP,
> > -       .key_size       = sizeof(u32),
> > -       .value_size     = sizeof(u32),
> > -       .max_entries    = MAX_CPUS,
> > -};
> > +struct {
> > +       __uint(type, BPF_MAP_TYPE_CPUMAP);
> > +       __uint(key_size, sizeof(u32));
> > +       __uint(value_size, sizeof(u32));
> > +       __uint(max_entries, MAX_CPUS);
> > +} cpu_map SEC(".maps");
> >
>
> same for CPUMAP, but would be nice to double-check.
>

Same for the CPUMAP. Just checked.
Seems TRIE doesn't work either. it uses __uint(key_size, 8);
and __type(key, 8); is not acceptable.

[...]

Thank you for your time and effort for the review.

Thanks,
Daniel

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-11-07  0:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-05 22:51 [PATCH,bpf-next 0/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
2019-11-05 22:51 ` [PATCH,bpf-next 1/2] samples: bpf: update outdated error message Daniel T. Lee
2019-11-06  2:15   ` Andrii Nakryiko
2019-11-05 22:51 ` [PATCH,bpf-next 2/2] samples: bpf: update map definition to new syntax BTF-defined map Daniel T. Lee
2019-11-06  2:14   ` Andrii Nakryiko
2019-11-07  0:44     ` Daniel T. Lee

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.