Skip to content

Commit

Permalink
bpf: lru: Refactor LRU map tests in map_perf_test
Browse files Browse the repository at this point in the history
One more LRU test will be added later in this patch series.
In this patch, we first move all existing LRU map tests into
a single syscall (connect) first so that the future new
LRU test can be added without hunting another syscall.

One of the map name is also changed from percpu_lru_hash_map
to nocommon_lru_hash_map to avoid the confusion with percpu_hash_map.

Signed-off-by: Martin KaFai Lau <[email protected]>
Acked-by: Alexei Starovoitov <[email protected]>
Acked-by: Daniel Borkmann <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
iamkafai authored and davem330 committed Apr 17, 2017
1 parent 6467acb commit bf8db5d
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 29 deletions.
43 changes: 31 additions & 12 deletions samples/bpf/map_perf_test_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct bpf_map_def SEC("maps") lru_hash_map = {
.max_entries = 10000,
};

struct bpf_map_def SEC("maps") percpu_lru_hash_map = {
struct bpf_map_def SEC("maps") nocommon_lru_hash_map = {
.type = BPF_MAP_TYPE_LRU_HASH,
.key_size = sizeof(u32),
.value_size = sizeof(long),
Expand Down Expand Up @@ -100,6 +100,7 @@ int stress_percpu_hmap(struct pt_regs *ctx)
bpf_map_delete_elem(&percpu_hash_map, &key);
return 0;
}

SEC("kprobe/sys_getgid")
int stress_hmap_alloc(struct pt_regs *ctx)
{
Expand Down Expand Up @@ -128,24 +129,42 @@ int stress_percpu_hmap_alloc(struct pt_regs *ctx)
return 0;
}

SEC("kprobe/sys_getpid")
SEC("kprobe/sys_connect")
int stress_lru_hmap_alloc(struct pt_regs *ctx)
{
u32 key = bpf_get_prandom_u32();
struct sockaddr_in6 *in6;
u16 test_case, dst6[8];
int addrlen, ret;
char fmt[] = "Failed at stress_lru_hmap_alloc. ret:%d\n";
long val = 1;
u32 key = bpf_get_prandom_u32();

bpf_map_update_elem(&lru_hash_map, &key, &val, BPF_ANY);
in6 = (struct sockaddr_in6 *)PT_REGS_PARM2(ctx);
addrlen = (int)PT_REGS_PARM3(ctx);

return 0;
}
if (addrlen != sizeof(*in6))
return 0;

SEC("kprobe/sys_getppid")
int stress_percpu_lru_hmap_alloc(struct pt_regs *ctx)
{
u32 key = bpf_get_prandom_u32();
long val = 1;
ret = bpf_probe_read(dst6, sizeof(dst6), &in6->sin6_addr);
if (ret)
goto done;

if (dst6[0] != 0xdead || dst6[1] != 0xbeef)
return 0;

test_case = dst6[7];

if (test_case == 0)
ret = bpf_map_update_elem(&lru_hash_map, &key, &val, BPF_ANY);
else if (test_case == 1)
ret = bpf_map_update_elem(&nocommon_lru_hash_map, &key, &val,
BPF_ANY);
else
ret = -EINVAL;

bpf_map_update_elem(&percpu_lru_hash_map, &key, &val, BPF_ANY);
done:
if (ret)
bpf_trace_printk(fmt, sizeof(fmt), ret);

return 0;
}
Expand Down
53 changes: 36 additions & 17 deletions samples/bpf/map_perf_test_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
#include <string.h>
#include <time.h>
#include <sys/resource.h>
#include <arpa/inet.h>
#include <errno.h>

#include "libbpf.h"
#include "bpf_load.h"

Expand All @@ -36,7 +39,7 @@ static __u64 time_get_ns(void)
#define HASH_KMALLOC (1 << 2)
#define PERCPU_HASH_KMALLOC (1 << 3)
#define LRU_HASH_PREALLOC (1 << 4)
#define PERCPU_LRU_HASH_PREALLOC (1 << 5)
#define NOCOMMON_LRU_HASH_PREALLOC (1 << 5)
#define LPM_KMALLOC (1 << 6)
#define HASH_LOOKUP (1 << 7)
#define ARRAY_LOOKUP (1 << 8)
Expand All @@ -55,28 +58,44 @@ static void test_hash_prealloc(int cpu)
cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
}

static void test_lru_hash_prealloc(int cpu)
static void do_test_lru(int lru_test_flag, int cpu)
{
struct sockaddr_in6 in6 = { .sin6_family = AF_INET6 };
const char *test_name;
__u64 start_time;
int i;
int i, ret;

in6.sin6_addr.s6_addr16[0] = 0xdead;
in6.sin6_addr.s6_addr16[1] = 0xbeef;

if (lru_test_flag & LRU_HASH_PREALLOC) {
test_name = "lru_hash_map_perf";
in6.sin6_addr.s6_addr16[7] = 0;
} else if (lru_test_flag & NOCOMMON_LRU_HASH_PREALLOC) {
test_name = "nocommon_lru_hash_map_perf";
in6.sin6_addr.s6_addr16[7] = 1;
} else {
assert(0);
}

start_time = time_get_ns();
for (i = 0; i < MAX_CNT; i++)
syscall(__NR_getpid);
printf("%d:lru_hash_map_perf pre-alloc %lld events per sec\n",
cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
for (i = 0; i < MAX_CNT; i++) {
ret = connect(-1, (const struct sockaddr *)&in6, sizeof(in6));
assert(ret == -1 && errno == EBADF);
}
printf("%d:%s pre-alloc %lld events per sec\n",
cpu, test_name,
MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
}

static void test_percpu_lru_hash_prealloc(int cpu)
static void test_lru_hash_prealloc(int cpu)
{
__u64 start_time;
int i;
do_test_lru(LRU_HASH_PREALLOC, cpu);
}

start_time = time_get_ns();
for (i = 0; i < MAX_CNT; i++)
syscall(__NR_getppid);
printf("%d:lru_hash_map_perf pre-alloc %lld events per sec\n",
cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
static void test_nocommon_lru_hash_prealloc(int cpu)
{
do_test_lru(NOCOMMON_LRU_HASH_PREALLOC, cpu);
}

static void test_percpu_hash_prealloc(int cpu)
Expand Down Expand Up @@ -174,8 +193,8 @@ static void loop(int cpu)
if (test_flags & LRU_HASH_PREALLOC)
test_lru_hash_prealloc(cpu);

if (test_flags & PERCPU_LRU_HASH_PREALLOC)
test_percpu_lru_hash_prealloc(cpu);
if (test_flags & NOCOMMON_LRU_HASH_PREALLOC)
test_nocommon_lru_hash_prealloc(cpu);

if (test_flags & LPM_KMALLOC)
test_lpm_kmalloc(cpu);
Expand Down

0 comments on commit bf8db5d

Please sign in to comment.