797245f5da
This avoids races in the VFP code where the dead thread may have state on another CPU. By moving this code to exit_thread(), we will be running as the thread, and therefore be running on the current CPU. This means that we can ensure that the only local state is accessed in the thread notifiers. Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
48 lines
1.2 KiB
C
48 lines
1.2 KiB
C
/*
|
|
* arch/arm/include/asm/thread_notify.h
|
|
*
|
|
* Copyright (C) 2006 Russell King.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#ifndef ASMARM_THREAD_NOTIFY_H
|
|
#define ASMARM_THREAD_NOTIFY_H
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <linux/notifier.h>
|
|
#include <asm/thread_info.h>
|
|
|
|
static inline int thread_register_notifier(struct notifier_block *n)
|
|
{
|
|
extern struct atomic_notifier_head thread_notify_head;
|
|
return atomic_notifier_chain_register(&thread_notify_head, n);
|
|
}
|
|
|
|
static inline void thread_unregister_notifier(struct notifier_block *n)
|
|
{
|
|
extern struct atomic_notifier_head thread_notify_head;
|
|
atomic_notifier_chain_unregister(&thread_notify_head, n);
|
|
}
|
|
|
|
static inline void thread_notify(unsigned long rc, struct thread_info *thread)
|
|
{
|
|
extern struct atomic_notifier_head thread_notify_head;
|
|
atomic_notifier_call_chain(&thread_notify_head, rc, thread);
|
|
}
|
|
|
|
#endif
|
|
|
|
/*
|
|
* These are the reason codes for the thread notifier.
|
|
*/
|
|
#define THREAD_NOTIFY_FLUSH 0
|
|
#define THREAD_NOTIFY_EXIT 1
|
|
#define THREAD_NOTIFY_SWITCH 2
|
|
|
|
#endif
|
|
#endif
|