Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.9.4.
  1// SPDX-License-Identifier: GPL-2.0
  2#include <vmlinux.h>
  3#include <bpf/bpf_helpers.h>
  4#include <bpf/bpf_tracing.h>
  5#include "bpf_misc.h"
  6#include "bpf_experimental.h"
  7
  8SEC("?tc")
  9__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 10int preempt_lock_missing_1(struct __sk_buff *ctx)
 11{
 12	bpf_preempt_disable();
 13	return 0;
 14}
 15
 16SEC("?tc")
 17__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 18int preempt_lock_missing_2(struct __sk_buff *ctx)
 19{
 20	bpf_preempt_disable();
 21	bpf_preempt_disable();
 22	return 0;
 23}
 24
 25SEC("?tc")
 26__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 27int preempt_lock_missing_3(struct __sk_buff *ctx)
 28{
 29	bpf_preempt_disable();
 30	bpf_preempt_disable();
 31	bpf_preempt_disable();
 32	return 0;
 33}
 34
 35SEC("?tc")
 36__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 37int preempt_lock_missing_3_minus_2(struct __sk_buff *ctx)
 38{
 39	bpf_preempt_disable();
 40	bpf_preempt_disable();
 41	bpf_preempt_disable();
 42	bpf_preempt_enable();
 43	bpf_preempt_enable();
 44	return 0;
 45}
 46
 47static __noinline void preempt_disable(void)
 48{
 49	bpf_preempt_disable();
 50}
 51
 52static __noinline void preempt_enable(void)
 53{
 54	bpf_preempt_enable();
 55}
 56
 57SEC("?tc")
 58__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 59int preempt_lock_missing_1_subprog(struct __sk_buff *ctx)
 60{
 61	preempt_disable();
 62	return 0;
 63}
 64
 65SEC("?tc")
 66__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 67int preempt_lock_missing_2_subprog(struct __sk_buff *ctx)
 68{
 69	preempt_disable();
 70	preempt_disable();
 71	return 0;
 72}
 73
 74SEC("?tc")
 75__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region")
 76int preempt_lock_missing_2_minus_1_subprog(struct __sk_buff *ctx)
 77{
 78	preempt_disable();
 79	preempt_disable();
 80	preempt_enable();
 81	return 0;
 82}
 83
 84static __noinline void preempt_balance_subprog(void)
 85{
 86	preempt_disable();
 87	preempt_enable();
 88}
 89
 90SEC("?tc")
 91__success int preempt_balance(struct __sk_buff *ctx)
 92{
 93	bpf_guard_preempt();
 94	return 0;
 95}
 96
 97SEC("?tc")
 98__success int preempt_balance_subprog_test(struct __sk_buff *ctx)
 99{
100	preempt_balance_subprog();
101	return 0;
102}
103
104SEC("?fentry.s/" SYS_PREFIX "sys_getpgid")
105__failure __msg("sleepable helper bpf_copy_from_user#")
106int preempt_sleepable_helper(void *ctx)
107{
108	u32 data;
109
110	bpf_preempt_disable();
111	bpf_copy_from_user(&data, sizeof(data), NULL);
112	bpf_preempt_enable();
113	return 0;
114}
115
116int __noinline preempt_global_subprog(void)
117{
118	preempt_balance_subprog();
119	return 0;
120}
121
122SEC("?tc")
123__failure __msg("global function calls are not allowed with preemption disabled")
124int preempt_global_subprog_test(struct __sk_buff *ctx)
125{
126	preempt_disable();
127	preempt_global_subprog();
128	preempt_enable();
129	return 0;
130}
131
132char _license[] SEC("license") = "GPL";