signals: set_restore_sigmask TIF_SIGPENDING
[pandora-kernel.git] / include / linux / thread_info.h
index 1c4eb41..81c5f82 100644 (file)
@@ -7,12 +7,38 @@
 #ifndef _LINUX_THREAD_INFO_H
 #define _LINUX_THREAD_INFO_H
 
+#include <linux/types.h>
+
+struct timespec;
+struct compat_timespec;
+
 /*
- * System call restart block. 
+ * System call restart block.
  */
 struct restart_block {
        long (*fn)(struct restart_block *);
-       unsigned long arg0, arg1, arg2, arg3;
+       union {
+               struct {
+                       unsigned long arg0, arg1, arg2, arg3;
+               };
+               /* For futex_wait */
+               struct {
+                       u32 *uaddr;
+                       u32 val;
+                       u32 flags;
+                       u32 bitset;
+                       u64 time;
+               } futex;
+               /* For nanosleep */
+               struct {
+                       clockid_t index;
+                       struct timespec __user *rmtp;
+#ifdef CONFIG_COMPAT
+                       struct compat_timespec __user *compat_rmtp;
+#endif
+                       u64 expires;
+               } nanosleep;
+       };
 };
 
 extern long do_no_restart_syscall(struct restart_block *parm);
@@ -29,27 +55,27 @@ extern long do_no_restart_syscall(struct restart_block *parm);
 
 static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
 {
-       set_bit(flag,&ti->flags);
+       set_bit(flag, (unsigned long *)&ti->flags);
 }
 
 static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
 {
-       clear_bit(flag,&ti->flags);
+       clear_bit(flag, (unsigned long *)&ti->flags);
 }
 
 static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
 {
-       return test_and_set_bit(flag,&ti->flags);
+       return test_and_set_bit(flag, (unsigned long *)&ti->flags);
 }
 
 static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
 {
-       return test_and_clear_bit(flag,&ti->flags);
+       return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
 }
 
 static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
 {
-       return test_bit(flag,&ti->flags);
+       return test_bit(flag, (unsigned long *)&ti->flags);
 }
 
 #define set_thread_flag(flag) \
@@ -66,6 +92,25 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
 #define set_need_resched()     set_thread_flag(TIF_NEED_RESCHED)
 #define clear_need_resched()   clear_thread_flag(TIF_NEED_RESCHED)
 
-#endif
+#ifdef TIF_RESTORE_SIGMASK
+/**
+ * set_restore_sigmask() - make sure saved_sigmask processing gets done
+ *
+ * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code
+ * will run before returning to user mode, to process the flag.  For
+ * all callers, TIF_SIGPENDING is already set or it's no harm to set
+ * it.  TIF_RESTORE_SIGMASK need not be in the set of bits that the
+ * arch code will notice on return to user mode, in case those bits
+ * are scarce.  We set TIF_SIGPENDING here to ensure that the arch
+ * signal code always gets run when TIF_RESTORE_SIGMASK is set.
+ */
+static inline void set_restore_sigmask(void)
+{
+       set_thread_flag(TIF_RESTORE_SIGMASK);
+       set_thread_flag(TIF_SIGPENDING);
+}
+#endif /* TIF_RESTORE_SIGMASK */
+
+#endif /* __KERNEL__ */
 
 #endif /* _LINUX_THREAD_INFO_H */