vserver 1.9.3
[linux-2.6.git] / include / linux / sched.h
index 7fc52d7..a4e287f 100644 (file)
@@ -40,7 +40,6 @@ struct exec_domain;
 #define CLONE_FS       0x00000200      /* set if fs info shared between processes */
 #define CLONE_FILES    0x00000400      /* set if open files shared between processes */
 #define CLONE_SIGHAND  0x00000800      /* set if signal handlers and blocked signals shared */
-#define CLONE_IDLETASK 0x00001000      /* set if new pid should be 0 (kernel only)*/
 #define CLONE_PTRACE   0x00002000      /* set if we want to let tracing continue on the child too */
 #define CLONE_VFORK    0x00004000      /* set if the parent wants the child to wake it up on mm_release */
 #define CLONE_PARENT   0x00008000      /* set if we want to have the same parent as the cloner */
@@ -102,15 +101,15 @@ extern unsigned long nr_iowait(void);
 #include <linux/timer.h>
 
 #include <asm/processor.h>
-#include <linux/vserver/context.h>
 
 #define TASK_RUNNING           0
 #define TASK_INTERRUPTIBLE     1
 #define TASK_UNINTERRUPTIBLE   2
 #define TASK_STOPPED           4
-#define TASK_ZOMBIE            8
-#define TASK_DEAD              16
-#define TASK_ONHOLD            32
+#define TASK_TRACED            8
+#define TASK_ZOMBIE            16
+#define TASK_DEAD              32
+#define TASK_ONHOLD            64
 
 #define __set_task_state(tsk, state_value)             \
        do { (tsk)->state = (state_value); } while (0)
@@ -191,10 +190,26 @@ extern int sysctl_max_map_count;
 
 #include <linux/aio.h>
 
+extern unsigned long
+arch_get_unmapped_area(struct file *, unsigned long, unsigned long,
+                      unsigned long, unsigned long);
+extern unsigned long
+arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
+                         unsigned long len, unsigned long pgoff,
+                         unsigned long flags);
+extern void arch_unmap_area(struct vm_area_struct *area);
+extern void arch_unmap_area_topdown(struct vm_area_struct *area);
+
+
 struct mm_struct {
        struct vm_area_struct * mmap;           /* list of VMAs */
        struct rb_root mm_rb;
        struct vm_area_struct * mmap_cache;     /* last find_vma result */
+       unsigned long (*get_unmapped_area) (struct file *filp,
+                               unsigned long addr, unsigned long len,
+                               unsigned long pgoff, unsigned long flags);
+       void (*unmap_area) (struct vm_area_struct *area);
+       unsigned long mmap_base;                /* base of mmap area */
        unsigned long free_area_cache;          /* first hole */
        pgd_t * pgd;
        atomic_t mm_users;                      /* How many users with user space? */
@@ -211,10 +226,10 @@ struct mm_struct {
        unsigned long start_code, end_code, start_data, end_data;
        unsigned long start_brk, brk, start_stack;
        unsigned long arg_start, arg_end, env_start, env_end;
-       unsigned long rss, total_vm, locked_vm;
-       unsigned long def_flags;
+       unsigned long rss, total_vm, locked_vm, shared_vm;
+       unsigned long exec_vm, stack_vm, reserved_vm, def_flags;
 
-       unsigned long saved_auxv[40]; /* for /proc/PID/auxv */
+       unsigned long saved_auxv[42]; /* for /proc/PID/auxv */
 
        unsigned dumpable:1;
        cpumask_t cpu_vm_mask;
@@ -223,6 +238,10 @@ struct mm_struct {
        mm_context_t context;
        struct vx_info *mm_vx_info;
 
+       /* Token based thrashing protection. */
+       unsigned long swap_token_time;
+       char recent_pagein;
+
        /* coredumping support */
        int core_waiters;
        struct completion *core_startup_done, core_done;
@@ -271,6 +290,8 @@ struct signal_struct {
 
        /* thread group stop support, overloads group_exit_code too */
        int                     group_stop_count;
+       /* 1 if group stopped since last SIGCONT, -1 if SIGCONT since report */
+       int                     stop_state;
 
        /* POSIX.1b Interval Timers */
        struct list_head posix_timers;
@@ -283,6 +304,16 @@ struct signal_struct {
        int leader;
 
        struct tty_struct *tty; /* NULL if no tty */
+
+       /*
+        * Cumulative resource counters for dead threads in the group,
+        * and for reaped dead child processes forked by this group.
+        * Live threads maintain their own counters and add to these
+        * in __exit_signal, except for the group leader.
+        */
+       unsigned long utime, stime, cutime, cstime;
+       unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;
+       unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt;
 };
 
 /*
@@ -303,7 +334,7 @@ struct signal_struct {
 
 #define MAX_PRIO               (MAX_RT_PRIO + 40)
 
-#define rt_task(p)             ((p)->prio < MAX_RT_PRIO)
+#define rt_task(p)             (unlikely((p)->prio < MAX_RT_PRIO))
 
 /*
  * Some day this will be a full-fledged user tracking system..
@@ -315,6 +346,7 @@ struct user_struct {
        atomic_t sigpending;    /* How many pending signals does this user have? */
        /* protected by mq_lock */
        unsigned long mq_bytes; /* How many bytes can be allocated to mqueue? */
+       unsigned long locked_shm; /* How many pages of mlocked shm ? */
 
        /* Hash table maintenance information */
        struct list_head uidhash_list;
@@ -351,6 +383,20 @@ struct k_itimer {
        struct timespec wall_to_prev;   /* wall_to_monotonic used when set */
 };
 
+#ifdef CONFIG_SCHEDSTATS
+struct sched_info {
+       /* cumulative counters */
+       unsigned long   cpu_time,       /* time spent on the cpu */
+                       run_delay,      /* time spent waiting on a runqueue */
+                       pcnt;           /* # of timeslices run on this cpu */
+
+       /* timestamps */
+       unsigned long   last_arrival,   /* when we last ran on a cpu */
+                       last_queued;    /* when we were last queued to run */
+};
+
+extern struct file_operations proc_schedstat_operations;
+#endif
 
 struct io_context;                     /* See blkdev.h */
 void exit_io_context(void);
@@ -406,13 +452,17 @@ struct task_struct {
 
        unsigned long sleep_avg;
        long interactive_credit;
-       unsigned long long timestamp;
+       unsigned long long timestamp, last_ran;
        int activated;
 
        unsigned long policy;
        cpumask_t cpus_allowed;
        unsigned int time_slice, first_time_slice;
 
+#ifdef CONFIG_SCHEDSTATS
+       struct sched_info sched_info;
+#endif
+
        struct list_head tasks;
        /*
         * ptrace_list/ptrace_children forms the list of my children
@@ -429,7 +479,7 @@ struct task_struct {
        int pdeath_signal;  /*  The signal sent when the parent dies  */
        /* ??? */
        unsigned long personality;
-       int did_exec:1;
+       unsigned did_exec:1;
        pid_t pid;
        pid_t tgid;
        /* 
@@ -448,7 +498,7 @@ struct task_struct {
        struct task_struct *group_leader;       /* threadgroup leader */
 
        /* PID/PID hash table linkage. */
-       struct pid_link pids[PIDTYPE_MAX];
+       struct pid pids[PIDTYPE_MAX];
 
        wait_queue_head_t wait_chldexit;        /* for wait4() */
        struct completion *vfork_done;          /* for vfork() */
@@ -459,17 +509,17 @@ struct task_struct {
        unsigned long it_real_value, it_prof_value, it_virt_value;
        unsigned long it_real_incr, it_prof_incr, it_virt_incr;
        struct timer_list real_timer;
-       unsigned long utime, stime, cutime, cstime;
-       unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; /* context switch counts */
-       u64 start_time;
+       unsigned long utime, stime;
+       unsigned long nvcsw, nivcsw; /* context switch counts */
+       struct timespec start_time;
 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
-       unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt;
+       unsigned long min_flt, maj_flt;
 /* process credentials */
        uid_t uid,euid,suid,fsuid;
        gid_t gid,egid,sgid,fsgid;
        struct group_info *group_info;
        kernel_cap_t   cap_effective, cap_inheritable, cap_permitted;
-       int keep_capabilities:1;
+       unsigned keep_capabilities:1;
        struct user_struct *user;
 /* limits */
        struct rlimit rlim[RLIM_NLIMITS];
@@ -534,7 +584,13 @@ struct task_struct {
 
        unsigned long ptrace_message;
        siginfo_t *last_siginfo; /* For ptrace use.  */
-
+/*
+ * current io wait handle: wait queue entry to use for io waits
+ * If this thread is processing aio, this points at the waitqueue
+ * inside the currently handled kiocb. It may be NULL (i.e. default
+ * to a stack based synchronous wait) if its doing sync IO.
+ */
+       wait_queue_t *io_wait;
 #ifdef CONFIG_NUMA
        struct mempolicy *mempolicy;
        short il_next;          /* could be shared with used_math */
@@ -546,6 +602,7 @@ static inline pid_t process_group(struct task_struct *tsk)
        return tsk->signal->pgrp;
 }
 
+extern void free_task(struct task_struct *tsk);
 extern void __put_task_struct(struct task_struct *tsk);
 #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
 #define put_task_struct(tsk) \
@@ -577,118 +634,6 @@ do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } while(0)
 #define PF_SYNCWRITE   0x00200000      /* I am doing a sync write */
 
 #ifdef CONFIG_SMP
-#define SCHED_LOAD_SCALE       128UL   /* increase resolution of load */
-
-#define SD_BALANCE_NEWIDLE     1       /* Balance when about to become idle */
-#define SD_BALANCE_EXEC                2       /* Balance on exec */
-#define SD_BALANCE_CLONE       4       /* Balance on clone */
-#define SD_WAKE_IDLE           8       /* Wake to idle CPU on task wakeup */
-#define SD_WAKE_AFFINE         16      /* Wake task to waking CPU */
-#define SD_WAKE_BALANCE                32      /* Perform balancing at task wakeup */
-#define SD_SHARE_CPUPOWER      64      /* Domain members share cpu power */
-
-struct sched_group {
-       struct sched_group *next;       /* Must be a circular list */
-       cpumask_t cpumask;
-
-       /*
-        * CPU power of this group, SCHED_LOAD_SCALE being max power for a
-        * single CPU. This should be read only (except for setup). Although
-        * it will need to be written to at cpu hot(un)plug time, perhaps the
-        * cpucontrol semaphore will provide enough exclusion?
-        */
-       unsigned long cpu_power;
-};
-
-struct sched_domain {
-       /* These fields must be setup */
-       struct sched_domain *parent;    /* top domain must be null terminated */
-       struct sched_group *groups;     /* the balancing groups of the domain */
-       cpumask_t span;                 /* span of all CPUs in this domain */
-       unsigned long min_interval;     /* Minimum balance interval ms */
-       unsigned long max_interval;     /* Maximum balance interval ms */
-       unsigned int busy_factor;       /* less balancing by factor if busy */
-       unsigned int imbalance_pct;     /* No balance until over watermark */
-       unsigned long long cache_hot_time; /* Task considered cache hot (ns) */
-       unsigned int cache_nice_tries;  /* Leave cache hot tasks for # tries */
-       unsigned int per_cpu_gain;      /* CPU % gained by adding domain cpus */
-       int flags;                      /* See SD_* */
-
-       /* Runtime fields. */
-       unsigned long last_balance;     /* init to jiffies. units in jiffies */
-       unsigned int balance_interval;  /* initialise to 1. units in ms. */
-       unsigned int nr_balance_failed; /* initialise to 0 */
-};
-
-/* Common values for SMT siblings */
-#define SD_SIBLING_INIT (struct sched_domain) {                \
-       .span                   = CPU_MASK_NONE,        \
-       .parent                 = NULL,                 \
-       .groups                 = NULL,                 \
-       .min_interval           = 1,                    \
-       .max_interval           = 2,                    \
-       .busy_factor            = 8,                    \
-       .imbalance_pct          = 110,                  \
-       .cache_hot_time         = 0,                    \
-       .cache_nice_tries       = 0,                    \
-       .per_cpu_gain           = 15,                   \
-       .flags                  = SD_BALANCE_NEWIDLE    \
-                               | SD_BALANCE_EXEC       \
-                               | SD_BALANCE_CLONE      \
-                               | SD_WAKE_AFFINE        \
-                               | SD_WAKE_IDLE          \
-                               | SD_SHARE_CPUPOWER,    \
-       .last_balance           = jiffies,              \
-       .balance_interval       = 1,                    \
-       .nr_balance_failed      = 0,                    \
-}
-
-/* Common values for CPUs */
-#define SD_CPU_INIT (struct sched_domain) {            \
-       .span                   = CPU_MASK_NONE,        \
-       .parent                 = NULL,                 \
-       .groups                 = NULL,                 \
-       .min_interval           = 1,                    \
-       .max_interval           = 4,                    \
-       .busy_factor            = 64,                   \
-       .imbalance_pct          = 125,                  \
-       .cache_hot_time         = (5*1000000/2),        \
-       .cache_nice_tries       = 1,                    \
-       .per_cpu_gain           = 100,                  \
-       .flags                  = SD_BALANCE_NEWIDLE    \
-                               | SD_BALANCE_EXEC       \
-                               | SD_BALANCE_CLONE      \
-                               | SD_WAKE_AFFINE        \
-                               | SD_WAKE_BALANCE,      \
-       .last_balance           = jiffies,              \
-       .balance_interval       = 1,                    \
-       .nr_balance_failed      = 0,                    \
-}
-
-#ifdef CONFIG_NUMA
-/* Common values for NUMA nodes */
-#define SD_NODE_INIT (struct sched_domain) {           \
-       .span                   = CPU_MASK_NONE,        \
-       .parent                 = NULL,                 \
-       .groups                 = NULL,                 \
-       .min_interval           = 8,                    \
-       .max_interval           = 32,                   \
-       .busy_factor            = 32,                   \
-       .imbalance_pct          = 125,                  \
-       .cache_hot_time         = (10*1000000),         \
-       .cache_nice_tries       = 1,                    \
-       .per_cpu_gain           = 100,                  \
-       .flags                  = SD_BALANCE_EXEC       \
-                               | SD_BALANCE_CLONE      \
-                               | SD_WAKE_BALANCE,      \
-       .last_balance           = jiffies,              \
-       .balance_interval       = 1,                    \
-       .nr_balance_failed      = 0,                    \
-}
-#endif
-
-extern void cpu_attach_domain(struct sched_domain *sd, int cpu);
-
 extern int set_cpus_allowed(task_t *p, cpumask_t new_mask);
 #else
 static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask)
@@ -699,10 +644,11 @@ static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask)
 
 extern unsigned long long sched_clock(void);
 
+/* sched_exec is called by processes performing an exec */
 #ifdef CONFIG_SMP
-extern void sched_balance_exec(void);
+extern void sched_exec(void);
 #else
-#define sched_balance_exec()   {}
+#define sched_exec()   {}
 #endif
 
 extern void sched_idle_next(void);
@@ -739,7 +685,14 @@ extern struct task_struct init_task;
 
 extern struct   mm_struct init_mm;
 
-extern struct task_struct *find_task_by_pid(int pid);
+
+#define find_task_by_real_pid(nr) \
+       find_task_by_pid_type(PIDTYPE_PID, nr)
+#define find_task_by_pid(nr) \
+       find_task_by_pid_type(PIDTYPE_PID, \
+               vx_rmap_pid(nr))
+
+extern struct task_struct *find_task_by_pid_type(int type, int pid);
 extern void set_special_pids(pid_t session, pid_t pgrp);
 extern void __set_special_pids(pid_t session, pid_t pgrp);
 
@@ -761,16 +714,12 @@ extern void do_timer(struct pt_regs *);
 
 extern int FASTCALL(wake_up_state(struct task_struct * tsk, unsigned int state));
 extern int FASTCALL(wake_up_process(struct task_struct * tsk));
-extern void FASTCALL(wake_up_forked_process(struct task_struct * tsk));
+extern void FASTCALL(wake_up_new_task(struct task_struct * tsk,
+                                               unsigned long clone_flags));
 #ifdef CONFIG_SMP
  extern void kick_process(struct task_struct *tsk);
