1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 27c68af6eSAvi Kivity #ifndef _LINUX_USER_RETURN_NOTIFIER_H 37c68af6eSAvi Kivity #define _LINUX_USER_RETURN_NOTIFIER_H 47c68af6eSAvi Kivity 57c68af6eSAvi Kivity #ifdef CONFIG_USER_RETURN_NOTIFIER 67c68af6eSAvi Kivity 77c68af6eSAvi Kivity #include <linux/list.h> 87c68af6eSAvi Kivity #include <linux/sched.h> 97c68af6eSAvi Kivity 107c68af6eSAvi Kivity struct user_return_notifier { 117c68af6eSAvi Kivity void (*on_user_return)(struct user_return_notifier *urn); 127c68af6eSAvi Kivity struct hlist_node link; 137c68af6eSAvi Kivity }; 147c68af6eSAvi Kivity 157c68af6eSAvi Kivity 167c68af6eSAvi Kivity void user_return_notifier_register(struct user_return_notifier *urn); 177c68af6eSAvi Kivity void user_return_notifier_unregister(struct user_return_notifier *urn); 187c68af6eSAvi Kivity propagate_user_return_notify(struct task_struct * prev,struct task_struct * next)197c68af6eSAvi Kivitystatic inline void propagate_user_return_notify(struct task_struct *prev, 207c68af6eSAvi Kivity struct task_struct *next) 217c68af6eSAvi Kivity { 227c68af6eSAvi Kivity if (test_tsk_thread_flag(prev, TIF_USER_RETURN_NOTIFY)) { 237c68af6eSAvi Kivity clear_tsk_thread_flag(prev, TIF_USER_RETURN_NOTIFY); 247c68af6eSAvi Kivity set_tsk_thread_flag(next, TIF_USER_RETURN_NOTIFY); 257c68af6eSAvi Kivity } 267c68af6eSAvi Kivity } 277c68af6eSAvi Kivity 287c68af6eSAvi Kivity void fire_user_return_notifiers(void); 297c68af6eSAvi Kivity clear_user_return_notifier(struct task_struct * p)308e7cac79SAvi Kivitystatic inline void clear_user_return_notifier(struct task_struct *p) 318e7cac79SAvi Kivity { 328e7cac79SAvi Kivity clear_tsk_thread_flag(p, TIF_USER_RETURN_NOTIFY); 338e7cac79SAvi Kivity } 348e7cac79SAvi Kivity 357c68af6eSAvi Kivity #else 367c68af6eSAvi Kivity 377c68af6eSAvi Kivity struct user_return_notifier {}; 387c68af6eSAvi Kivity propagate_user_return_notify(struct task_struct * prev,struct task_struct * next)397c68af6eSAvi Kivitystatic inline void propagate_user_return_notify(struct task_struct *prev, 407c68af6eSAvi Kivity struct task_struct *next) 417c68af6eSAvi Kivity { 427c68af6eSAvi Kivity } 437c68af6eSAvi Kivity fire_user_return_notifiers(void)447c68af6eSAvi Kivitystatic inline void fire_user_return_notifiers(void) {} 457c68af6eSAvi Kivity clear_user_return_notifier(struct task_struct * p)468e7cac79SAvi Kivitystatic inline void clear_user_return_notifier(struct task_struct *p) {} 478e7cac79SAvi Kivity 487c68af6eSAvi Kivity #endif 497c68af6eSAvi Kivity 507c68af6eSAvi Kivity #endif 51