|
@@ -11,12 +11,14 @@
|
|
|
#include <linux/filter.h>
|
|
|
#include <linux/sched/signal.h>
|
|
|
|
|
|
-static __always_inline u32 bpf_test_run_one(struct bpf_prog *prog, void *ctx)
|
|
|
+static __always_inline u32 bpf_test_run_one(struct bpf_prog *prog, void *ctx,
|
|
|
+ struct bpf_cgroup_storage *storage)
|
|
|
{
|
|
|
u32 ret;
|
|
|
|
|
|
preempt_disable();
|
|
|
rcu_read_lock();
|
|
|
+ bpf_cgroup_storage_set(storage);
|
|
|
ret = BPF_PROG_RUN(prog, ctx);
|
|
|
rcu_read_unlock();
|
|
|
preempt_enable();
|
|
@@ -26,14 +28,19 @@ static __always_inline u32 bpf_test_run_one(struct bpf_prog *prog, void *ctx)
|
|
|
|
|
|
static u32 bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat, u32 *time)
|
|
|
{
|
|
|
+ struct bpf_cgroup_storage *storage = NULL;
|
|
|
u64 time_start, time_spent = 0;
|
|
|
u32 ret = 0, i;
|
|
|
|
|
|
+ storage = bpf_cgroup_storage_alloc(prog);
|
|
|
+ if (IS_ERR(storage))
|
|
|
+ return PTR_ERR(storage);
|
|
|
+
|
|
|
if (!repeat)
|
|
|
repeat = 1;
|
|
|
time_start = ktime_get_ns();
|
|
|
for (i = 0; i < repeat; i++) {
|
|
|
- ret = bpf_test_run_one(prog, ctx);
|
|
|
+ ret = bpf_test_run_one(prog, ctx, storage);
|
|
|
if (need_resched()) {
|
|
|
if (signal_pending(current))
|
|
|
break;
|
|
@@ -46,6 +53,8 @@ static u32 bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat, u32 *time)
|
|
|
do_div(time_spent, repeat);
|
|
|
*time = time_spent > U32_MAX ? U32_MAX : (u32)time_spent;
|
|
|
|
|
|
+ bpf_cgroup_storage_free(storage);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|