sched.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:27k
源码类别:

嵌入式Linux

开发平台:

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