]> nv-tegra.nvidia Code Review - linux-2.6.git/commitdiff
Merge branch 'linus' into sched/core
authorIngo Molnar <mingo@elte.hu>
Mon, 29 Jun 2009 07:16:13 +0000 (09:16 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 29 Jun 2009 07:16:25 +0000 (09:16 +0200)
Merge reason: we will merge a dependent patch.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
1  2 
include/linux/sched.h
kernel/sched.c

diff --combined include/linux/sched.h
index d4a2c6662f7d3ae2184cbaf31f596fe766347afa,4d075426988428820aae1f451015744bc2e50440..5ba2c377bb5a7666e336074aae874a0c3c9679c6
@@@ -38,8 -38,6 +38,8 @@@
  #define SCHED_BATCH           3
  /* SCHED_ISO: reserved but not implemented yet */
  #define SCHED_IDLE            5
 +/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
 +#define SCHED_RESET_ON_FORK     0x40000000
  
  #ifdef __KERNEL__
  
@@@ -94,7 -92,6 +94,6 @@@ struct sched_param 
  
  #include <asm/processor.h>
  
- struct mem_cgroup;
  struct exec_domain;
  struct futex_pi_state;
  struct robust_list_head;
@@@ -263,6 -260,7 +262,7 @@@ extern void task_rq_unlock_wait(struct 
  extern cpumask_var_t nohz_cpu_mask;
  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)
  extern int select_nohz_load_balancer(int cpu);
+ extern int get_nohz_load_balancer(void);
  #else
  static inline int select_nohz_load_balancer(int cpu)
  {
@@@ -675,7 -673,7 +675,7 @@@ struct user_struct 
        struct task_group *tg;
  #ifdef CONFIG_SYSFS
        struct kobject kobj;
-       struct work_struct work;
+       struct delayed_work work;
  #endif
  #endif
  
@@@ -1179,7 -1177,6 +1179,6 @@@ struct task_struct 
         * a short time
         */
        unsigned char fpu_counter;
-       s8 oomkilladj; /* OOM kill score adjustment (bit shift). */
  #ifdef CONFIG_BLK_DEV_IO_TRACE
        unsigned int btrace_seq;
  #endif
        unsigned did_exec:1;
        unsigned in_execve:1;   /* Tell the LSMs that the process is doing an
                                 * execve */
 +
 +      /* Revert to default priority/policy when forking */
 +      unsigned sched_reset_on_fork:1;
 +
        pid_t pid;
        pid_t tgid;
  
  /* Thread group tracking */
        u32 parent_exec_id;
        u32 self_exec_id;
- /* Protection of (de-)allocation: mm, files, fs, tty, keyrings */
+ /* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed,
+  * mempolicy */
        spinlock_t alloc_lock;
  
  #ifdef CONFIG_GENERIC_HARDIRQS
        cputime_t acct_timexpd; /* stime + utime since last update */
  #endif
  #ifdef CONFIG_CPUSETS
-       nodemask_t mems_allowed;
-       int cpuset_mems_generation;
+       nodemask_t mems_allowed;        /* Protected by alloc_lock */
        int cpuset_mem_spread_rotor;
  #endif
  #ifdef CONFIG_CGROUPS
        struct list_head perf_counter_list;
  #endif
  #ifdef CONFIG_NUMA
-       struct mempolicy *mempolicy;
+       struct mempolicy *mempolicy;    /* Protected by alloc_lock */
        short il_next;
  #endif
        atomic_t fs_excl;       /* holding fs exclusive resources */
@@@ -1802,11 -1795,23 +1801,23 @@@ extern unsigned int sysctl_sched_child_
  extern unsigned int sysctl_sched_features;
  extern unsigned int sysctl_sched_migration_cost;
  extern unsigned int sysctl_sched_nr_migrate;
+ extern unsigned int sysctl_timer_migration;
  
  int sched_nr_latency_handler(struct ctl_table *table, int write,
                struct file *file, void __user *buffer, size_t *length,
                loff_t *ppos);
  #endif
+ #ifdef CONFIG_SCHED_DEBUG
+ static inline unsigned int get_sysctl_timer_migration(void)
+ {
+       return sysctl_timer_migration;
+ }
+ #else
+ static inline unsigned int get_sysctl_timer_migration(void)
+ {
+       return 1;
+ }
+ #endif
  extern unsigned int sysctl_sched_rt_period;
  extern int sysctl_sched_rt_runtime;
  
@@@ -1873,9 -1878,6 +1884,6 @@@ extern struct pid_namespace init_pid_ns
  /*
   * find a task by one of its numerical ids
   *
-  * find_task_by_pid_type_ns():
-  *      it is the most generic call - it finds a task by all id,
-  *      type and namespace specified
   * find_task_by_pid_ns():
   *      finds a task by its pid in the specified namespace
   * find_task_by_vpid():
   * see also find_vpid() etc in include/linux/pid.h
   */
  
- extern struct task_struct *find_task_by_pid_type_ns(int type, int pid,
-               struct pid_namespace *ns);
  extern struct task_struct *find_task_by_vpid(pid_t nr);
  extern struct task_struct *find_task_by_pid_ns(pid_t nr,
                struct pid_namespace *ns);
@@@ -2218,6 -2217,12 +2223,12 @@@ static inline int test_tsk_need_resched
        return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED));
  }
  
