blob: e7e04736802f60eca7847b5241b8c217c4b7a732 [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
Roman Zippel3b66a1e2005-11-13 16:06:59 -0800107#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
108#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109
Roland McGrathf3de2722008-04-30 00:53:09 -0700110#if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK
111/*
112 * An arch can define its own version of set_restore_sigmask() to get the
113 * job done however works, with or without TIF_RESTORE_SIGMASK.
114 */
115#define HAVE_SET_RESTORE_SIGMASK 1
116
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700117/**
118 * set_restore_sigmask() - make sure saved_sigmask processing gets done
119 *
120 * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code
Roland McGrath7648d962008-04-30 00:53:07 -0700121 * will run before returning to user mode, to process the flag. For
122 * all callers, TIF_SIGPENDING is already set or it's no harm to set
123 * it. TIF_RESTORE_SIGMASK need not be in the set of bits that the
124 * arch code will notice on return to user mode, in case those bits
125 * are scarce. We set TIF_SIGPENDING here to ensure that the arch
126 * signal code always gets run when TIF_RESTORE_SIGMASK is set.
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700127 */
128static inline void set_restore_sigmask(void)
129{
130 set_thread_flag(TIF_RESTORE_SIGMASK);
Al Viroedd63a22012-04-27 13:42:45 -0400131 WARN_ON(!test_thread_flag(TIF_SIGPENDING));
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700132}
Al Viro4ebefe32012-04-26 22:29:20 -0400133static inline void clear_restore_sigmask(void)
134{
135 clear_thread_flag(TIF_RESTORE_SIGMASK);
136}
137static inline bool test_restore_sigmask(void)
138{
139 return test_thread_flag(TIF_RESTORE_SIGMASK);
140}
141static inline bool test_and_clear_restore_sigmask(void)
142{
143 return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
144}
Roland McGrathf3de2722008-04-30 00:53:09 -0700145#endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700146
Al Viro754421c2012-04-26 18:31:00 -0400147#ifndef HAVE_SET_RESTORE_SIGMASK
148#error "no set_restore_sigmask() provided and default one won't work"
149#endif
150
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700151#endif /* __KERNEL__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152
153#endif /* _LINUX_THREAD_INFO_H */