- extern void FASTCALL(wake_up_forked_thread(struct task_struct * tsk));
 #else
  static inline void kick_process(struct task_struct *tsk) { }
- static inline void wake_up_forked_thread(struct task_struct * tsk)
- {
-       wake_up_forked_process(tsk);
- }
 #endif
 extern void FASTCALL(sched_fork(task_t * p));
 extern void FASTCALL(sched_exit(task_t * p));
@@ -801,12 +750,12 @@ extern void unblock_all_signals(void);
 extern void release_task(struct task_struct * p);
 extern int send_sig_info(int, struct siginfo *, struct task_struct *);
 extern int send_group_sig_info(int, struct siginfo *, struct task_struct *);
+extern int force_sigsegv(int, struct task_struct *);
 extern int force_sig_info(int, struct siginfo *, struct task_struct *);
 extern int __kill_pg_info(int sig, struct siginfo *info, pid_t pgrp);
 extern int kill_pg_info(int, struct siginfo *, pid_t);
 extern int kill_sl_info(int, struct siginfo *, pid_t);
 extern int kill_proc_info(int, struct siginfo *, pid_t);
-extern void notify_parent(struct task_struct *, int);
 extern void do_notify_parent(struct task_struct *, int);
 extern void force_sig(int, struct task_struct *);
 extern void force_sig_specific(int, struct task_struct *);
