Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081// SPDX-License-Identifier: GPL-2.0/* Copyright (c) 2021 Facebook */
#include "vmlinux.h"#include <bpf/bpf_helpers.h>#include <bpf/bpf_tracing.h>
#ifndef EBUSY#define EBUSY 16#endif
char _license[] SEC("license") = "GPL";int nr_del_errs = 0;int test_pid = 0;
struct { __uint(type, BPF_MAP_TYPE_TASK_STORAGE); __uint(map_flags, BPF_F_NO_PREALLOC); __type(key, int); __type(value, long);} map_a SEC(".maps");
struct { __uint(type, BPF_MAP_TYPE_TASK_STORAGE); __uint(map_flags, BPF_F_NO_PREALLOC); __type(key, int); __type(value, long);} map_b SEC(".maps");
SEC("fentry/bpf_local_storage_update")int BPF_PROG(on_update){ struct task_struct *task = bpf_get_current_task_btf(); long *ptr;
if (!test_pid || task->pid != test_pid) return 0;
/* This will succeed as there is no real deadlock */ ptr = bpf_task_storage_get(&map_a, task, 0, BPF_LOCAL_STORAGE_GET_F_CREATE); if (ptr) { int err;
*ptr += 1; err = bpf_task_storage_delete(&map_a, task); if (err == -EBUSY) nr_del_errs++; }
/* This will succeed as there is no real deadlock */ ptr = bpf_task_storage_get(&map_b, task, 0, BPF_LOCAL_STORAGE_GET_F_CREATE); if (ptr) *ptr += 1;
return 0;}
SEC("tp_btf/sys_enter")int BPF_PROG(on_enter, struct pt_regs *regs, long id){ struct task_struct *task; long *ptr;
task = bpf_get_current_task_btf(); if (!test_pid || task->pid != test_pid) return 0;
ptr = bpf_task_storage_get(&map_a, task, 0, BPF_LOCAL_STORAGE_GET_F_CREATE); if (ptr && !*ptr) *ptr = 200;
ptr = bpf_task_storage_get(&map_b, task, 0, BPF_LOCAL_STORAGE_GET_F_CREATE); if (ptr && !*ptr) *ptr = 100; return 0;}