|
@@ -3,10 +3,10 @@
|
|
|
|
|
|
#include <linux/rculist.h>
|
|
|
#include <linux/signal.h>
|
|
|
-#include <linux/cred.h>
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/sched/jobctl.h>
|
|
|
#include <linux/sched/task.h>
|
|
|
+#include <linux/cred.h>
|
|
|
|
|
|
/*
|
|
|
* Types defining task->signal and task->sighand and APIs using them:
|
|
@@ -271,6 +271,57 @@ extern void sigqueue_free(struct sigqueue *);
|
|
|
extern int send_sigqueue(struct sigqueue *, struct task_struct *, int group);
|
|
|
extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *);
|
|
|
|
|
|
+static inline int restart_syscall(void)
|
|
|
+{
|
|
|
+ set_tsk_thread_flag(current, TIF_SIGPENDING);
|
|
|
+ return -ERESTARTNOINTR;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int signal_pending(struct task_struct *p)
|
|
|
+{
|
|
|
+ return unlikely(test_tsk_thread_flag(p,TIF_SIGPENDING));
|
|
|
+}
|
|
|
+
|
|
|
+static inline int __fatal_signal_pending(struct task_struct *p)
|
|
|
+{
|
|
|
+ return unlikely(sigismember(&p->pending.signal, SIGKILL));
|
|
|
+}
|
|
|
+
|
|
|
+static inline int fatal_signal_pending(struct task_struct *p)
|
|
|
+{
|
|
|
+ return signal_pending(p) && __fatal_signal_pending(p);
|
|
|
+}
|
|
|
+
|
|
|
+static inline int signal_pending_state(long state, struct task_struct *p)
|
|
|
+{
|
|
|
+ if (!(state & (TASK_INTERRUPTIBLE | TASK_WAKEKILL)))
|
|
|
+ return 0;
|
|
|
+ if (!signal_pending(p))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return (state & TASK_INTERRUPTIBLE) || __fatal_signal_pending(p);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Reevaluate whether the task has signals pending delivery.
|
|
|
+ * Wake the task if so.
|
|
|
+ * This is required every time the blocked sigset_t changes.
|
|
|
+ * callers must hold sighand->siglock.
|
|
|
+ */
|
|
|
+extern void recalc_sigpending_and_wake(struct task_struct *t);
|
|
|
+extern void recalc_sigpending(void);
|
|
|
+
|
|
|
+extern void signal_wake_up_state(struct task_struct *t, unsigned int state);
|
|
|
+
|
|
|
+static inline void signal_wake_up(struct task_struct *t, bool resume)
|
|
|
+{
|
|
|
+ signal_wake_up_state(t, resume ? TASK_WAKEKILL : 0);
|
|
|
+}
|
|
|
+static inline void ptrace_signal_wake_up(struct task_struct *t, bool resume)
|
|
|
+{
|
|
|
+ signal_wake_up_state(t, resume ? __TASK_TRACED : 0);
|
|
|
+}
|
|
|
+
|
|
|
#ifdef TIF_RESTORE_SIGMASK
|
|
|
/*
|
|
|
* Legacy restore_sigmask accessors. These are inefficient on
|