bpf: Add crosstask check to __bpf_get_stack
[platform/kernel/linux-starfive.git] / kernel / bpf / stackmap.c
index 458bb80..36775c4 100644 (file)
@@ -388,6 +388,7 @@ static long __bpf_get_stack(struct pt_regs *regs, struct task_struct *task,
 {
        u32 trace_nr, copy_len, elem_size, num_elem, max_depth;
        bool user_build_id = flags & BPF_F_USER_BUILD_ID;
+       bool crosstask = task && task != current;
        u32 skip = flags & BPF_F_SKIP_FIELD_MASK;
        bool user = flags & BPF_F_USER_STACK;
        struct perf_callchain_entry *trace;
@@ -410,6 +411,14 @@ static long __bpf_get_stack(struct pt_regs *regs, struct task_struct *task,
        if (task && user && !user_mode(regs))
                goto err_fault;
 
+       /* get_perf_callchain does not support crosstask user stack walking
+        * but returns an empty stack instead of NULL.
+        */
+       if (crosstask && user) {
+               err = -EOPNOTSUPP;
+               goto clear;
+       }
+
        num_elem = size / elem_size;
        max_depth = num_elem + skip;
        if (sysctl_perf_event_max_stack < max_depth)
@@ -421,7 +430,7 @@ static long __bpf_get_stack(struct pt_regs *regs, struct task_struct *task,
                trace = get_callchain_entry_for_task(task, max_depth);
        else
                trace = get_perf_callchain(regs, 0, kernel, user, max_depth,
-                                          false, false);
+                                          crosstask, false);
        if (unlikely(!trace))
                goto err_fault;