Skip to content

Commit

Permalink
selftests/bpf: wq: add bpf_wq_init() checks
Browse files Browse the repository at this point in the history
Allows to test if allocation/free works

Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
Link: https://lore.kernel.org/r/20240420-bpf_wq-v2-12-6c986a5a741f@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
  • Loading branch information
Benjamin Tissoires authored and Alexei Starovoitov committed Apr 24, 2024
1 parent eb48f6c commit e3d9eac
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 0 deletions.
1 change: 1 addition & 0 deletions tools/testing/selftests/bpf/bpf_experimental.h
Original file line number Diff line number Diff line change
Expand Up @@ -470,4 +470,5 @@ extern int bpf_iter_css_new(struct bpf_iter_css *it,
extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym;
extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym;

extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym;
#endif
8 changes: 8 additions & 0 deletions tools/testing/selftests/bpf/prog_tests/wq.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@
/* Copyright (c) 2024 Benjamin Tissoires */
#include <test_progs.h>
#include "wq.skel.h"
#include "wq_failures.skel.h"

void serial_test_wq(void)
{
LIBBPF_OPTS(bpf_test_run_opts, topts);

RUN_TESTS(wq);
}

void serial_test_failures_wq(void)
{
LIBBPF_OPTS(bpf_test_run_opts, topts);

RUN_TESTS(wq_failures);
}
10 changes: 10 additions & 0 deletions tools/testing/selftests/bpf/progs/wq.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ struct {
static int test_elem_callback(void *map, int *key)
{
struct elem init = {}, *val;
struct bpf_wq *wq;

if (map == &lru &&
bpf_map_update_elem(map, key, &init, 0))
Expand All @@ -61,12 +62,17 @@ static int test_elem_callback(void *map, int *key)
if (!val)
return -2;

wq = &val->w;
if (bpf_wq_init(wq, map, 0) != 0)
return -3;

return 0;
}

static int test_hmap_elem_callback(void *map, int *key)
{
struct hmap_elem init = {}, *val;
struct bpf_wq *wq;

if (bpf_map_update_elem(map, key, &init, 0))
return -1;
Expand All @@ -75,6 +81,10 @@ static int test_hmap_elem_callback(void *map, int *key)
if (!val)
return -2;

wq = &val->work;
if (bpf_wq_init(wq, map, 0) != 0)
return -3;

return 0;
}

Expand Down
78 changes: 78 additions & 0 deletions tools/testing/selftests/bpf/progs/wq_failures.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2024 Benjamin Tissoires
*/

#include "bpf_experimental.h"
#include <bpf/bpf_helpers.h>
#include "bpf_misc.h"
#include "../bpf_testmod/bpf_testmod_kfunc.h"

char _license[] SEC("license") = "GPL";

struct elem {
struct bpf_wq w;
};

struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, 2);
__type(key, int);
__type(value, struct elem);
} array SEC(".maps");

struct {
__uint(type, BPF_MAP_TYPE_LRU_HASH);
__uint(max_entries, 4);
__type(key, int);
__type(value, struct elem);
} lru SEC(".maps");

SEC("tc")
/* test that bpf_wq_init takes a map as a second argument
*/
__log_level(2)
__flag(BPF_F_TEST_STATE_FREQ)
__failure
__msg(": (85) call bpf_wq_init#") /* anchor message */
__msg("pointer in R2 isn't map pointer")
long test_wq_init_nomap(void *ctx)
{
struct bpf_wq *wq;
struct elem *val;
int key = 0;

val = bpf_map_lookup_elem(&array, &key);
if (!val)
return -1;

wq = &val->w;
if (bpf_wq_init(wq, &key, 0) != 0)
return -3;

return 0;
}

SEC("tc")
/* test that the workqueue is part of the map in bpf_wq_init
*/
__log_level(2)
__flag(BPF_F_TEST_STATE_FREQ)
__failure
__msg(": (85) call bpf_wq_init#") /* anchor message */
__msg("workqueue pointer in R1 map_uid=0 doesn't match map pointer in R2 map_uid=0")
long test_wq_init_wrong_map(void *ctx)
{
struct bpf_wq *wq;
struct elem *val;
int key = 0;

val = bpf_map_lookup_elem(&array, &key);
if (!val)
return -1;

wq = &val->w;
if (bpf_wq_init(wq, &lru, 0) != 0)
return -3;

return 0;
}

0 comments on commit e3d9eac

Please sign in to comment.