mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-28 01:21:58 +00:00
Merge remote branch 'tip/x86/entry' into kvm-updates/2.6.33
Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
commit
58988b07cf
9 changed files with 119 additions and 2 deletions
|
@ -96,6 +96,7 @@ obj-$(CONFIG_SMP) += sched_cpupri.o
|
|||
obj-$(CONFIG_SLOW_WORK) += slow-work.o
|
||||
obj-$(CONFIG_SLOW_WORK_DEBUG) += slow-work-debugfs.o
|
||||
obj-$(CONFIG_PERF_EVENTS) += perf_event.o
|
||||
obj-$(CONFIG_USER_RETURN_NOTIFIER) += user-return-notifier.o
|
||||
|
||||
ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y)
|
||||
# According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#include <linux/magic.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/posix-timers.h>
|
||||
#include <linux/user-return-notifier.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
|
@ -249,6 +250,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
|
|||
goto out;
|
||||
|
||||
setup_thread_stack(tsk, orig);
|
||||
clear_user_return_notifier(tsk);
|
||||
stackend = end_of_stack(tsk);
|
||||
*stackend = STACK_END_MAGIC; /* for overflow detection */
|
||||
|
||||
|
|
46
kernel/user-return-notifier.c
Normal file
46
kernel/user-return-notifier.c
Normal file
|
@ -0,0 +1,46 @@
|
|||
|
||||
#include <linux/user-return-notifier.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
static DEFINE_PER_CPU(struct hlist_head, return_notifier_list);
|
||||
|
||||
#define URN_LIST_HEAD per_cpu(return_notifier_list, raw_smp_processor_id())
|
||||
|
||||
/*
|
||||
* Request a notification when the current cpu returns to userspace. Must be
|
||||
* called in atomic context. The notifier will also be called in atomic
|
||||
* context.
|
||||
*/
|
||||
void user_return_notifier_register(struct user_return_notifier *urn)
|
||||
{
|
||||
set_tsk_thread_flag(current, TIF_USER_RETURN_NOTIFY);
|
||||
hlist_add_head(&urn->link, &URN_LIST_HEAD);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(user_return_notifier_register);
|
||||
|
||||
/*
|
||||
* Removes a registered user return notifier. Must be called from atomic
|
||||
* context, and from the same cpu registration occured in.
|
||||
*/
|
||||
void user_return_notifier_unregister(struct user_return_notifier *urn)
|
||||
{
|
||||
hlist_del(&urn->link);
|
||||
if (hlist_empty(&URN_LIST_HEAD))
|
||||
clear_tsk_thread_flag(current, TIF_USER_RETURN_NOTIFY);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(user_return_notifier_unregister);
|
||||
|
||||
/* Calls registered user return notifiers */
|
||||
void fire_user_return_notifiers(void)
|
||||
{
|
||||
struct user_return_notifier *urn;
|
||||
struct hlist_node *tmp1, *tmp2;
|
||||
struct hlist_head *head;
|
||||
|
||||
head = &get_cpu_var(return_notifier_list);
|
||||
hlist_for_each_entry_safe(urn, tmp1, tmp2, head, link)
|
||||
urn->on_user_return(urn);
|
||||
put_cpu_var(return_notifier_list);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue