diff options
Diffstat (limited to 'samples/bpf/map_perf_test_user.c')
| -rw-r--r-- | samples/bpf/map_perf_test_user.c | 164 | 
1 files changed, 105 insertions, 59 deletions
diff --git a/samples/bpf/map_perf_test_user.c b/samples/bpf/map_perf_test_user.c index fe5564bff39b..8b13230b4c46 100644 --- a/samples/bpf/map_perf_test_user.c +++ b/samples/bpf/map_perf_test_user.c @@ -11,7 +11,6 @@  #include <sys/wait.h>  #include <stdlib.h>  #include <signal.h> -#include <linux/bpf.h>  #include <string.h>  #include <time.h>  #include <sys/resource.h> @@ -19,7 +18,7 @@  #include <errno.h>  #include <bpf/bpf.h> -#include "bpf_load.h" +#include <bpf/libbpf.h>  #define TEST_BIT(t) (1U << (t))  #define MAX_NR_CPUS 1024 @@ -61,12 +60,18 @@ const char *test_map_names[NR_TESTS] = {  	[LRU_HASH_LOOKUP] = "lru_hash_lookup_map",  }; +enum map_idx { +	array_of_lru_hashs_idx, +	hash_map_alloc_idx, +	lru_hash_lookup_idx, +	NR_IDXES, +}; + +static int map_fd[NR_IDXES]; +  static int test_flags = ~0;  static uint32_t num_map_entries;  static uint32_t inner_lru_hash_size; -static int inner_lru_hash_idx = -1; -static int array_of_lru_hashs_idx = -1; -static int lru_hash_lookup_idx = -1;  static int lru_hash_lookup_test_entries = 32;  static uint32_t max_cnt = 1000000; @@ -122,30 +127,30 @@ static void do_test_lru(enum test_type test, int cpu)  	__u64 start_time;  	int i, ret; -	if (test == INNER_LRU_HASH_PREALLOC) { +	if (test == INNER_LRU_HASH_PREALLOC && cpu) { +		/* If CPU is not 0, create inner_lru hash map and insert the fd +		 * value into the array_of_lru_hash map. In case of CPU 0, +		 * 'inner_lru_hash_map' was statically inserted on the map init +		 */  		int outer_fd = map_fd[array_of_lru_hashs_idx];  		unsigned int mycpu, mynode;  		assert(cpu < MAX_NR_CPUS); -		if (cpu) { -			ret = syscall(__NR_getcpu, &mycpu, &mynode, NULL); -			assert(!ret); - -			inner_lru_map_fds[cpu] = -				bpf_create_map_node(BPF_MAP_TYPE_LRU_HASH, -						    test_map_names[INNER_LRU_HASH_PREALLOC], -						    sizeof(uint32_t), -						    sizeof(long), -						    inner_lru_hash_size, 0, -						    mynode); -			if (inner_lru_map_fds[cpu] == -1) { -				printf("cannot create BPF_MAP_TYPE_LRU_HASH %s(%d)\n", -				       strerror(errno), errno); -				exit(1); -			} -		} else { -			inner_lru_map_fds[cpu] = map_fd[inner_lru_hash_idx]; +		ret = syscall(__NR_getcpu, &mycpu, &mynode, NULL); +		assert(!ret); + +		inner_lru_map_fds[cpu] = +			bpf_create_map_node(BPF_MAP_TYPE_LRU_HASH, +					    test_map_names[INNER_LRU_HASH_PREALLOC], +					    sizeof(uint32_t), +					    sizeof(long), +					    inner_lru_hash_size, 0, +					    mynode); +		if (inner_lru_map_fds[cpu] == -1) { +			printf("cannot create BPF_MAP_TYPE_LRU_HASH %s(%d)\n", +			       strerror(errno), errno); +			exit(1);  		}  		ret = bpf_map_update_elem(outer_fd, &cpu, @@ -377,7 +382,8 @@ static void fill_lpm_trie(void)  		key->data[1] = rand() & 0xff;  		key->data[2] = rand() & 0xff;  		key->data[3] = rand() & 0xff; -		r = bpf_map_update_elem(map_fd[6], key, &value, 0); +		r = bpf_map_update_elem(map_fd[hash_map_alloc_idx], +					key, &value, 0);  		assert(!r);  	} @@ -388,59 +394,52 @@ static void fill_lpm_trie(void)  	key->data[3] = 1;  	value = 128; -	r = bpf_map_update_elem(map_fd[6], key, &value, 0); +	r = bpf_map_update_elem(map_fd[hash_map_alloc_idx], key, &value, 0);  	assert(!r);  } -static void fixup_map(struct bpf_map_data *map, int idx) +static void fixup_map(struct bpf_object *obj)  { +	struct bpf_map *map;  	int i; -	if (!strcmp("inner_lru_hash_map", map->name)) { -		inner_lru_hash_idx = idx; -		inner_lru_hash_size = map->def.max_entries; -	} +	bpf_object__for_each_map(map, obj) { +		const char *name = bpf_map__name(map); -	if (!strcmp("array_of_lru_hashs", map->name)) { -		if (inner_lru_hash_idx == -1) { -			printf("inner_lru_hash_map must be defined before array_of_lru_hashs\n"); -			exit(1); +		/* Only change the max_entries for the enabled test(s) */ +		for (i = 0; i < NR_TESTS; i++) { +			if (!strcmp(test_map_names[i], name) && +			    (check_test_flags(i))) { +				bpf_map__resize(map, num_map_entries); +				continue; +			}  		} -		map->def.inner_map_idx = inner_lru_hash_idx; -		array_of_lru_hashs_idx = idx;  	} -	if (!strcmp("lru_hash_lookup_map", map->name)) -		lru_hash_lookup_idx = idx; - -	if (num_map_entries <= 0) -		return; -  	inner_lru_hash_size = num_map_entries; - -	/* Only change the max_entries for the enabled test(s) */ -	for (i = 0; i < NR_TESTS; i++) { -		if (!strcmp(test_map_names[i], map->name) && -		    (check_test_flags(i))) { -			map->def.max_entries = num_map_entries; -		} -	}  }  int main(int argc, char **argv)  {  	struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; +	int nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); +	struct bpf_link *links[8]; +	struct bpf_program *prog; +	struct bpf_object *obj; +	struct bpf_map *map;  	char filename[256]; -	int num_cpu = 8; +	int i = 0; -	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); -	setrlimit(RLIMIT_MEMLOCK, &r); +	if (setrlimit(RLIMIT_MEMLOCK, &r)) { +		perror("setrlimit(RLIMIT_MEMLOCK)"); +		return 1; +	}  	if (argc > 1)  		test_flags = atoi(argv[1]) ? : test_flags;  	if (argc > 2) -		num_cpu = atoi(argv[2]) ? : num_cpu; +		nr_cpus = atoi(argv[2]) ? : nr_cpus;  	if (argc > 3)  		num_map_entries = atoi(argv[3]); @@ -448,14 +447,61 @@ int main(int argc, char **argv)  	if (argc > 4)  		max_cnt = atoi(argv[4]); -	if (load_bpf_file_fixup_map(filename, fixup_map)) { -		printf("%s", bpf_log_buf); -		return 1; +	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); +	obj = bpf_object__open_file(filename, NULL); +	if (libbpf_get_error(obj)) { +		fprintf(stderr, "ERROR: opening BPF object file failed\n"); +		return 0; +	} + +	map = bpf_object__find_map_by_name(obj, "inner_lru_hash_map"); +	if (libbpf_get_error(map)) { +		fprintf(stderr, "ERROR: finding a map in obj file failed\n"); +		goto cleanup; +	} + +	inner_lru_hash_size = bpf_map__max_entries(map); +	if (!inner_lru_hash_size) { +		fprintf(stderr, "ERROR: failed to get map attribute\n"); +		goto cleanup; +	} + +	/* resize BPF map prior to loading */ +	if (num_map_entries > 0) +		fixup_map(obj); + +	/* load BPF program */ +	if (bpf_object__load(obj)) { +		fprintf(stderr, "ERROR: loading BPF object file failed\n"); +		goto cleanup; +	} + +	map_fd[0] = bpf_object__find_map_fd_by_name(obj, "array_of_lru_hashs"); +	map_fd[1] = bpf_object__find_map_fd_by_name(obj, "hash_map_alloc"); +	map_fd[2] = bpf_object__find_map_fd_by_name(obj, "lru_hash_lookup_map"); +	if (map_fd[0] < 0 || map_fd[1] < 0 || map_fd[2] < 0) { +		fprintf(stderr, "ERROR: finding a map in obj file failed\n"); +		goto cleanup; +	} + +	bpf_object__for_each_program(prog, obj) { +		links[i] = bpf_program__attach(prog); +		if (libbpf_get_error(links[i])) { +			fprintf(stderr, "ERROR: bpf_program__attach failed\n"); +			links[i] = NULL; +			goto cleanup; +		} +		i++;  	}  	fill_lpm_trie(); -	run_perf_test(num_cpu); +	run_perf_test(nr_cpus); + +cleanup: +	for (i--; i >= 0; i--) +		bpf_link__destroy(links[i]); +	bpf_object__close(obj);  	return 0;  }  |