Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull second pile of signal handling patches from Al Viro:
"This one is just task_work_add() series + remaining prereqs for it.
There probably will be another pull request from that tree this
cycle - at least for helpers, to get them out of the way for per-arch
fixes remaining in the tree."
Fix trivial conflict in kernel/irq/manage.c: the merge of Andrew's pile
had brought in commit 97fd75b7b8 ("kernel/irq/manage.c: use the
pr_foo() infrastructure to prefix printks") which changed one of the
pr_err() calls that this merge moves around.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal:
keys: kill task_struct->replacement_session_keyring
keys: kill the dummy key_replace_session_keyring()
keys: change keyctl_session_to_parent() to use task_work_add()
genirq: reimplement exit_irq_thread() hook via task_work_add()
task_work_add: generic process-context callbacks
avr32: missed _TIF_NOTIFY_RESUME on one of do_notify_resume callers
parisc: need to check NOTIFY_RESUME when exiting from syscall
move key_repace_session_keyring() into tracehook_notify_resume()
TIF_NOTIFY_RESUME is defined on all targets now
This commit is contained in:
@@ -142,8 +142,6 @@ request_any_context_irq(unsigned int irq, irq_handler_t handler,
|
||||
extern int __must_check
|
||||
request_percpu_irq(unsigned int irq, irq_handler_t handler,
|
||||
const char *devname, void __percpu *percpu_dev_id);
|
||||
|
||||
extern void exit_irq_thread(void);
|
||||
#else
|
||||
|
||||
extern int __must_check
|
||||
@@ -177,8 +175,6 @@ request_percpu_irq(unsigned int irq, irq_handler_t handler,
|
||||
{
|
||||
return request_irq(irq, handler, 0, devname, percpu_dev_id);
|
||||
}
|
||||
|
||||
static inline void exit_irq_thread(void) { }
|
||||
#endif
|
||||
|
||||
extern void free_irq(unsigned int, void *);
|
||||
|
||||
@@ -308,9 +308,6 @@ static inline bool key_is_instantiated(const struct key *key)
|
||||
#ifdef CONFIG_SYSCTL
|
||||
extern ctl_table key_sysctls[];
|
||||
#endif
|
||||
|
||||
extern void key_replace_session_keyring(void);
|
||||
|
||||
/*
|
||||
* the userspace interface
|
||||
*/
|
||||
@@ -334,7 +331,6 @@ extern void key_init(void);
|
||||
#define key_fsuid_changed(t) do { } while(0)
|
||||
#define key_fsgid_changed(t) do { } while(0)
|
||||
#define key_init() do { } while(0)
|
||||
#define key_replace_session_keyring() do { } while(0)
|
||||
|
||||
#endif /* CONFIG_KEYS */
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
@@ -1301,11 +1301,6 @@ struct task_struct {
|
||||
unsigned sched_reset_on_fork:1;
|
||||
unsigned sched_contributes_to_load:1;
|
||||
|
||||
#ifdef CONFIG_GENERIC_HARDIRQS
|
||||
/* IRQ handler threads */
|
||||
unsigned irq_thread:1;
|
||||
#endif
|
||||
|
||||
pid_t pid;
|
||||
pid_t tgid;
|
||||
|
||||
@@ -1313,10 +1308,9 @@ struct task_struct {
|
||||
/* Canary value for the -fstack-protector gcc feature */
|
||||
unsigned long stack_canary;
|
||||
#endif
|
||||
|
||||
/*
|
||||
/*
|
||||
* pointers to (original) parent process, youngest child, younger sibling,
|
||||
* older sibling, respectively. (p->father can be replaced with
|
||||
* older sibling, respectively. (p->father can be replaced with
|
||||
* p->real_parent->pid)
|
||||
*/
|
||||
struct task_struct __rcu *real_parent; /* real parent process */
|
||||
@@ -1363,8 +1357,6 @@ struct task_struct {
|
||||
* credentials (COW) */
|
||||
const struct cred __rcu *cred; /* effective (overridable) subjective task
|
||||
* credentials (COW) */
|
||||
struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */
|
||||
|
||||
char comm[TASK_COMM_LEN]; /* executable name excluding path
|
||||
- access with [gs]et_task_comm (which lock
|
||||
it with task_lock())
|
||||
@@ -1400,6 +1392,8 @@ struct task_struct {
|
||||
int (*notifier)(void *priv);
|
||||
void *notifier_data;
|
||||
sigset_t *notifier_mask;
|
||||
struct hlist_head task_works;
|
||||
|
||||
struct audit_context *audit_context;
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
uid_t loginuid;
|
||||
|
||||
33
include/linux/task_work.h
Normal file
33
include/linux/task_work.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef _LINUX_TASK_WORK_H
|
||||
#define _LINUX_TASK_WORK_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
struct task_work;
|
||||
typedef void (*task_work_func_t)(struct task_work *);
|
||||
|
||||
struct task_work {
|
||||
struct hlist_node hlist;
|
||||
task_work_func_t func;
|
||||
void *data;
|
||||
};
|
||||
|
||||
static inline void
|
||||
init_task_work(struct task_work *twork, task_work_func_t func, void *data)
|
||||
{
|
||||
twork->func = func;
|
||||
twork->data = data;
|
||||
}
|
||||
|
||||
int task_work_add(struct task_struct *task, struct task_work *twork, bool);
|
||||
struct task_work *task_work_cancel(struct task_struct *, task_work_func_t);
|
||||
void task_work_run(void);
|
||||
|
||||
static inline void exit_task_work(struct task_struct *task)
|
||||
{
|
||||
if (unlikely(!hlist_empty(&task->task_works)))
|
||||
task_work_run();
|
||||
}
|
||||
|
||||
#endif /* _LINUX_TASK_WORK_H */
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/task_work.h>
|
||||
struct linux_binprm;
|
||||
|
||||
/*
|
||||
@@ -153,7 +154,6 @@ static inline void tracehook_signal_handler(int sig, siginfo_t *info,
|
||||
ptrace_notify(SIGTRAP);
|
||||
}
|
||||
|
||||
#ifdef TIF_NOTIFY_RESUME
|
||||
/**
|
||||
* set_notify_resume - cause tracehook_notify_resume() to be called
|
||||
* @task: task that will call tracehook_notify_resume()
|
||||
@@ -165,8 +165,10 @@ static inline void tracehook_signal_handler(int sig, siginfo_t *info,
|
||||
*/
|
||||
static inline void set_notify_resume(struct task_struct *task)
|
||||
{
|
||||
#ifdef TIF_NOTIFY_RESUME
|
||||
if (!test_and_set_tsk_thread_flag(task, TIF_NOTIFY_RESUME))
|
||||
kick_process(task);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -184,7 +186,14 @@ static inline void set_notify_resume(struct task_struct *task)
|
||||
*/
|
||||
static inline void tracehook_notify_resume(struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* The caller just cleared TIF_NOTIFY_RESUME. This barrier
|
||||
* pairs with task_work_add()->set_notify_resume() after
|
||||
* hlist_add_head(task->task_works);
|
||||
*/
|
||||
smp_mb__after_clear_bit();
|
||||
if (unlikely(!hlist_empty(¤t->task_works)))
|
||||
task_work_run();
|
||||
}
|
||||
#endif /* TIF_NOTIFY_RESUME */
|
||||
|
||||
#endif /* <linux/tracehook.h> */
|
||||
|
||||
Reference in New Issue
Block a user