blob: ccc1899bd62e991e4649b72e7145010f93f948f9 [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
Linus Torvalds1da177e2005-04-16 15:20:36 -070064/*
65 * flag set/clear/test wrappers
66 * - pass TIF_xxxx constants to these functions
67 */
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
70{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010071 set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070072}
73
74static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
75{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010076 clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070077}
78
79static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
80{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010081 return test_and_set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070082}
83
84static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
85{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010086 return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070087}
88
89static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
90{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010091 return test_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070092}
93
Roman Zippel3b66a1e2005-11-13 16:06:59 -080094#define set_thread_flag(flag) \
95 set_ti_thread_flag(current_thread_info(), flag)
96#define clear_thread_flag(flag) \
97 clear_ti_thread_flag(current_thread_info(), flag)
98#define test_and_set_thread_flag(flag) \
99 test_and_set_ti_thread_flag(current_thread_info(), flag)
100#define test_and_clear_thread_flag(flag) \
101 test_and_clear_ti_thread_flag(current_thread_info(), flag)
102#define test_thread_flag(flag) \
103 test_ti_thread_flag(current_thread_info(), flag)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Roman Zippel3b66a1e2005-11-13 16:06:59 -0800105#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
106#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Roland McGrathf3de2722008-04-30 00:53:09 -0700108#if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK
109/*
110 * An arch can define its own version of set_restore_sigmask() to get the
111 * job done however works, with or without TIF_RESTORE_SIGMASK.
112 */
113#define HAVE_SET_RESTORE_SIGMASK 1
114
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700115/**
116 * set_restore_sigmask() - make sure saved_sigmask processing gets done
117 *
118 * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code
Roland McGrath7648d962008-04-30 00:53:07 -0700119 * will run before returning to user mode, to process the flag. For
120 * all callers, TIF_SIGPENDING is already set or it's no harm to set
121 * it. TIF_RESTORE_SIGMASK need not be in the set of bits that the
122 * arch code will notice on return to user mode, in case those bits
123 * are scarce. We set TIF_SIGPENDING here to ensure that the arch
124 * signal code always gets run when TIF_RESTORE_SIGMASK is set.
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700125 */
126static inline void set_restore_sigmask(void)
127{
128 set_thread_flag(TIF_RESTORE_SIGMASK);
Al Viroedd63a22012-04-27 13:42:45 -0400129 WARN_ON(!test_thread_flag(TIF_SIGPENDING));
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700130}
Al Viro4ebefe32012-04-26 22:29:20 -0400131static inline void clear_restore_sigmask(void)
132{
133 clear_thread_flag(TIF_RESTORE_SIGMASK);
134}
135static inline bool test_restore_sigmask(void)
136{
137 return test_thread_flag(TIF_RESTORE_SIGMASK);
138}
139static inline bool test_and_clear_restore_sigmask(void)
140{
141 return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
142}
Roland McGrathf3de2722008-04-30 00:53:09 -0700143#endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700144
Al Viro754421c2012-04-26 18:31:00 -0400145#ifndef HAVE_SET_RESTORE_SIGMASK
146#error "no set_restore_sigmask() provided and default one won't work"
147#endif
148
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700149#endif /* __KERNEL__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150
151#endif /* _LINUX_THREAD_INFO_H */