blob: fddbe2023a5d568717b3b90eabc692bb4612f9bd [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* 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 Rostedtce6bd422007-12-05 15:46:09 +010010#include <linux/types.h>
Al Viroedd63a22012-04-27 13:42:45 -040011#include <linux/bug.h>
Steven Rostedtce6bd422007-12-05 15:46:09 +010012
Thomas Gleixnera332d862008-02-10 09:04:12 +010013struct timespec;
14struct compat_timespec;
15
Linus Torvalds1da177e2005-04-16 15:20:36 -070016/*
Steven Rostedtce6bd422007-12-05 15:46:09 +010017 * System call restart block.
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 */
19struct restart_block {
20 long (*fn)(struct restart_block *);
Steven Rostedtce6bd422007-12-05 15:46:09 +010021 union {
Darren Hart52400ba2009-04-03 13:40:49 -070022 /* For futex_wait and futex_wait_requeue_pi */
Steven Rostedtce6bd422007-12-05 15:46:09 +010023 struct {
Namhyung Kima3c74c52010-09-14 21:43:47 +090024 u32 __user *uaddr;
Steven Rostedtce6bd422007-12-05 15:46:09 +010025 u32 val;
26 u32 flags;
Thomas Gleixnercd689982008-02-01 17:45:14 +010027 u32 bitset;
Steven Rostedtce6bd422007-12-05 15:46:09 +010028 u64 time;
Namhyung Kima3c74c52010-09-14 21:43:47 +090029 u32 __user *uaddr2;
Steven Rostedtce6bd422007-12-05 15:46:09 +010030 } futex;
Thomas Gleixnera332d862008-02-10 09:04:12 +010031 /* For nanosleep */
32 struct {
Thomas Gleixnerab8177b2011-05-20 13:05:15 +020033 clockid_t clockid;
Thomas Gleixnera332d862008-02-10 09:04:12 +010034 struct timespec __user *rmtp;
35#ifdef CONFIG_COMPAT
36 struct compat_timespec __user *compat_rmtp;
37#endif
38 u64 expires;
39 } nanosleep;
Thomas Gleixnerbe5dad22008-08-31 08:19:15 -070040 /* 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;
Steven Rostedtce6bd422007-12-05 15:46:09 +010048 };
Linus Torvalds1da177e2005-04-16 15:20:36 -070049};
50
51extern 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
Thomas Gleixner2889f602012-05-05 15:05:41 +000058#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
Glauber Costa2ad306b2012-12-18 14:22:18 -080064#define THREADINFO_GFP_ACCOUNTED (THREADINFO_GFP | __GFP_KMEMCG)
65
Linus Torvalds1da177e2005-04-16 15:20:36 -070066/*
67 * flag set/clear/test wrappers
68 * - pass TIF_xxxx constants to these functions
69 */
70
Linus Torvalds1da177e2005-04-16 15:20:36 -070071static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
72{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010073 set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070074}
75
76static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
77{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010078 clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070079}
80
81static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
82{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010083 return test_and_set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070084}
85
86static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
87{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010088 return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070089}
90
91static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
92{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010093 return test_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070094}
95
Roman Zippel3b66a1e2005-11-13 16:06:59 -080096#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)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106
Peter Zijlstra31503982013-09-12 15:10:31 +0200107static 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}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120
Peter Zijlstraea811742013-09-11 12:43:13 +0200121#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
122
Roland McGrathf3de2722008-04-30 00:53:09 -0700123#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
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700130/**
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
Roland McGrath7648d962008-04-30 00:53:07 -0700134 * 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.
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700140 */
141static inline void set_restore_sigmask(void)
142{
143 set_thread_flag(TIF_RESTORE_SIGMASK);
Al Viroedd63a22012-04-27 13:42:45 -0400144 WARN_ON(!test_thread_flag(TIF_SIGPENDING));
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700145}
Al Viro4ebefe32012-04-26 22:29:20 -0400146static inline void clear_restore_sigmask(void)
147{
148 clear_thread_flag(TIF_RESTORE_SIGMASK);
149}
150static inline bool test_restore_sigmask(void)
151{
152 return test_thread_flag(TIF_RESTORE_SIGMASK);
153}
154static inline bool test_and_clear_restore_sigmask(void)
155{
156 return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
157}
Roland McGrathf3de2722008-04-30 00:53:09 -0700158#endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700159
Al Viro754421c2012-04-26 18:31:00 -0400160#ifndef HAVE_SET_RESTORE_SIGMASK
161#error "no set_restore_sigmask() provided and default one won't work"
162#endif
163
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700164#endif /* __KERNEL__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165
166#endif /* _LINUX_THREAD_INFO_H */