LCOV - code coverage report
Current view: top level - include/linux - thread_info.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 4 100.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 2 4 50.0 %

           Branch data     Line data    Source code
       1                 :            : /* 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                 :            : 
      10                 :            : #include <linux/types.h>
      11                 :            : #include <linux/bug.h>
      12                 :            : 
      13                 :            : struct timespec;
      14                 :            : struct compat_timespec;
      15                 :            : 
      16                 :            : /*
      17                 :            :  * System call restart block.
      18                 :            :  */
      19                 :            : struct restart_block {
      20                 :            :         long (*fn)(struct restart_block *);
      21                 :            :         union {
      22                 :            :                 /* For futex_wait and futex_wait_requeue_pi */
      23                 :            :                 struct {
      24                 :            :                         u32 __user *uaddr;
      25                 :            :                         u32 val;
      26                 :            :                         u32 flags;
      27                 :            :                         u32 bitset;
      28                 :            :                         u64 time;
      29                 :            :                         u32 __user *uaddr2;
      30                 :            :                 } futex;
      31                 :            :                 /* For nanosleep */
      32                 :            :                 struct {
      33                 :            :                         clockid_t clockid;
      34                 :            :                         struct timespec __user *rmtp;
      35                 :            : #ifdef CONFIG_COMPAT
      36                 :            :                         struct compat_timespec __user *compat_rmtp;
      37                 :            : #endif
      38                 :            :                         u64 expires;
      39                 :            :                 } nanosleep;
      40                 :            :                 /* 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;
      48                 :            :         };
      49                 :            : };
      50                 :            : 
      51                 :            : extern 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                 :            : 
      58                 :            : #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                 :            : 
      64                 :            : #define THREADINFO_GFP_ACCOUNTED (THREADINFO_GFP | __GFP_KMEMCG)
      65                 :            : 
      66                 :            : /*
      67                 :            :  * flag set/clear/test wrappers
      68                 :            :  * - pass TIF_xxxx constants to these functions
      69                 :            :  */
      70                 :            : 
      71                 :            : static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
      72                 :            : {
      73                 :   10763619 :         set_bit(flag, (unsigned long *)&ti->flags);
      74                 :            : }
      75                 :            : 
      76                 :            : static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
      77                 :            : {
      78                 :  129212126 :         clear_bit(flag, (unsigned long *)&ti->flags);
      79                 :            : }
      80                 :            : 
      81                 :            : static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
      82                 :            : {
      83                 :    4985413 :         return test_and_set_bit(flag, (unsigned long *)&ti->flags);
      84                 :            : }
      85                 :            : 
      86                 :            : static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
      87                 :            : {
      88                 :            :         return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
      89                 :            : }
      90                 :            : 
      91                 :            : static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
      92                 :            : {
      93                 :            :         return test_bit(flag, (unsigned long *)&ti->flags);
      94                 :            : }
      95                 :            : 
      96                 :            : #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)
     106                 :            : 
     107                 :            : static 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                 :            : }
     120                 :            : 
     121                 :            : #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
     122                 :            : 
     123                 :            : #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                 :            : 
     130                 :            : /**
     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
     134                 :            :  * 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.
     140                 :            :  */
     141                 :            : static inline void set_restore_sigmask(void)
     142                 :            : {
     143                 :            :         set_thread_flag(TIF_RESTORE_SIGMASK);
     144 [ -  + ][ -  + ]:        183 :         WARN_ON(!test_thread_flag(TIF_SIGPENDING));
     145                 :            : }
     146                 :            : static inline void clear_restore_sigmask(void)
     147                 :            : {
     148                 :            :         clear_thread_flag(TIF_RESTORE_SIGMASK);
     149                 :            : }
     150                 :            : static inline bool test_restore_sigmask(void)
     151                 :            : {
     152                 :            :         return test_thread_flag(TIF_RESTORE_SIGMASK);
     153                 :            : }
     154                 :            : static inline bool test_and_clear_restore_sigmask(void)
     155                 :            : {
     156                 :            :         return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
     157                 :            : }
     158                 :            : #endif  /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
     159                 :            : 
     160                 :            : #ifndef HAVE_SET_RESTORE_SIGMASK
     161                 :            : #error "no set_restore_sigmask() provided and default one won't work"
     162                 :            : #endif
     163                 :            : 
     164                 :            : #endif  /* __KERNEL__ */
     165                 :            : 
     166                 :            : #endif /* _LINUX_THREAD_INFO_H */

Generated by: LCOV version 1.9