Commit 89b97607 authored by Alexei Starovoitov's avatar Alexei Starovoitov Committed by David S. Miller

samples/bpf: add map_flags to bpf loader

note old loader is compatible with new kernel.
map_flags are optional
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3622e7e4
...@@ -61,6 +61,7 @@ struct bpf_map_def { ...@@ -61,6 +61,7 @@ struct bpf_map_def {
unsigned int key_size; unsigned int key_size;
unsigned int value_size; unsigned int value_size;
unsigned int max_entries; unsigned int max_entries;
unsigned int map_flags;
}; };
static int (*bpf_skb_store_bytes)(void *ctx, int off, void *from, int len, int flags) = static int (*bpf_skb_store_bytes)(void *ctx, int off, void *from, int len, int flags) =
......
...@@ -157,7 +157,8 @@ static int load_maps(struct bpf_map_def *maps, int len) ...@@ -157,7 +157,8 @@ static int load_maps(struct bpf_map_def *maps, int len)
map_fd[i] = bpf_create_map(maps[i].type, map_fd[i] = bpf_create_map(maps[i].type,
maps[i].key_size, maps[i].key_size,
maps[i].value_size, maps[i].value_size,
maps[i].max_entries); maps[i].max_entries,
maps[i].map_flags);
if (map_fd[i] < 0) { if (map_fd[i] < 0) {
printf("failed to create a map: %d %s\n", printf("failed to create a map: %d %s\n",
errno, strerror(errno)); errno, strerror(errno));
......
...@@ -44,7 +44,7 @@ static void usage(void) ...@@ -44,7 +44,7 @@ static void usage(void)
static int bpf_map_create(void) static int bpf_map_create(void)
{ {
return bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(uint32_t), return bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(uint32_t),
sizeof(uint32_t), 1024); sizeof(uint32_t), 1024, 0);
} }
static int bpf_prog_create(const char *object) static int bpf_prog_create(const char *object)
......
...@@ -19,13 +19,14 @@ static __u64 ptr_to_u64(void *ptr) ...@@ -19,13 +19,14 @@ static __u64 ptr_to_u64(void *ptr)
} }
int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size, int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
int max_entries) int max_entries, int map_flags)
{ {
union bpf_attr attr = { union bpf_attr attr = {
.map_type = map_type, .map_type = map_type,
.key_size = key_size, .key_size = key_size,
.value_size = value_size, .value_size = value_size,
.max_entries = max_entries .max_entries = max_entries,
.map_flags = map_flags,
}; };
return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr)); return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
struct bpf_insn; struct bpf_insn;
int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size, int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
int max_entries); int max_entries, int map_flags);
int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags); int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags);
int bpf_lookup_elem(int fd, void *key, void *value); int bpf_lookup_elem(int fd, void *key, void *value);
int bpf_delete_elem(int fd, void *key); int bpf_delete_elem(int fd, void *key);
......
...@@ -34,7 +34,7 @@ static int test_sock(void) ...@@ -34,7 +34,7 @@ static int test_sock(void)
long long value = 0, tcp_cnt, udp_cnt, icmp_cnt; long long value = 0, tcp_cnt, udp_cnt, icmp_cnt;
map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value), map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value),
256); 256, 0);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create map '%s'\n", strerror(errno)); printf("failed to create map '%s'\n", strerror(errno));
goto cleanup; goto cleanup;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* Testsuite for eBPF maps * Testsuite for eBPF maps
* *
* Copyright (c) 2014 PLUMgrid, http://plumgrid.com * Copyright (c) 2014 PLUMgrid, http://plumgrid.com
* Copyright (c) 2016 Facebook
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public * modify it under the terms of version 2 of the GNU General Public
...@@ -17,13 +18,16 @@ ...@@ -17,13 +18,16 @@
#include <stdlib.h> #include <stdlib.h>
#include "libbpf.h" #include "libbpf.h"
static int map_flags;
/* sanity tests for map API */ /* sanity tests for map API */
static void test_hashmap_sanity(int i, void *data) static void test_hashmap_sanity(int i, void *data)
{ {
long long key, next_key, value; long long key, next_key, value;
int map_fd; int map_fd;
map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(key), sizeof(value), 2); map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(key), sizeof(value),
2, map_flags);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create hashmap '%s'\n", strerror(errno)); printf("failed to create hashmap '%s'\n", strerror(errno));
exit(1); exit(1);
...@@ -99,7 +103,7 @@ static void test_percpu_hashmap_sanity(int task, void *data) ...@@ -99,7 +103,7 @@ static void test_percpu_hashmap_sanity(int task, void *data)
int map_fd, i; int map_fd, i;
map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_HASH, sizeof(key), map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_HASH, sizeof(key),
sizeof(value[0]), 2); sizeof(value[0]), 2, map_flags);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create hashmap '%s'\n", strerror(errno)); printf("failed to create hashmap '%s'\n", strerror(errno));
exit(1); exit(1);
...@@ -188,7 +192,8 @@ static void test_arraymap_sanity(int i, void *data) ...@@ -188,7 +192,8 @@ static void test_arraymap_sanity(int i, void *data)
int key, next_key, map_fd; int key, next_key, map_fd;
long long value; long long value;
map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value), 2); map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value),
2, 0);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create arraymap '%s'\n", strerror(errno)); printf("failed to create arraymap '%s'\n", strerror(errno));
exit(1); exit(1);
...@@ -244,7 +249,7 @@ static void test_percpu_arraymap_many_keys(void) ...@@ -244,7 +249,7 @@ static void test_percpu_arraymap_many_keys(void)
int key, map_fd, i; int key, map_fd, i;
map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key), map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key),
sizeof(values[0]), nr_keys); sizeof(values[0]), nr_keys, 0);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create per-cpu arraymap '%s'\n", printf("failed to create per-cpu arraymap '%s'\n",
strerror(errno)); strerror(errno));
...@@ -275,7 +280,7 @@ static void test_percpu_arraymap_sanity(int i, void *data) ...@@ -275,7 +280,7 @@ static void test_percpu_arraymap_sanity(int i, void *data)
int key, next_key, map_fd; int key, next_key, map_fd;
map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key), map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key),
sizeof(values[0]), 2); sizeof(values[0]), 2, 0);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create arraymap '%s'\n", strerror(errno)); printf("failed to create arraymap '%s'\n", strerror(errno));
exit(1); exit(1);
...@@ -336,7 +341,7 @@ static void test_map_large(void) ...@@ -336,7 +341,7 @@ static void test_map_large(void)
/* allocate 4Mbyte of memory */ /* allocate 4Mbyte of memory */
map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(key), sizeof(value), map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(key), sizeof(value),
MAP_SIZE); MAP_SIZE, map_flags);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create large map '%s'\n", strerror(errno)); printf("failed to create large map '%s'\n", strerror(errno));
exit(1); exit(1);
...@@ -421,7 +426,7 @@ static void test_map_parallel(void) ...@@ -421,7 +426,7 @@ static void test_map_parallel(void)
int data[2]; int data[2];
map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(key), sizeof(value), map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(key), sizeof(value),
MAP_SIZE); MAP_SIZE, map_flags);
if (map_fd < 0) { if (map_fd < 0) {
printf("failed to create map for parallel test '%s'\n", printf("failed to create map for parallel test '%s'\n",
strerror(errno)); strerror(errno));
......
...@@ -1198,7 +1198,7 @@ static int create_map(void) ...@@ -1198,7 +1198,7 @@ static int create_map(void)
int map_fd; int map_fd;
map_fd = bpf_create_map(BPF_MAP_TYPE_HASH, map_fd = bpf_create_map(BPF_MAP_TYPE_HASH,
sizeof(long long), sizeof(long long), 1024); sizeof(long long), sizeof(long long), 1024, 0);
if (map_fd < 0) if (map_fd < 0)
printf("failed to create map '%s'\n", strerror(errno)); printf("failed to create map '%s'\n", strerror(errno));
...@@ -1210,7 +1210,7 @@ static int create_prog_array(void) ...@@ -1210,7 +1210,7 @@ static int create_prog_array(void)
int map_fd; int map_fd;
map_fd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, map_fd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY,
sizeof(int), sizeof(int), 4); sizeof(int), sizeof(int), 4, 0);
if (map_fd < 0) if (map_fd < 0)
printf("failed to create prog_array '%s'\n", strerror(errno)); printf("failed to create prog_array '%s'\n", strerror(errno));
......
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