History

bpf: Enable task local storage for tracing programs

To access per-task data, BPF programs usually creates a hash table with pid as the key. This is not ideal because: 1. The user need to estimate the proper size of the hash table, which may be inaccurate; 2. Big hash tables are slow; 3. To clean up the data properly during task terminations, the user need to write extra logic. Task local storage overcomes these issues and offers a better option for these per-task data. Task local storage is only available to BPF_LSM. Now enable it for tracing programs. Unlike LSM programs, tracing programs can be called in IRQ contexts. Helpers that access task local storage are updated to use raw_spin_lock_irqsave() instead of raw_spin_lock_bh(). Tracing programs can attach to functions on the task free path, e.g. exit_creds(). To avoid allocating task local storage after bpf_task_storage_free(). bpf_task_storage_get() is updated to not allocate new storage when the task is not refcounted (task->usage == 0).

Song Liu committed 5 years ago

Commit a10787e1 parent 9c8f21e10 files · +51 −72Browse files

Showing the changes to kernel/fork.c (1 of 10 files). Show all

Unified · Split

kernel/fork.c+5−0
@@ -96,6 +96,7 @@ · 95 unmodified lines
9696 #include <linux/kasan.h>
9797 #include <linux/scs.h>
9898 #include <linux/io_uring.h>
99+#include <linux/bpf.h>
99100
100101 #include <asm/pgalloc.h>
101102 #include <linux/uaccess.h>
@@ -734,6 +735,7 @@ void __put_task_struct(struct task_struct *tsk) · 632 unmodified lines
734735 cgroup_free(tsk);
735736 task_numa_free(tsk, true);
736737 security_task_free(tsk);
738+ bpf_task_storage_free(tsk);
737739 exit_creds(tsk);
738740 delayacct_tsk_free(tsk);
739741 put_signal_struct(tsk->signal);
@@ -2062,6 +2064,9 @@ static __latent_entropy struct task_struct *copy_process( · 1322 unmodified lines
20622064 p->sequential_io = 0;
20632065 p->sequential_io_avg = 0;
20642066 #endif
2067+#ifdef CONFIG_BPF_SYSCALL
2068+ RCU_INIT_POINTER(p->bpf_storage, NULL);
2069+#endif
20652070
20662071 /* Perform scheduler related setup. Assign this task to a CPU. */
20672072 retval = sched_fork(clone_flags, p);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t