-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: wq: add bpf_wq_init() checks
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
Showing
4 changed files
with
97 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |