at v4.9-rc1 3.6 kB view raw
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 10#include <linux/types.h> 11#include <linux/bug.h> 12 13struct timespec; 14struct compat_timespec; 15 16#ifdef CONFIG_THREAD_INFO_IN_TASK 17struct thread_info { 18 unsigned long flags; /* low level flags */ 19}; 20 21#define INIT_THREAD_INFO(tsk) \ 22{ \ 23 .flags = 0, \ 24} 25#endif 26 27#ifdef CONFIG_THREAD_INFO_IN_TASK 28#define current_thread_info() ((struct thread_info *)current) 29#endif 30 31/* 32 * System call restart block. 33 */ 34struct restart_block { 35 long (*fn)(struct restart_block *); 36 union { 37 /* For futex_wait and futex_wait_requeue_pi */ 38 struct { 39 u32 __user *uaddr; 40 u32 val; 41 u32 flags; 42 u32 bitset; 43 u64 time; 44 u32 __user *uaddr2; 45 } futex; 46 /* For nanosleep */ 47 struct { 48 clockid_t clockid; 49 struct timespec __user *rmtp; 50#ifdef CONFIG_COMPAT 51 struct compat_timespec __user *compat_rmtp; 52#endif 53 u64 expires; 54 } nanosleep; 55 /* For poll */ 56 struct { 57 struct pollfd __user *ufds; 58 int nfds; 59 int has_timeout; 60 unsigned long tv_sec; 61 unsigned long tv_nsec; 62 } poll; 63 }; 64}; 65 66extern long do_no_restart_syscall(struct restart_block *parm); 67 68#include <linux/bitops.h> 69#include <asm/thread_info.h> 70 71#ifdef __KERNEL__ 72 73#ifdef CONFIG_DEBUG_STACK_USAGE 74# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \ 75 __GFP_ZERO) 76#else 77# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK) 78#endif 79 80/* 81 * flag set/clear/test wrappers 82 * - pass TIF_xxxx constants to these functions 83 */ 84 85static inline void set_ti_thread_flag(struct thread_info *ti, int flag) 86{ 87 set_bit(flag, (unsigned long *)&ti->flags); 88} 89 90static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) 91{ 92 clear_bit(flag, (unsigned long *)&ti->flags); 93} 94 95static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) 96{ 97 return test_and_set_bit(flag, (unsigned long *)&ti->flags); 98} 99 100static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) 101{ 102 return test_and_clear_bit(flag, (unsigned long *)&ti->flags); 103} 104 105static inline int test_ti_thread_flag(struct thread_info *ti, int flag) 106{ 107 return test_bit(flag, (unsigned long *)&ti->flags); 108} 109 110#define set_thread_flag(flag) \ 111 set_ti_thread_flag(current_thread_info(), flag) 112#define clear_thread_flag(flag) \ 113 clear_ti_thread_flag(current_thread_info(), flag) 114#define test_and_set_thread_flag(flag) \ 115 test_and_set_ti_thread_flag(current_thread_info(), flag) 116#define test_and_clear_thread_flag(flag) \ 117 test_and_clear_ti_thread_flag(current_thread_info(), flag) 118#define test_thread_flag(flag) \ 119 test_ti_thread_flag(current_thread_info(), flag) 120 121#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) 122 123#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES 124static inline int arch_within_stack_frames(const void * const stack, 125 const void * const stackend, 126 const void *obj, unsigned long len) 127{ 128 return 0; 129} 130#endif 131 132#ifdef CONFIG_HARDENED_USERCOPY 133extern void __check_object_size(const void *ptr, unsigned long n, 134 bool to_user); 135 136static __always_inline void check_object_size(const void *ptr, unsigned long n, 137 bool to_user) 138{ 139 if (!__builtin_constant_p(n)) 140 __check_object_size(ptr, n, to_user); 141} 142#else 143static inline void check_object_size(const void *ptr, unsigned long n, 144 bool to_user) 145{ } 146#endif /* CONFIG_HARDENED_USERCOPY */ 147 148#endif /* __KERNEL__ */ 149 150#endif /* _LINUX_THREAD_INFO_H */