Branch data Line data Source code
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 : :
13 : : struct timespec;
14 : : struct compat_timespec;
15 : :
16 : : /*
17 : : * System call restart block.
18 : : */
19 : : struct restart_block {
20 : : long (*fn)(struct restart_block *);
21 : : union {
22 : : /* For futex_wait and futex_wait_requeue_pi */
23 : : struct {
24 : : u32 __user *uaddr;
25 : : u32 val;
26 : : u32 flags;
27 : : u32 bitset;
28 : : u64 time;
29 : : u32 __user *uaddr2;
30 : : } futex;
31 : : /* For nanosleep */
32 : : struct {
33 : : clockid_t clockid;
34 : : struct timespec __user *rmtp;
35 : : #ifdef CONFIG_COMPAT
36 : : struct compat_timespec __user *compat_rmtp;
37 : : #endif
38 : : u64 expires;
39 : : } nanosleep;
40 : : /* For poll */
41 : : struct {
42 : : struct pollfd __user *ufds;
43 : : int nfds;
44 : : int has_timeout;
45 : : unsigned long tv_sec;
46 : : unsigned long tv_nsec;
47 : : } poll;
48 : : };
49 : : };
50 : :
51 : : extern long do_no_restart_syscall(struct restart_block *parm);
52 : :
53 : : #include <linux/bitops.h>
54 : : #include <asm/thread_info.h>
55 : :
56 : : #ifdef __KERNEL__
57 : :
58 : : #ifdef CONFIG_DEBUG_STACK_USAGE
59 : : # define THREADINFO_GFP (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
60 : : #else
61 : : # define THREADINFO_GFP (GFP_KERNEL | __GFP_NOTRACK)
62 : : #endif
63 : :
64 : : #define THREADINFO_GFP_ACCOUNTED (THREADINFO_GFP | __GFP_KMEMCG)
65 : :
66 : : /*
67 : : * flag set/clear/test wrappers
68 : : * - pass TIF_xxxx constants to these functions
69 : : */
70 : :
71 : : static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
72 : : {
73 : 11940360 : set_bit(flag, (unsigned long *)&ti->flags);
74 : : }
75 : :
76 : : static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
77 : : {
78 : 113714774 : clear_bit(flag, (unsigned long *)&ti->flags);
79 : : }
80 : :
81 : : static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
82 : : {
83 : 3878167 : return test_and_set_bit(flag, (unsigned long *)&ti->flags);
84 : : }
85 : :
86 : : static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
87 : : {
88 : 786 : return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
89 : : }
90 : :
91 : : static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
92 : : {
93 : : return test_bit(flag, (unsigned long *)&ti->flags);
94 : : }
95 : :
96 : : #define set_thread_flag(flag) \
97 : : set_ti_thread_flag(current_thread_info(), flag)
98 : : #define clear_thread_flag(flag) \
99 : : clear_ti_thread_flag(current_thread_info(), flag)
100 : : #define test_and_set_thread_flag(flag) \
101 : : test_and_set_ti_thread_flag(current_thread_info(), flag)
102 : : #define test_and_clear_thread_flag(flag) \
103 : : test_and_clear_ti_thread_flag(current_thread_info(), flag)
104 : : #define test_thread_flag(flag) \
105 : : test_ti_thread_flag(current_thread_info(), flag)
106 : :
107 : : static inline __deprecated void set_need_resched(void)
108 : : {
109 : : /*
110 : : * Use of this function in deprecated.
111 : : *
112 : : * As of this writing there are only a few users in the DRM tree left
113 : : * all of which are wrong and can be removed without causing too much
114 : : * grief.
115 : : *
116 : : * The DRM people are aware and are working on removing the last few
117 : : * instances.
118 : : */
119 : : }
120 : :
121 : : #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
122 : :
123 : : #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK
124 : : /*
125 : : * An arch can define its own version of set_restore_sigmask() to get the
126 : : * job done however works, with or without TIF_RESTORE_SIGMASK.
127 : : */
128 : : #define HAVE_SET_RESTORE_SIGMASK 1
129 : :
130 : : /**
131 : : * set_restore_sigmask() - make sure saved_sigmask processing gets done
132 : : *
133 : : * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code
134 : : * will run before returning to user mode, to process the flag. For
135 : : * all callers, TIF_SIGPENDING is already set or it's no harm to set
136 : : * it. TIF_RESTORE_SIGMASK need not be in the set of bits that the
137 : : * arch code will notice on return to user mode, in case those bits
138 : : * are scarce. We set TIF_SIGPENDING here to ensure that the arch
139 : : * signal code always gets run when TIF_RESTORE_SIGMASK is set.
140 : : */
141 : : static inline void set_restore_sigmask(void)
142 : : {
143 : : set_thread_flag(TIF_RESTORE_SIGMASK);
144 [ - + ][ # # ]: 180 : WARN_ON(!test_thread_flag(TIF_SIGPENDING));
145 : : }
146 : : static inline void clear_restore_sigmask(void)
147 : : {
148 : : clear_thread_flag(TIF_RESTORE_SIGMASK);
149 : : }
150 : : static inline bool test_restore_sigmask(void)
151 : : {
152 : 1327599 : return test_thread_flag(TIF_RESTORE_SIGMASK);
153 : : }
154 : : static inline bool test_and_clear_restore_sigmask(void)
155 : : {
156 : : return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
157 : : }
158 : : #endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
159 : :
160 : : #ifndef HAVE_SET_RESTORE_SIGMASK
161 : : #error "no set_restore_sigmask() provided and default one won't work"
162 : : #endif
163 : :
164 : : #endif /* __KERNEL__ */
165 : :
166 : : #endif /* _LINUX_THREAD_INFO_H */
|