3c912b6eda
Today's linux-next build (x86_64 allmodconfig) failed like this: kernel/user-return-notifier.c: In function 'fire_user_return_notifiers': kernel/user-return-notifier.c:45: error: expected expression before ')' token Introduced by commit7c68af6e32
("core, x86: Add user return notifiers") from the tip and kvm trees but revealed by commite0fdb0e050
("percpu: add __percpu for sparse") from the percpu tree. Before that percpu tree commit, "put_cpu_var()" would compile without error (even though it really needs a parameter). Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Avi Kivity <avi@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Tejun Heo <tj@kernel.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Christoph Lameter <cl@linux-foundation.org> LKML-Reference: <20091102161722.eea4358d.sfr@canb.auug.org.au> Signed-off-by: Ingo Molnar <mingo@elte.hu>
46 lines
1.4 KiB
C
46 lines
1.4 KiB
C
|
|
#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);
|
|
}
|