| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* thread_info.h: common low-level thread information accessors | 
 | 2 |  * | 
 | 3 |  * Copyright (C) 2002  David Howells (dhowells@redhat.com) | 
 | 4 |  * - Incorporating suggestions made by Linus Torvalds | 
 | 5 |  */ | 
 | 6 |  | 
 | 7 | #ifndef _LINUX_THREAD_INFO_H | 
 | 8 | #define _LINUX_THREAD_INFO_H | 
 | 9 |  | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 10 | #include <linux/types.h> | 
 | 11 |  | 
| Thomas Gleixner | a332d86 | 2008-02-10 09:04:12 +0100 | [diff] [blame] | 12 | struct timespec; | 
 | 13 | struct compat_timespec; | 
 | 14 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 15 | /* | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 16 |  * System call restart block. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 |  */ | 
 | 18 | struct restart_block { | 
 | 19 | 	long (*fn)(struct restart_block *); | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 20 | 	union { | 
 | 21 | 		struct { | 
 | 22 | 			unsigned long arg0, arg1, arg2, arg3; | 
 | 23 | 		}; | 
| Darren Hart | 52400ba | 2009-04-03 13:40:49 -0700 | [diff] [blame] | 24 | 		/* For futex_wait and futex_wait_requeue_pi */ | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 25 | 		struct { | 
| Namhyung Kim | a3c74c5 | 2010-09-14 21:43:47 +0900 | [diff] [blame] | 26 | 			u32 __user *uaddr; | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 27 | 			u32 val; | 
 | 28 | 			u32 flags; | 
| Thomas Gleixner | cd68998 | 2008-02-01 17:45:14 +0100 | [diff] [blame] | 29 | 			u32 bitset; | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 30 | 			u64 time; | 
| Namhyung Kim | a3c74c5 | 2010-09-14 21:43:47 +0900 | [diff] [blame] | 31 | 			u32 __user *uaddr2; | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 32 | 		} futex; | 
| Thomas Gleixner | a332d86 | 2008-02-10 09:04:12 +0100 | [diff] [blame] | 33 | 		/* For nanosleep */ | 
 | 34 | 		struct { | 
 | 35 | 			clockid_t index; | 
 | 36 | 			struct timespec __user *rmtp; | 
 | 37 | #ifdef CONFIG_COMPAT | 
 | 38 | 			struct compat_timespec __user *compat_rmtp; | 
 | 39 | #endif | 
 | 40 | 			u64 expires; | 
 | 41 | 		} nanosleep; | 
| Thomas Gleixner | be5dad2 | 2008-08-31 08:19:15 -0700 | [diff] [blame] | 42 | 		/* For poll */ | 
 | 43 | 		struct { | 
 | 44 | 			struct pollfd __user *ufds; | 
 | 45 | 			int nfds; | 
 | 46 | 			int has_timeout; | 
 | 47 | 			unsigned long tv_sec; | 
 | 48 | 			unsigned long tv_nsec; | 
 | 49 | 		} poll; | 
| Steven Rostedt | ce6bd42 | 2007-12-05 15:46:09 +0100 | [diff] [blame] | 50 | 	}; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 51 | }; | 
 | 52 |  | 
 | 53 | extern long do_no_restart_syscall(struct restart_block *parm); | 
 | 54 |  | 
 | 55 | #include <linux/bitops.h> | 
 | 56 | #include <asm/thread_info.h> | 
 | 57 |  | 
 | 58 | #ifdef __KERNEL__ | 
 | 59 |  | 
 | 60 | /* | 
 | 61 |  * flag set/clear/test wrappers | 
 | 62 |  * - pass TIF_xxxx constants to these functions | 
 | 63 |  */ | 
 | 64 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 65 | static inline void set_ti_thread_flag(struct thread_info *ti, int flag) | 
 | 66 | { | 
| Jeremy Fitzhardinge | 5548fec | 2008-01-30 13:30:55 +0100 | [diff] [blame] | 67 | 	set_bit(flag, (unsigned long *)&ti->flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 68 | } | 
 | 69 |  | 
 | 70 | static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) | 
 | 71 | { | 
| Jeremy Fitzhardinge | 5548fec | 2008-01-30 13:30:55 +0100 | [diff] [blame] | 72 | 	clear_bit(flag, (unsigned long *)&ti->flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 | } | 
 | 74 |  | 
 | 75 | static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) | 
 | 76 | { | 
| Jeremy Fitzhardinge | 5548fec | 2008-01-30 13:30:55 +0100 | [diff] [blame] | 77 | 	return test_and_set_bit(flag, (unsigned long *)&ti->flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 | } | 
 | 79 |  | 
 | 80 | static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) | 
 | 81 | { | 
| Jeremy Fitzhardinge | 5548fec | 2008-01-30 13:30:55 +0100 | [diff] [blame] | 82 | 	return test_and_clear_bit(flag, (unsigned long *)&ti->flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 | } | 
 | 84 |  | 
 | 85 | static inline int test_ti_thread_flag(struct thread_info *ti, int flag) | 
 | 86 | { | 
| Jeremy Fitzhardinge | 5548fec | 2008-01-30 13:30:55 +0100 | [diff] [blame] | 87 | 	return test_bit(flag, (unsigned long *)&ti->flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 88 | } | 
 | 89 |  | 
| Roman Zippel | 3b66a1e | 2005-11-13 16:06:59 -0800 | [diff] [blame] | 90 | #define set_thread_flag(flag) \ | 
 | 91 | 	set_ti_thread_flag(current_thread_info(), flag) | 
 | 92 | #define clear_thread_flag(flag) \ | 
 | 93 | 	clear_ti_thread_flag(current_thread_info(), flag) | 
 | 94 | #define test_and_set_thread_flag(flag) \ | 
 | 95 | 	test_and_set_ti_thread_flag(current_thread_info(), flag) | 
 | 96 | #define test_and_clear_thread_flag(flag) \ | 
 | 97 | 	test_and_clear_ti_thread_flag(current_thread_info(), flag) | 
 | 98 | #define test_thread_flag(flag) \ | 
 | 99 | 	test_ti_thread_flag(current_thread_info(), flag) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 100 |  | 
| Roman Zippel | 3b66a1e | 2005-11-13 16:06:59 -0800 | [diff] [blame] | 101 | #define set_need_resched()	set_thread_flag(TIF_NEED_RESCHED) | 
 | 102 | #define clear_need_resched()	clear_thread_flag(TIF_NEED_RESCHED) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 103 |  | 
| Roland McGrath | f3de272 | 2008-04-30 00:53:09 -0700 | [diff] [blame] | 104 | #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK | 
 | 105 | /* | 
 | 106 |  * An arch can define its own version of set_restore_sigmask() to get the | 
 | 107 |  * job done however works, with or without TIF_RESTORE_SIGMASK. | 
 | 108 |  */ | 
 | 109 | #define HAVE_SET_RESTORE_SIGMASK	1 | 
 | 110 |  | 
| Roland McGrath | 4e4c22c | 2008-04-30 00:53:06 -0700 | [diff] [blame] | 111 | /** | 
 | 112 |  * set_restore_sigmask() - make sure saved_sigmask processing gets done | 
 | 113 |  * | 
 | 114 |  * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code | 
| Roland McGrath | 7648d96 | 2008-04-30 00:53:07 -0700 | [diff] [blame] | 115 |  * will run before returning to user mode, to process the flag.  For | 
 | 116 |  * all callers, TIF_SIGPENDING is already set or it's no harm to set | 
 | 117 |  * it.  TIF_RESTORE_SIGMASK need not be in the set of bits that the | 
 | 118 |  * arch code will notice on return to user mode, in case those bits | 
 | 119 |  * are scarce.  We set TIF_SIGPENDING here to ensure that the arch | 
 | 120 |  * signal code always gets run when TIF_RESTORE_SIGMASK is set. | 
| Roland McGrath | 4e4c22c | 2008-04-30 00:53:06 -0700 | [diff] [blame] | 121 |  */ | 
 | 122 | static inline void set_restore_sigmask(void) | 
 | 123 | { | 
 | 124 | 	set_thread_flag(TIF_RESTORE_SIGMASK); | 
| Roland McGrath | 7648d96 | 2008-04-30 00:53:07 -0700 | [diff] [blame] | 125 | 	set_thread_flag(TIF_SIGPENDING); | 
| Roland McGrath | 4e4c22c | 2008-04-30 00:53:06 -0700 | [diff] [blame] | 126 | } | 
| Roland McGrath | f3de272 | 2008-04-30 00:53:09 -0700 | [diff] [blame] | 127 | #endif	/* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */ | 
| Roland McGrath | 4e4c22c | 2008-04-30 00:53:06 -0700 | [diff] [blame] | 128 |  | 
 | 129 | #endif	/* __KERNEL__ */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 130 |  | 
 | 131 | #endif /* _LINUX_THREAD_INFO_H */ |