sched.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:27k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _LINUX_SCHED_H
  2. #define _LINUX_SCHED_H
  3. #include <asm/param.h> /* for HZ */
  4. extern unsigned long event;
  5. #include <linux/config.h>
  6. #include <linux/binfmts.h>
  7. #include <linux/threads.h>
  8. #include <linux/kernel.h>
  9. #include <linux/types.h>
  10. #include <linux/times.h>
  11. #include <linux/timex.h>
  12. #include <linux/rbtree.h>
  13. #include <asm/system.h>
  14. #include <asm/semaphore.h>
  15. #include <asm/page.h>
  16. #include <asm/ptrace.h>
  17. #include <asm/mmu.h>
  18. #include <linux/smp.h>
  19. #include <linux/tty.h>
  20. #include <linux/sem.h>
  21. #include <linux/signal.h>
  22. #include <linux/securebits.h>
  23. #include <linux/fs_struct.h>
  24. struct exec_domain;
  25. /*
  26.  * cloning flags:
  27.  */
  28. #define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
  29. #define CLONE_VM 0x00000100 /* set if VM shared between processes */
  30. #define CLONE_FS 0x00000200 /* set if fs info shared between processes */
  31. #define CLONE_FILES 0x00000400 /* set if open files shared between processes */
  32. #define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
  33. #define CLONE_PID 0x00001000 /* set if pid shared */
  34. #define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
  35. #define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
  36. #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
  37. #define CLONE_THREAD 0x00010000 /* Same thread group? */
  38. #define CLONE_NEWNS 0x00020000 /* New namespace group? */
  39. #define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD)
  40. /*
  41.  * These are the constant used to fake the fixed-point load-average
  42.  * counting. Some notes:
  43.  *  - 11 bit fractions expand to 22 bits by the multiplies: this gives
  44.  *    a load-average precision of 10 bits integer + 11 bits fractional
  45.  *  - if you want to count load-averages more often, you need more
  46.  *    precision, or rounding will get you. With 2-second counting freq,
  47.  *    the EXP_n values would be 1981, 2034 and 2043 if still using only
  48.  *    11 bit fractions.
  49.  */
  50. extern unsigned long avenrun[]; /* Load averages */
  51. #define FSHIFT 11 /* nr of bits of precision */
  52. #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */
  53. #define LOAD_FREQ (5*HZ) /* 5 sec intervals */
  54. #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */
  55. #define EXP_5 2014 /* 1/exp(5sec/5min) */
  56. #define EXP_15 2037 /* 1/exp(5sec/15min) */
  57. #define CALC_LOAD(load,exp,n) 
  58. load *= exp; 
  59. load += n*(FIXED_1-exp); 
  60. load >>= FSHIFT;
  61. #define CT_TO_SECS(x) ((x) / HZ)
  62. #define CT_TO_USECS(x) (((x) % HZ) * 1000000/HZ)
  63. extern int nr_running, nr_threads;
  64. extern int last_pid;
  65. #include <linux/fs.h>
  66. #include <linux/time.h>
  67. #include <linux/param.h>
  68. #include <linux/resource.h>
  69. #ifdef __KERNEL__
  70. #include <linux/timer.h>
  71. #endif
  72. #include <asm/processor.h>
  73. #define TASK_RUNNING 0
  74. #define TASK_INTERRUPTIBLE 1
  75. #define TASK_UNINTERRUPTIBLE 2
  76. #define TASK_ZOMBIE 4
  77. #define TASK_STOPPED 8
  78. #define __set_task_state(tsk, state_value)
  79. do { (tsk)->state = (state_value); } while (0)
  80. #ifdef CONFIG_SMP
  81. #define set_task_state(tsk, state_value)
  82. set_mb((tsk)->state, (state_value))
  83. #else
  84. #define set_task_state(tsk, state_value)
  85. __set_task_state((tsk), (state_value))
  86. #endif
  87. #define __set_current_state(state_value)
  88. do { current->state = (state_value); } while (0)
  89. #ifdef CONFIG_SMP
  90. #define set_current_state(state_value)
  91. set_mb(current->state, (state_value))
  92. #else
  93. #define set_current_state(state_value)
  94. __set_current_state(state_value)
  95. #endif
  96. /*
  97.  * Scheduling policies
  98.  */
  99. #define SCHED_OTHER 0
  100. #define SCHED_FIFO 1
  101. #define SCHED_RR 2
  102. /*
  103.  * This is an additional bit set when we want to
  104.  * yield the CPU for one re-schedule..
  105.  */
  106. #define SCHED_YIELD 0x10
  107. struct sched_param {
  108. int sched_priority;
  109. };
  110. struct completion;
  111. #ifdef __KERNEL__
  112. #include <linux/spinlock.h>
  113. /*
  114.  * This serializes "schedule()" and also protects
  115.  * the run-queue from deletions/modifications (but
  116.  * _adding_ to the beginning of the run-queue has
  117.  * a separate lock).
  118.  */
  119. extern rwlock_t tasklist_lock;
  120. extern spinlock_t runqueue_lock;
  121. extern spinlock_t mmlist_lock;
  122. extern void sched_init(void);
  123. extern void init_idle(void);
  124. extern void show_state(void);
  125. extern void cpu_init (void);
  126. extern void trap_init(void);
  127. extern void update_process_times(int user);
  128. extern void update_one_process(struct task_struct *p, unsigned long user,
  129.        unsigned long system, int cpu);
  130. #define MAX_SCHEDULE_TIMEOUT LONG_MAX
  131. extern signed long FASTCALL(schedule_timeout(signed long timeout));
  132. asmlinkage void schedule(void);
  133. extern int schedule_task(struct tq_struct *task);
  134. extern void flush_scheduled_tasks(void);
  135. extern int start_context_thread(void);
  136. extern int current_is_keventd(void);
  137. /*
  138.  * The default fd array needs to be at least BITS_PER_LONG,
  139.  * as this is the granularity returned by copy_fdset().
  140.  */
  141. #define NR_OPEN_DEFAULT BITS_PER_LONG
  142. struct namespace;
  143. /*
  144.  * Open file table structure
  145.  */
  146. struct files_struct {
  147. atomic_t count;
  148. rwlock_t file_lock; /* Protects all the below members.  Nests inside tsk->alloc_lock */
  149. int max_fds;
  150. int max_fdset;
  151. int next_fd;
  152. struct file ** fd; /* current fd array */
  153. fd_set *close_on_exec;
  154. fd_set *open_fds;
  155. fd_set close_on_exec_init;
  156. fd_set open_fds_init;
  157. struct file * fd_array[NR_OPEN_DEFAULT];
  158. };
  159. #define INIT_FILES 
  160. count: ATOMIC_INIT(1), 
  161. file_lock: RW_LOCK_UNLOCKED, 
  162. max_fds: NR_OPEN_DEFAULT, 
  163. max_fdset: __FD_SETSIZE, 
  164. next_fd: 0, 
  165. fd: &init_files.fd_array[0], 
  166. close_on_exec: &init_files.close_on_exec_init, 
  167. open_fds: &init_files.open_fds_init, 
  168. close_on_exec_init: { { 0, } }, 
  169. open_fds_init: { { 0, } }, 
  170. fd_array: { NULL, } 
  171. }
  172. /* Maximum number of active map areas.. This is a random (large) number */
  173. #define DEFAULT_MAX_MAP_COUNT (65536)
  174. extern int max_map_count;
  175. struct mm_struct {
  176. struct vm_area_struct * mmap; /* list of VMAs */
  177. rb_root_t mm_rb;
  178. struct vm_area_struct * mmap_cache; /* last find_vma result */
  179. pgd_t * pgd;
  180. atomic_t mm_users; /* How many users with user space? */
  181. atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */
  182. int map_count; /* number of VMAs */
  183. struct rw_semaphore mmap_sem;
  184. spinlock_t page_table_lock; /* Protects task page tables and mm->rss */
  185. struct list_head mmlist; /* List of all active mm's.  These are globally strung
  186.  * together off init_mm.mmlist, and are protected
  187.  * by mmlist_lock
  188.  */
  189. unsigned long start_code, end_code, start_data, end_data;
  190. unsigned long start_brk, brk, start_stack;
  191. unsigned long arg_start, arg_end, env_start, env_end;
  192. unsigned long rss, total_vm, locked_vm;
  193. unsigned long def_flags;
  194. unsigned long cpu_vm_mask;
  195. unsigned long swap_address;
  196. unsigned dumpable:1;
  197. /* Architecture-specific MM context */
  198. mm_context_t context;
  199. };
  200. extern int mmlist_nr;
  201. #define INIT_MM(name) 
  202. {  
  203. mm_rb: RB_ROOT,
  204. pgd: swapper_pg_dir, 
  205. mm_users: ATOMIC_INIT(2), 
  206. mm_count: ATOMIC_INIT(1), 
  207. mmap_sem: __RWSEM_INITIALIZER(name.mmap_sem), 
  208. page_table_lock: SPIN_LOCK_UNLOCKED, 
  209. mmlist: LIST_HEAD_INIT(name.mmlist),
  210. }
  211. struct signal_struct {
  212. atomic_t count;
  213. struct k_sigaction action[_NSIG];
  214. spinlock_t siglock;
  215. };
  216. #define INIT_SIGNALS {
  217. count: ATOMIC_INIT(1), 
  218. action: { {{0,}}, }, 
  219. siglock: SPIN_LOCK_UNLOCKED 
  220. }
  221. /*
  222.  * Some day this will be a full-fledged user tracking system..
  223.  */
  224. struct user_struct {
  225. atomic_t __count; /* reference count */
  226. atomic_t processes; /* How many processes does this user have? */
  227. atomic_t files; /* How many open files does this user have? */
  228. /* Hash table maintenance information */
  229. struct user_struct *next, **pprev;
  230. uid_t uid;
  231. };
  232. #define get_current_user() ({ 
  233. struct user_struct *__user = current->user;
  234. atomic_inc(&__user->__count);
  235. __user; })
  236. extern struct user_struct root_user;
  237. #define INIT_USER (&root_user)
  238. struct task_struct {
  239. /*
  240.  * offsets of these are hardcoded elsewhere - touch with care
  241.  */
  242. volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
  243. unsigned long flags; /* per process flags, defined below */
  244. int sigpending;
  245. mm_segment_t addr_limit; /* thread address space:
  246.   0-0xBFFFFFFF for user-thead
  247. 0-0xFFFFFFFF for kernel-thread
  248.  */
  249. struct exec_domain *exec_domain;
  250. volatile long need_resched;
  251. unsigned long ptrace;
  252. int lock_depth; /* Lock depth */
  253. /*
  254.  * offset 32 begins here on 32-bit platforms. We keep
  255.  * all fields in a single cacheline that are needed for
  256.  * the goodness() loop in schedule().
  257.  */
  258. long counter;
  259. long nice;
  260. unsigned long policy;
  261. struct mm_struct *mm;
  262. int processor;
  263. /*
  264.  * cpus_runnable is ~0 if the process is not running on any
  265.  * CPU. It's (1 << cpu) if it's running on a CPU. This mask
  266.  * is updated under the runqueue lock.
  267.  *
  268.  * To determine whether a process might run on a CPU, this
  269.  * mask is AND-ed with cpus_allowed.
  270.  */
  271. unsigned long cpus_runnable, cpus_allowed;
  272. /*
  273.  * (only the 'next' pointer fits into the cacheline, but
  274.  * that's just fine.)
  275.  */
  276. struct list_head run_list;
  277. unsigned long sleep_time;
  278. struct task_struct *next_task, *prev_task;
  279. struct mm_struct *active_mm;
  280. struct list_head local_pages;
  281. unsigned int allocation_order, nr_local_pages;
  282. /* task state */
  283. struct linux_binfmt *binfmt;
  284. int exit_code, exit_signal;
  285. int pdeath_signal;  /*  The signal sent when the parent dies  */
  286. /* ??? */
  287. unsigned long personality;
  288. int did_exec:1;
  289. pid_t pid;
  290. pid_t pgrp;
  291. pid_t tty_old_pgrp;
  292. pid_t session;
  293. pid_t tgid;
  294. /* boolean value for session group leader */
  295. int leader;
  296. /* 
  297.  * pointers to (original) parent process, youngest child, younger sibling,
  298.  * older sibling, respectively.  (p->father can be replaced with 
  299.  * p->p_pptr->pid)
  300.  */
  301. struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;
  302. struct list_head thread_group;
  303. /* PID hash table linkage. */
  304. struct task_struct *pidhash_next;
  305. struct task_struct **pidhash_pprev;
  306. wait_queue_head_t wait_chldexit; /* for wait4() */
  307. struct completion *vfork_done; /* for vfork() */
  308. unsigned long rt_priority;
  309. unsigned long it_real_value, it_prof_value, it_virt_value;
  310. unsigned long it_real_incr, it_prof_incr, it_virt_incr;
  311. struct timer_list real_timer;
  312. struct tms times;
  313. unsigned long start_time;
  314. long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];
  315. /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
  316. unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
  317. int swappable:1;
  318. /* process credentials */
  319. uid_t uid,euid,suid,fsuid;
  320. gid_t gid,egid,sgid,fsgid;
  321. int ngroups;
  322. gid_t groups[NGROUPS];
  323. kernel_cap_t   cap_effective, cap_inheritable, cap_permitted;
  324. int keep_capabilities:1;
  325. struct user_struct *user;
  326. /* limits */
  327. struct rlimit rlim[RLIM_NLIMITS];
  328. unsigned short used_math;
  329. char comm[16];
  330. /* file system info */
  331. int link_count, total_link_count;
  332. struct tty_struct *tty; /* NULL if no tty */
  333. unsigned int locks; /* How many file locks are being held */
  334. /* ipc stuff */
  335. struct sem_undo *semundo;
  336. struct sem_queue *semsleeping;
  337. /* CPU-specific state of this task */
  338. struct thread_struct thread;
  339. /* filesystem information */
  340. struct fs_struct *fs;
  341. /* open file information */
  342. struct files_struct *files;
  343. /* namespace */
  344. struct namespace *namespace;
  345. /* signal handlers */
  346. spinlock_t sigmask_lock; /* Protects signal and blocked */
  347. struct signal_struct *sig;
  348. sigset_t blocked;
  349. struct sigpending pending;
  350. unsigned long sas_ss_sp;
  351. size_t sas_ss_size;
  352. int (*notifier)(void *priv);
  353. void *notifier_data;
  354. sigset_t *notifier_mask;
  355. /* Thread group tracking */
  356.     u32 parent_exec_id;
  357.     u32 self_exec_id;
  358. /* Protection of (de-)allocation: mm, files, fs, tty */
  359. spinlock_t alloc_lock;
  360. /* journalling filesystem info */
  361. void *journal_info;
  362. };
  363. /*
  364.  * Per process flags
  365.  */
  366. #define PF_ALIGNWARN 0x00000001 /* Print alignment warning msgs */
  367. /* Not implemented yet, only for 486*/
  368. #define PF_STARTING 0x00000002 /* being created */
  369. #define PF_EXITING 0x00000004 /* getting shut down */
  370. #define PF_FORKNOEXEC 0x00000040 /* forked but didn't exec */
  371. #define PF_SUPERPRIV 0x00000100 /* used super-user privileges */
  372. #define PF_DUMPCORE 0x00000200 /* dumped core */
  373. #define PF_SIGNALED 0x00000400 /* killed by a signal */
  374. #define PF_MEMALLOC 0x00000800 /* Allocating memory */
  375. #define PF_MEMDIE 0x00001000 /* Killed for out-of-memory */
  376. #define PF_FREE_PAGES 0x00002000 /* per process page freeing */
  377. #define PF_NOIO 0x00004000 /* avoid generating further I/O */
  378. #define PF_USEDFPU 0x00100000 /* task used FPU this quantum (SMP) */
  379. /*
  380.  * Ptrace flags
  381.  */
  382. #define PT_PTRACED 0x00000001
  383. #define PT_TRACESYS 0x00000002
  384. #define PT_DTRACE 0x00000004 /* delayed trace (used on m68k, i386) */
  385. #define PT_TRACESYSGOOD 0x00000008
  386. #define PT_PTRACE_CAP 0x00000010 /* ptracer can follow suid-exec */
  387. /*
  388.  * Limit the stack by to some sane default: root can always
  389.  * increase this limit if needed..  8MB seems reasonable.
  390.  */
  391. #define _STK_LIM (8*1024*1024)
  392. #define DEF_COUNTER (10*HZ/100) /* 100 ms time slice */
  393. #define MAX_COUNTER (20*HZ/100)
  394. #define DEF_NICE (0)
  395. extern void yield(void);
  396. /*
  397.  * The default (Linux) execution domain.
  398.  */
  399. extern struct exec_domain default_exec_domain;
  400. /*
  401.  *  INIT_TASK is used to set up the first task table, touch at
  402.  * your own risk!. Base=0, limit=0x1fffff (=2MB)
  403.  */
  404. #define INIT_TASK(tsk)
  405. {
  406.     state: 0,
  407.     flags: 0,
  408.     sigpending: 0,
  409.     addr_limit: KERNEL_DS,
  410.     exec_domain: &default_exec_domain,
  411.     lock_depth: -1,
  412.     counter: DEF_COUNTER,
  413.     nice: DEF_NICE,
  414.     policy: SCHED_OTHER,
  415.     mm: NULL,
  416.     active_mm: &init_mm,
  417.     cpus_runnable: -1,
  418.     cpus_allowed: -1,
  419.     run_list: LIST_HEAD_INIT(tsk.run_list),
  420.     next_task: &tsk,
  421.     prev_task: &tsk,
  422.     p_opptr: &tsk,
  423.     p_pptr: &tsk,
  424.     thread_group: LIST_HEAD_INIT(tsk.thread_group),
  425.     wait_chldexit: __WAIT_QUEUE_HEAD_INITIALIZER(tsk.wait_chldexit),
  426.     real_timer: {
  427. function: it_real_fn
  428.     },
  429.     cap_effective: CAP_INIT_EFF_SET,
  430.     cap_inheritable: CAP_INIT_INH_SET,
  431.     cap_permitted: CAP_FULL_SET,
  432.     keep_capabilities: 0,
  433.     rlim: INIT_RLIMITS,
  434.     user: INIT_USER,
  435.     comm: "swapper",
  436.     thread: INIT_THREAD,
  437.     fs: &init_fs,
  438.     files: &init_files,
  439.     sigmask_lock: SPIN_LOCK_UNLOCKED,
  440.     sig: &init_signals,
  441.     pending: { NULL, &tsk.pending.head, {{0}}},
  442.     blocked: {{0}},
  443.     alloc_lock: SPIN_LOCK_UNLOCKED,
  444.     journal_info: NULL,
  445. }
  446. #ifndef INIT_TASK_SIZE
  447. # define INIT_TASK_SIZE 2048*sizeof(long)
  448. #endif
  449. union task_union {
  450. struct task_struct task;
  451. unsigned long stack[INIT_TASK_SIZE/sizeof(long)];
  452. };
  453. extern union task_union init_task_union;
  454. extern struct   mm_struct init_mm;
  455. extern struct task_struct *init_tasks[NR_CPUS];
  456. /* PID hashing. (shouldnt this be dynamic?) */
  457. #define PIDHASH_SZ (4096 >> 2)
  458. extern struct task_struct *pidhash[PIDHASH_SZ];
  459. #define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))
  460. static inline void hash_pid(struct task_struct *p)
  461. {
  462. struct task_struct **htable = &pidhash[pid_hashfn(p->pid)];
  463. if((p->pidhash_next = *htable) != NULL)
  464. (*htable)->pidhash_pprev = &p->pidhash_next;
  465. *htable = p;
  466. p->pidhash_pprev = htable;
  467. }
  468. static inline void unhash_pid(struct task_struct *p)
  469. {
  470. if(p->pidhash_next)
  471. p->pidhash_next->pidhash_pprev = p->pidhash_pprev;
  472. *p->pidhash_pprev = p->pidhash_next;
  473. }
  474. static inline struct task_struct *find_task_by_pid(int pid)
  475. {
  476. struct task_struct *p, **htable = &pidhash[pid_hashfn(pid)];
  477. for(p = *htable; p && p->pid != pid; p = p->pidhash_next)
  478. ;
  479. return p;
  480. }
  481. #define task_has_cpu(tsk) ((tsk)->cpus_runnable != ~0UL)
  482. static inline void task_set_cpu(struct task_struct *tsk, unsigned int cpu)
  483. {
  484. tsk->processor = cpu;
  485. tsk->cpus_runnable = 1UL << cpu;
  486. }
  487. static inline void task_release_cpu(struct task_struct *tsk)
  488. {
  489. tsk->cpus_runnable = ~0UL;
  490. }
  491. /* per-UID process charging. */
  492. extern struct user_struct * alloc_uid(uid_t);
  493. extern void free_uid(struct user_struct *);
  494. #include <asm/current.h>
  495. extern unsigned long volatile jiffies;
  496. extern unsigned long itimer_ticks;
  497. extern unsigned long itimer_next;
  498. extern struct timeval xtime;
  499. extern void do_timer(struct pt_regs *);
  500. extern unsigned int * prof_buffer;
  501. extern unsigned long prof_len;
  502. extern unsigned long prof_shift;
  503. #define CURRENT_TIME (xtime.tv_sec)
  504. extern void FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr));
  505. extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr));
  506. extern void FASTCALL(sleep_on(wait_queue_head_t *q));
  507. extern long FASTCALL(sleep_on_timeout(wait_queue_head_t *q,
  508.       signed long timeout));
  509. extern void FASTCALL(interruptible_sleep_on(wait_queue_head_t *q));
  510. extern long FASTCALL(interruptible_sleep_on_timeout(wait_queue_head_t *q,
  511.     signed long timeout));
  512. extern int FASTCALL(wake_up_process(struct task_struct * tsk));
  513. #define wake_up(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1)
  514. #define wake_up_nr(x, nr) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr)
  515. #define wake_up_all(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0)
  516. #define wake_up_sync(x) __wake_up_sync((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1)
  517. #define wake_up_sync_nr(x, nr) __wake_up_sync((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr)
  518. #define wake_up_interruptible(x) __wake_up((x),TASK_INTERRUPTIBLE, 1)
  519. #define wake_up_interruptible_nr(x, nr) __wake_up((x),TASK_INTERRUPTIBLE, nr)
  520. #define wake_up_interruptible_all(x) __wake_up((x),TASK_INTERRUPTIBLE, 0)
  521. #define wake_up_interruptible_sync(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)
  522. #define wake_up_interruptible_sync_nr(x, nr) __wake_up_sync((x),TASK_INTERRUPTIBLE,  nr)
  523. asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru);
  524. extern int in_group_p(gid_t);
  525. extern int in_egroup_p(gid_t);
  526. extern void proc_caches_init(void);
  527. extern void flush_signals(struct task_struct *);
  528. extern void flush_signal_handlers(struct task_struct *);
  529. extern void sig_exit(int, int, struct siginfo *);
  530. extern int dequeue_signal(sigset_t *, siginfo_t *);
  531. extern void block_all_signals(int (*notifier)(void *priv), void *priv,
  532.       sigset_t *mask);
  533. extern void unblock_all_signals(void);
  534. extern int send_sig_info(int, struct siginfo *, struct task_struct *);
  535. extern int force_sig_info(int, struct siginfo *, struct task_struct *);
  536. extern int kill_pg_info(int, struct siginfo *, pid_t);
  537. extern int kill_sl_info(int, struct siginfo *, pid_t);
  538. extern int kill_proc_info(int, struct siginfo *, pid_t);
  539. extern void notify_parent(struct task_struct *, int);
  540. extern void do_notify_parent(struct task_struct *, int);
  541. extern void force_sig(int, struct task_struct *);
  542. extern int send_sig(int, struct task_struct *, int);
  543. extern int kill_pg(pid_t, int, int);
  544. extern int kill_sl(pid_t, int, int);
  545. extern int kill_proc(pid_t, int, int);
  546. extern int do_sigaction(int, const struct k_sigaction *, struct k_sigaction *);
  547. extern int do_sigaltstack(const stack_t *, stack_t *, unsigned long);
  548. static inline int signal_pending(struct task_struct *p)
  549. {
  550. return (p->sigpending != 0);
  551. }
  552. /*
  553.  * Re-calculate pending state from the set of locally pending
  554.  * signals, globally pending signals, and blocked signals.
  555.  */
  556. static inline int has_pending_signals(sigset_t *signal, sigset_t *blocked)
  557. {
  558. unsigned long ready;
  559. long i;
  560. switch (_NSIG_WORDS) {
  561. default:
  562. for (i = _NSIG_WORDS, ready = 0; --i >= 0 ;)
  563. ready |= signal->sig[i] &~ blocked->sig[i];
  564. break;
  565. case 4: ready  = signal->sig[3] &~ blocked->sig[3];
  566. ready |= signal->sig[2] &~ blocked->sig[2];
  567. ready |= signal->sig[1] &~ blocked->sig[1];
  568. ready |= signal->sig[0] &~ blocked->sig[0];
  569. break;
  570. case 2: ready  = signal->sig[1] &~ blocked->sig[1];
  571. ready |= signal->sig[0] &~ blocked->sig[0];
  572. break;
  573. case 1: ready  = signal->sig[0] &~ blocked->sig[0];
  574. }
  575. return ready != 0;
  576. }
  577. /* Reevaluate whether the task has signals pending delivery.
  578.    This is required every time the blocked sigset_t changes.
  579.    All callers should have t->sigmask_lock.  */
  580. static inline void recalc_sigpending(struct task_struct *t)
  581. {
  582. t->sigpending = has_pending_signals(&t->pending.signal, &t->blocked);
  583. }
  584. /* True if we are on the alternate signal stack.  */
  585. static inline int on_sig_stack(unsigned long sp)
  586. {
  587. return (sp - current->sas_ss_sp < current->sas_ss_size);
  588. }
  589. static inline int sas_ss_flags(unsigned long sp)
  590. {
  591. return (current->sas_ss_size == 0 ? SS_DISABLE
  592. : on_sig_stack(sp) ? SS_ONSTACK : 0);
  593. }
  594. extern int request_irq(unsigned int,
  595.        void (*handler)(int, void *, struct pt_regs *),
  596.        unsigned long, const char *, void *);
  597. extern void free_irq(unsigned int, void *);
  598. /*
  599.  * This has now become a routine instead of a macro, it sets a flag if
  600.  * it returns true (to do BSD-style accounting where the process is flagged
  601.  * if it uses root privs). The implication of this is that you should do
  602.  * normal permissions checks first, and check suser() last.
  603.  *
  604.  * [Dec 1997 -- Chris Evans]
  605.  * For correctness, the above considerations need to be extended to
  606.  * fsuser(). This is done, along with moving fsuser() checks to be
  607.  * last.
  608.  *
  609.  * These will be removed, but in the mean time, when the SECURE_NOROOT 
  610.  * flag is set, uids don't grant privilege.
  611.  */
  612. static inline int suser(void)
  613. {
  614. if (!issecure(SECURE_NOROOT) && current->euid == 0) { 
  615. current->flags |= PF_SUPERPRIV;
  616. return 1;
  617. }
  618. return 0;
  619. }
  620. static inline int fsuser(void)
  621. {
  622. if (!issecure(SECURE_NOROOT) && current->fsuid == 0) {
  623. current->flags |= PF_SUPERPRIV;
  624. return 1;
  625. }
  626. return 0;
  627. }
  628. /*
  629.  * capable() checks for a particular capability.  
  630.  * New privilege checks should use this interface, rather than suser() or
  631.  * fsuser(). See include/linux/capability.h for defined capabilities.
  632.  */
  633. static inline int capable(int cap)
  634. {
  635. #if 1 /* ok now */
  636. if (cap_raised(current->cap_effective, cap))
  637. #else
  638. if (cap_is_fs_cap(cap) ? current->fsuid == 0 : current->euid == 0)
  639. #endif
  640. {
  641. current->flags |= PF_SUPERPRIV;
  642. return 1;
  643. }
  644. return 0;
  645. }
  646. /*
  647.  * Routines for handling mm_structs
  648.  */
  649. extern struct mm_struct * mm_alloc(void);
  650. extern struct mm_struct * start_lazy_tlb(void);
  651. extern void end_lazy_tlb(struct mm_struct *mm);
  652. /* mmdrop drops the mm and the page tables */
  653. extern inline void FASTCALL(__mmdrop(struct mm_struct *));
  654. static inline void mmdrop(struct mm_struct * mm)
  655. {
  656. if (atomic_dec_and_test(&mm->mm_count))
  657. __mmdrop(mm);
  658. }
  659. /* mmput gets rid of the mappings and all user-space */
  660. extern void mmput(struct mm_struct *);
  661. /* Remove the current tasks stale references to the old mm_struct */
  662. extern void mm_release(void);
  663. /*
  664.  * Routines for handling the fd arrays
  665.  */
  666. extern struct file ** alloc_fd_array(int);
  667. extern int expand_fd_array(struct files_struct *, int nr);
  668. extern void free_fd_array(struct file **, int);
  669. extern fd_set *alloc_fdset(int);
  670. extern int expand_fdset(struct files_struct *, int nr);
  671. extern void free_fdset(fd_set *, int);
  672. extern int  copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *);
  673. extern void flush_thread(void);
  674. extern void exit_thread(void);
  675. extern void exit_mm(struct task_struct *);
  676. extern void exit_files(struct task_struct *);
  677. extern void exit_sighand(struct task_struct *);
  678. extern void reparent_to_init(void);
  679. extern void daemonize(void);
  680. extern int do_execve(char *, char **, char **, struct pt_regs *);
  681. extern int do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long);
  682. extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
  683. extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
  684. extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
  685. #define __wait_event(wq, condition) 
  686. do {
  687. wait_queue_t __wait;
  688. init_waitqueue_entry(&__wait, current);
  689. add_wait_queue(&wq, &__wait);
  690. for (;;) {
  691. set_current_state(TASK_UNINTERRUPTIBLE);
  692. if (condition)
  693. break;
  694. schedule();
  695. }
  696. current->state = TASK_RUNNING;
  697. remove_wait_queue(&wq, &__wait);
  698. } while (0)
  699. #define wait_event(wq, condition) 
  700. do {
  701. if (condition)  
  702. break;
  703. __wait_event(wq, condition);
  704. } while (0)
  705. #define __wait_event_interruptible(wq, condition, ret)
  706. do {
  707. wait_queue_t __wait;
  708. init_waitqueue_entry(&__wait, current);
  709. add_wait_queue(&wq, &__wait);
  710. for (;;) {
  711. set_current_state(TASK_INTERRUPTIBLE);
  712. if (condition)
  713. break;
  714. if (!signal_pending(current)) {
  715. schedule();
  716. continue;
  717. }
  718. ret = -ERESTARTSYS;
  719. break;
  720. }
  721. current->state = TASK_RUNNING;
  722. remove_wait_queue(&wq, &__wait);
  723. } while (0)
  724. #define wait_event_interruptible(wq, condition)
  725. ({
  726. int __ret = 0;
  727. if (!(condition))
  728. __wait_event_interruptible(wq, condition, __ret);
  729. __ret;
  730. })
  731. #define REMOVE_LINKS(p) do { 
  732. (p)->next_task->prev_task = (p)->prev_task; 
  733. (p)->prev_task->next_task = (p)->next_task; 
  734. if ((p)->p_osptr) 
  735. (p)->p_osptr->p_ysptr = (p)->p_ysptr; 
  736. if ((p)->p_ysptr) 
  737. (p)->p_ysptr->p_osptr = (p)->p_osptr; 
  738. else 
  739. (p)->p_pptr->p_cptr = (p)->p_osptr; 
  740. } while (0)
  741. #define SET_LINKS(p) do { 
  742. (p)->next_task = &init_task; 
  743. (p)->prev_task = init_task.prev_task; 
  744. init_task.prev_task->next_task = (p); 
  745. init_task.prev_task = (p); 
  746. (p)->p_ysptr = NULL; 
  747. if (((p)->p_osptr = (p)->p_pptr->p_cptr) != NULL) 
  748. (p)->p_osptr->p_ysptr = p; 
  749. (p)->p_pptr->p_cptr = p; 
  750. } while (0)
  751. #define for_each_task(p) 
  752. for (p = &init_task ; (p = p->next_task) != &init_task ; )
  753. #define for_each_thread(task) 
  754. for (task = next_thread(current) ; task != current ; task = next_thread(task))
  755. #define next_thread(p) 
  756. list_entry((p)->thread_group.next, struct task_struct, thread_group)
  757. #define thread_group_leader(p) (p->pid == p->tgid)
  758. static inline void del_from_runqueue(struct task_struct * p)
  759. {
  760. nr_running--;
  761. p->sleep_time = jiffies;
  762. list_del(&p->run_list);
  763. p->run_list.next = NULL;
  764. }
  765. static inline int task_on_runqueue(struct task_struct *p)
  766. {
  767. return (p->run_list.next != NULL);
  768. }
  769. static inline void unhash_process(struct task_struct *p)
  770. {
  771. if (task_on_runqueue(p))
  772. out_of_line_bug();
  773. write_lock_irq(&tasklist_lock);
  774. nr_threads--;
  775. unhash_pid(p);
  776. REMOVE_LINKS(p);
  777. list_del(&p->thread_group);
  778. write_unlock_irq(&tasklist_lock);
  779. }
  780. /* Protects ->fs, ->files, ->mm, and synchronises with wait4().  Nests inside tasklist_lock */
  781. static inline void task_lock(struct task_struct *p)
  782. {
  783. spin_lock(&p->alloc_lock);
  784. }
  785. static inline void task_unlock(struct task_struct *p)
  786. {
  787. spin_unlock(&p->alloc_lock);
  788. }
  789. /* write full pathname into buffer and return start of pathname */
  790. static inline char * d_path(struct dentry *dentry, struct vfsmount *vfsmnt,
  791. char *buf, int buflen)
  792. {
  793. char *res;
  794. struct vfsmount *rootmnt;
  795. struct dentry *root;
  796. read_lock(&current->fs->lock);
  797. rootmnt = mntget(current->fs->rootmnt);
  798. root = dget(current->fs->root);
  799. read_unlock(&current->fs->lock);
  800. spin_lock(&dcache_lock);
  801. res = __d_path(dentry, vfsmnt, root, rootmnt, buf, buflen);
  802. spin_unlock(&dcache_lock);
  803. dput(root);
  804. mntput(rootmnt);
  805. return res;
  806. }
  807. static inline int need_resched(void)
  808. {
  809. return (unlikely(current->need_resched));
  810. }
  811. extern void __cond_resched(void);
  812. static inline void cond_resched(void)
  813. {
  814. if (need_resched())
  815. __cond_resched();
  816. }
  817. #endif /* __KERNEL__ */
  818. #endif