SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_1(struct __sk_buff *ctx)
{
bpf_preempt_disable(); return 0;
}
SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_2(struct __sk_buff *ctx)
{
bpf_preempt_disable();
bpf_preempt_disable(); return 0;
}
SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_3(struct __sk_buff *ctx)
{
bpf_preempt_disable();
bpf_preempt_disable();
bpf_preempt_disable(); return 0;
}
SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_3_minus_2(struct __sk_buff *ctx)
{
bpf_preempt_disable();
bpf_preempt_disable();
bpf_preempt_disable();
bpf_preempt_enable();
bpf_preempt_enable(); return 0;
}
SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_1_subprog(struct __sk_buff *ctx)
{
preempt_disable(); return 0;
}
SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_2_subprog(struct __sk_buff *ctx)
{
preempt_disable();
preempt_disable(); return 0;
}
SEC("?tc")
__failure __msg("BPF_EXIT instruction in main prog cannot be used inside bpf_preempt_disable-ed region") int preempt_lock_missing_2_minus_1_subprog(struct __sk_buff *ctx)
{
preempt_disable();
preempt_disable();
preempt_enable(); return 0;
}
int __noinline
global_subprog(int i)
{ if (i)
bpf_printk("%p", &i); return i;
}
int __noinline
global_sleepable_helper_subprog(int i)
{ if (i)
bpf_copy_from_user(&i, sizeof(i), NULL); return i;
}
int __noinline
global_sleepable_kfunc_subprog(int i)
{ if (i)
bpf_copy_from_user_str(&i, sizeof(i), NULL, 0);
global_subprog(i); return i;
}
int __noinline
global_subprog_calling_sleepable_global(int i)
{ if (!i)
global_sleepable_kfunc_subprog(i); return i;
}
SEC("?syscall")
__failure __msg("global functions that may sleep are not allowed in non-sleepable context") int preempt_global_sleepable_helper_subprog(struct __sk_buff *ctx)
{
preempt_disable(); if (ctx->mark)
global_sleepable_helper_subprog(ctx->mark);
preempt_enable(); return 0;
}
SEC("?syscall")
__failure __msg("global functions that may sleep are not allowed in non-sleepable context") int preempt_global_sleepable_kfunc_subprog(struct __sk_buff *ctx)
{
preempt_disable(); if (ctx->mark)
global_sleepable_kfunc_subprog(ctx->mark);
preempt_enable(); return 0;
}
SEC("?syscall")
__failure __msg("global functions that may sleep are not allowed in non-sleepable context") int preempt_global_sleepable_subprog_indirect(struct __sk_buff *ctx)
{
preempt_disable(); if (ctx->mark)
global_subprog_calling_sleepable_global(ctx->mark);
preempt_enable(); return 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.