+ static inline int restart_syscall(void)
+ {
+       set_tsk_thread_flag(current, TIF_SIGPENDING);
+       return -ERESTARTNOINTR;
+ }
  static inline int signal_pending(struct task_struct *p)
  {
        return unlikely(test_tsk_thread_flag(p,TIF_SIGPENDING));
diff --combined kernel/sched.c
index 34f94240642f6d6f435c06c60ccf86a7ac027ffc,7c9098d186e6f8e398c0cb9500c1efa2120293e2..168b2680ae27fa8f9bc2039602d1f6b8229e99de
@@@ -240,7 -240,7 +240,7 @@@ static void start_rt_bandwidth(struct r
                hard = hrtimer_get_expires(&rt_b->rt_period_timer);
                delta = ktime_to_ns(ktime_sub(hard, soft));
                __hrtimer_start_range_ns(&rt_b->rt_period_timer, soft, delta,
-                               HRTIMER_MODE_ABS, 0);
+                               HRTIMER_MODE_ABS_PINNED, 0);
        }
        spin_unlock(&rt_b->rt_runtime_lock);
  }
@@@ -1155,7 -1155,7 +1155,7 @@@ static __init void init_hrtick(void
  static void hrtick_start(struct rq *rq, u64 delay)
  {
        __hrtimer_start_range_ns(&rq->hrtick_timer, ns_to_ktime(delay), 0,
-                       HRTIMER_MODE_REL, 0);
+                       HRTIMER_MODE_REL_PINNED, 0);
  }
  
  static inline void init_hrtick(void)
@@@ -1978,7 -1978,8 +1978,8 @@@ void set_task_cpu(struct task_struct *p
                if (task_hot(p, old_rq->clock, NULL))
                        schedstat_inc(p, se.nr_forced2_migrations);
  #endif
-               perf_counter_task_migration(p, new_cpu);
+               perf_swcounter_event(PERF_COUNT_SW_CPU_MIGRATIONS,
+                                    1, 1, NULL, 0);
        }
        p->se.vruntime -= old_cfsrq->min_vruntime -
                                         new_cfsrq->min_vruntime;
@@@ -2613,32 -2614,9 +2614,32 @@@ void sched_fork(struct task_struct *p, 
        set_task_cpu(p, cpu);
  
        /*
 -       * Make sure we do not leak PI boosting priority to the child:
 +       * Make sure we do not leak PI boosting priority to the child.
         */
        p->prio = current->normal_prio;
 +
 +      /*
 +       * Revert to default priority/policy on fork if requested.
 +       */
 +      if (unlikely(p->sched_reset_on_fork)) {
 +              if (p->policy == SCHED_FIFO || p->policy == SCHED_RR)
 +                      p->policy = SCHED_NORMAL;
 +
 +              if (p->normal_prio < DEFAULT_PRIO)
 +                      p->prio = DEFAULT_PRIO;
 +
 +              if (PRIO_TO_NICE(p->static_prio) < 0) {
 +                      p->static_prio = NICE_TO_PRIO(0);
 +                      set_load_weight(p);
 +              }
 +
 +              /*
 +               * We don't need the reset flag anymore after the fork. It has
 +               * fulfilled its duty:
 +               */
 +              p->sched_reset_on_fork = 0;
 +      }
 +
        if (!rt_prio(p->prio))
                p->sched_class = &fair_sched_class;
  
@@@ -4420,6 -4398,11 +4421,11 @@@ static struct 
        .load_balancer = ATOMIC_INIT(-1),
  };
  
+ int get_nohz_load_balancer(void)
+ {
+       return atomic_read(&nohz.load_balancer);
+ }
  #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT)
  /**
   * lowest_flag_domain - Return lowest sched_domain containing flag.
@@@ -6117,25 -6100,17 +6123,25 @@@ static int __sched_setscheduler(struct 
        unsigned long flags;
        const struct sched_class *prev_class = p->sched_class;
        struct rq *rq;
 +      int reset_on_fork;
  
        /* may grab non-irq protected spin_locks */
        BUG_ON(in_interrupt());
  recheck:
        /* double check policy once rq lock held */
 -      if (policy < 0)
 +      if (policy < 0) {
 +              reset_on_fork = p->sched_reset_on_fork;
                policy = oldpolicy = p->policy;
 -      else if (policy != SCHED_FIFO && policy != SCHED_RR &&
 -                      policy != SCHED_NORMAL && policy != SCHED_BATCH &&
 -                      policy != SCHED_IDLE)
 -              return -EINVAL;
 +      } else {
 +              reset_on_fork = !!(policy & SCHED_RESET_ON_FORK);
 +              policy &= ~SCHED_RESET_ON_FORK;
 +
 +              if (policy != SCHED_FIFO && policy != SCHED_RR &&
 +                              policy != SCHED_NORMAL && policy != SCHED_BATCH &&
 +                              policy != SCHED_IDLE)
 +                      return -EINVAL;
 +      }
 +
        /*
         * Valid priorities for SCHED_FIFO and SCHED_RR are
         * 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL,
                /* can't change other user's priorities */
                if (!check_same_owner(p))
                        return -EPERM;
 +
 +              /* Normal users shall not reset the sched_reset_on_fork flag */
 +              if (p->sched_reset_on_fork && !reset_on_fork)
 +                      return -EPERM;
        }
  
        if (user) {
        if (running)
                p->sched_class->put_prev_task(rq, p);
  
 +      p->sched_reset_on_fork = reset_on_fork;
 +
        oldprio = p->prio;
        __setscheduler(rq, p, policy, param->sched_priority);
  
@@@ -6344,15 -6313,14 +6350,15 @@@ SYSCALL_DEFINE1(sched_getscheduler, pid
        if (p) {
                retval = security_task_getscheduler(p);
                if (!retval)
 -                      retval = p->policy;
 +                      retval = p->policy
 +                              | (p->sched_reset_on_fork ? SCHED_RESET_ON_FORK : 0);
        }
        read_unlock(&tasklist_lock);
        return retval;
  }
  
  /**
 - * sys_sched_getscheduler - get the RT priority of a thread
 + * sys_sched_getparam - get the RT priority of a thread
   * @pid: the pid in question.
   * @param: structure containing the RT priority.
   */
@@@ -7078,7 -7046,7 +7084,7 @@@ static int migration_thread(void *data
  
                if (cpu_is_offline(cpu)) {
                        spin_unlock_irq(&rq->lock);
-                       goto wait_to_die;
+                       break;
                }
  
                if (rq->active_balance) {
                complete(&req->done);
        }
        __set_current_state(TASK_RUNNING);
-       return 0;
  
- wait_to_die:
-       /* Wait for kthread_stop */
-       set_current_state(TASK_INTERRUPTIBLE);
-       while (!kthread_should_stop()) {
-               schedule();
-               set_current_state(TASK_INTERRUPTIBLE);
-       }
-       __set_current_state(TASK_RUNNING);
        return 0;
  }
  
@@@ -7527,6 -7486,7 +7524,7 @@@ migration_call(struct notifier_block *n
                rq = task_rq_lock(p, &flags);
                __setscheduler(rq, p, SCHED_FIFO, MAX_RT_PRIO-1);
                task_rq_unlock(rq, &flags);
+               get_task_struct(p);
                cpu_rq(cpu)->migration_thread = p;
                break;
  
                kthread_bind(cpu_rq(cpu)->migration_thread,
                             cpumask_any(cpu_online_mask));
                kthread_stop(cpu_rq(cpu)->migration_thread);
+               put_task_struct(cpu_rq(cpu)->migration_thread);
                cpu_rq(cpu)->migration_thread = NULL;
                break;
  
                migrate_live_tasks(cpu);
                rq = cpu_rq(cpu);
                kthread_stop(rq->migration_thread);
+               put_task_struct(rq->migration_thread);
                rq->migration_thread = NULL;
                /* Idle task back to normal (off runqueue, low prio) */
                spin_lock_irq(&rq->lock);
@@@ -7861,7 -7823,7 +7861,7 @@@ static void rq_attach_root(struct rq *r
                free_rootdomain(old_rd);
  }
  
- static int __init_refok init_rootdomain(struct root_domain *rd, bool bootmem)
+ static int init_rootdomain(struct root_domain *rd, bool bootmem)
  {
        gfp_t gfp = GFP_KERNEL;
  
@@@ -9067,6 -9029,8 +9067,8 @@@ void __init sched_init_smp(void
  }
  #endif /* CONFIG_SMP */
  
+ const_debug unsigned int sysctl_timer_migration = 1;
  int in_sched_functions(unsigned long addr)
  {
        return in_lock_functions(addr) ||