]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
signal: Factor force_sig_perf out of perf_sigtrap
authorEric W. Biederman <ebiederm@xmission.com>
Sun, 2 May 2021 19:27:24 +0000 (14:27 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 5 May 2021 17:49:08 +0000 (12:49 -0500)
Separate generating the signal from deciding it needs to be sent.

v1: https://lkml.kernel.org/r/m17dkjqqxz.fsf_-_@fess.ebiederm.org
Link: https://lkml.kernel.org/r/20210505141101.11519-10-ebiederm@xmission.com
Reviewed-by: Marco Elver <elver@google.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
include/linux/sched/signal.h
kernel/events/core.c
kernel/signal.c

index 7daa425f30556393160e8fbf46a790cd27db5a07..1e2f61a1a5129379ceff02a598f6b00c6a69aa88 100644 (file)
@@ -318,6 +318,7 @@ int send_sig_mceerr(int code, void __user *, short, struct task_struct *);
 
 int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper);
 int force_sig_pkuerr(void __user *addr, u32 pkey);
+int force_sig_perf(void __user *addr, u32 type, u64 sig_data);
 
 int force_sig_fault_trapno(int sig, int code, void __user *addr, int trapno);
 int send_sig_fault_trapno(int sig, int code, void __user *addr, int trapno,
index 928b166d888e3e017c98533b702e8150e1f57324..48ea8863183bf66f64b77ae2bfbcbc76814f5bac 100644 (file)
@@ -6394,8 +6394,6 @@ void perf_event_wakeup(struct perf_event *event)
 
 static void perf_sigtrap(struct perf_event *event)
 {
-       struct kernel_siginfo info;
-
        /*
         * We'd expect this to only occur if the irq_work is delayed and either
         * ctx->task or current has changed in the meantime. This can be the
@@ -6410,13 +6408,8 @@ static void perf_sigtrap(struct perf_event *event)
        if (current->flags & PF_EXITING)
                return;
 
-       clear_siginfo(&info);
-       info.si_signo = SIGTRAP;
-       info.si_code = TRAP_PERF;
-       info.si_errno = event->attr.type;
-       info.si_perf = event->attr.sig_data;
-       info.si_addr = (void __user *)event->pending_addr;
-       force_sig_info(&info);
+       force_sig_perf((void __user *)event->pending_addr,
+                      event->attr.type, event->attr.sig_data);
 }
 
 static void perf_pending_event_disable(struct perf_event *event)
index 697c5fe58db86b154da204374c4bf30cda9ec3f0..49560ceac0488d79f3a20e3e32dadff88574d17b 100644 (file)
@@ -1753,6 +1753,19 @@ int force_sig_pkuerr(void __user *addr, u32 pkey)
 }
 #endif
 
+int force_sig_perf(void __user *addr, u32 type, u64 sig_data)
+{
+       struct kernel_siginfo info;
+
+       clear_siginfo(&info);
+       info.si_signo = SIGTRAP;
+       info.si_errno = type;
+       info.si_code  = TRAP_PERF;
+       info.si_addr  = addr;
+       info.si_perf  = sig_data;
+       return force_sig_info(&info);
+}
+
 #if IS_ENABLED(CONFIG_SPARC)
 int force_sig_fault_trapno(int sig, int code, void __user *addr, int trapno)
 {