brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · 672fc36 Raw
133 lines · c
1// SPDX-License-Identifier: GPL-2.02#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("1 bpf_preempt_enable is missing")10int preempt_lock_missing_1(struct __sk_buff *ctx)11{12	bpf_preempt_disable();13	return 0;14}15 16SEC("?tc")17__failure __msg("2 bpf_preempt_enable(s) are missing")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("3 bpf_preempt_enable(s) are missing")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("1 bpf_preempt_enable is missing")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("1 bpf_preempt_enable is missing")59int preempt_lock_missing_1_subprog(struct __sk_buff *ctx)60{61	preempt_disable();62	return 0;63}64 65SEC("?tc")66__failure __msg("2 bpf_preempt_enable(s) are missing")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("1 bpf_preempt_enable is missing")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";133