@@ -870,8 +819,8 @@ static inline void mmdrop(struct mm_struct * mm)
 
 /* mmput gets rid of the mappings and all user-space */
 extern void mmput(struct mm_struct *);
-/* Grab a reference to the mm if its not already going away */
-extern struct mm_struct *mmgrab(struct mm_struct *);
+/* Grab a reference to a task's mm, if it is not already going away */
+extern struct mm_struct *get_task_mm(struct task_struct *task);
 /* Remove the current tasks stale references to the old mm_struct */
 extern void mm_release(struct task_struct *, struct mm_struct *);
 
@@ -897,7 +846,10 @@ extern task_t *child_reaper;
 
 extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *);
 extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *);
-extern struct task_struct * copy_process(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *);
+task_t *fork_idle(int);
+
+extern void set_task_comm(struct task_struct *tsk, char *from);
+extern void get_task_comm(char *to, struct task_struct *tsk);
 
 #ifdef CONFIG_SMP
 extern void wait_task_inactive(task_t * p);
@@ -942,9 +894,7 @@ extern task_t * FASTCALL(next_thread(const task_t *p));
 
 static inline int thread_group_empty(task_t *p)
 {
-       struct pid *pid = p->pids[PIDTYPE_TGID].pidptr;
-
-       return pid->task_list.next->next == &pid->task_list;
+       return list_empty(&p->pids[PIDTYPE_TGID].pid_list);
 }
 
 #define delay_group_leader(p) \
@@ -953,8 +903,8 @@ static inline int thread_group_empty(task_t *p)
 extern void unhash_process(struct task_struct *p);
 
 /*
- * Protects ->fs, ->files, ->mm, ->ptrace, ->group_info and synchronises with
- * wait4().
+ * Protects ->fs, ->files, ->mm, ->ptrace, ->group_info, ->comm and
+ * synchronises with wait4().
  *
  * Nests both inside and outside of read_lock(&tasklist_lock).
  * It must not be nested with write_lock_irq(&tasklist_lock),
@@ -969,27 +919,7 @@ static inline void task_unlock(struct task_struct *p)
 {
        spin_unlock(&p->alloc_lock);
 }
-/**
- * get_task_mm - acquire a reference to the task's mm
- *
- * Returns %NULL if the task has no mm. User must release
- * the mm via mmput() after use.
- */
-static inline struct mm_struct * get_task_mm(struct task_struct * task)
-{
-       struct mm_struct * mm;
-       task_lock(task);
-       mm = task->mm;
-       if (mm)
-               mm = mmgrab(mm);
-       task_unlock(task);
-
-       return mm;
-}
+
 /* set thread flags in other task's structures
  * - see asm/thread_info.h for TIF_xxxx flags available
  */
@@ -1100,6 +1030,20 @@ static inline void set_task_cpu(struct task_struct *p, unsigned int cpu)
 
 #endif /* CONFIG_SMP */
 
+#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
+extern void arch_pick_mmap_layout(struct mm_struct *mm);
+#else
+static inline void arch_pick_mmap_layout(struct mm_struct *mm)
+{
+       mm->mmap_base = TASK_UNMAPPED_BASE;
+       mm->get_unmapped_area = arch_get_unmapped_area;
+       mm->unmap_area = arch_unmap_area;
+}
+#endif
+
+extern long sched_setaffinity(pid_t pid, cpumask_t new_mask);
+extern long sched_getaffinity(pid_t pid, cpumask_t *mask);
+
 #endif /* __KERNEL__ */
 
 #endif