blob: b4c2a485b28a737bce23f01663dc107d00179326 [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
Vladimir Davydov5d097052016-01-14 15:18:21 -080059# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \
60 __GFP_ZERO)
Thomas Gleixner2889f602012-05-05 15:05:41 +000061#else
Vladimir Davydov5d097052016-01-14 15:18:21 -080062# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK)
Thomas Gleixner2889f602012-05-05 15:05:41 +000063#endif
64
Linus Torvalds1da177e2005-04-16 15:20:36 -070065/*
66 * flag set/clear/test wrappers
67 * - pass TIF_xxxx constants to these functions
68 */
69
Linus Torvalds1da177e2005-04-16 15:20:36 -070070static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
71{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010072 set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070073}
74
75static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
76{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010077 clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070078}
79
80static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
81{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010082 return test_and_set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070083}
84
85static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
86{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010087 return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088}
89
90static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
91{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010092 return test_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070093}
94
Roman Zippel3b66a1e2005-11-13 16:06:59 -080095#define set_thread_flag(flag) \
96 set_ti_thread_flag(current_thread_info(), flag)
97#define clear_thread_flag(flag) \
98 clear_ti_thread_flag(current_thread_info(), flag)
99#define test_and_set_thread_flag(flag) \
100 test_and_set_ti_thread_flag(current_thread_info(), flag)
101#define test_and_clear_thread_flag(flag) \
102 test_and_clear_ti_thread_flag(current_thread_info(), flag)
103#define test_thread_flag(flag) \
104 test_ti_thread_flag(current_thread_info(), flag)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
Peter Zijlstraea811742013-09-11 12:43:13 +0200106#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
107
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 */