Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25.3-rc1 /kernel/sched.c

Filename:/kernel/sched.c
Lines Added:65
Lines Deleted:1
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25-git18  2.6.25-git17  2.6.25-git16  2.6.25-git15 
(Following) 2.6.25.3  2.6.25.4  2.6.25.5  2.6.25.6  2.6.25.7  2.6.25.8 

Location
[  2.6.25.3-rc1
  [  kernel
     o  sched.c

Patch

diff --git a/kernel/sched.c b/kernel/sched.c
index 8dcdec6..1e4596c 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -876,6 +876,7 @@ static inline void resched_rq(struct rq *rq)
 enum {
    HRTICK_SET,      /* re-programm hrtick_timer */
    HRTICK_RESET,      /* not a new slice */
+   HRTICK_BLOCK,      /* stop hrtick operations */
 };
 
 /*
@@ -887,6 +888,8 @@ static inline int hrtick_enabled(struct rq *rq)
 {
    if (!sched_feat(HRTICK))
       return 0;
+   if (unlikely(test_bit(HRTICK_BLOCK, &rq->hrtick_flags)))
+      return 0;
    return hrtimer_is_hres_active(&rq->hrtick_timer);
 }
 
@@ -969,7 +972,63 @@ static enum hrtimer_restart hrtick(struct hrtimer *timer)
    return HRTIMER_NORESTART;
 }
 
-static inline void init_rq_hrtick(struct rq *rq)
+static void hotplug_hrtick_disable(int cpu)
+{
+   struct rq *rq = cpu_rq(cpu);
+   unsigned long flags;
+
+   spin_lock_irqsave(&rq->lock, flags);
+   rq->hrtick_flags = 0;
+   __set_bit(HRTICK_BLOCK, &rq->hrtick_flags);
+   spin_unlock_irqrestore(&rq->lock, flags);
+
+   hrtick_clear(rq);
+}
+
+static void hotplug_hrtick_enable(int cpu)
+{
+   struct rq *rq = cpu_rq(cpu);
+   unsigned long flags;
+
+   spin_lock_irqsave(&rq->lock, flags);
+   __clear_bit(HRTICK_BLOCK, &rq->hrtick_flags);
+   spin_unlock_irqrestore(&rq->lock, flags);
+}
+
+static int
+hotplug_hrtick(struct notifier_block *nfb, unsigned long action, void *hcpu)
+{
+   int cpu = (int)(long)hcpu;
+
+   switch (action) {
+   case CPU_UP_CANCELED:
+   case CPU_UP_CANCELED_FROZEN:
+   case CPU_DOWN_PREPARE:
+   case CPU_DOWN_PREPARE_FROZEN:
+   case CPU_DEAD:
+   case CPU_DEAD_FROZEN:
+      hotplug_hrtick_disable(cpu);
+      return NOTIFY_OK;
+
+   case CPU_UP_PREPARE:
+   case CPU_UP_PREPARE_FROZEN:
+   case CPU_DOWN_FAILED:
+   case CPU_DOWN_FAILED_FROZEN:
+   case CPU_ONLINE:
+   case CPU_ONLINE_FROZEN:
+      hotplug_hrtick_enable(cpu);
+      return NOTIFY_OK;
+   }
+
+   return NOTIFY_DONE;
+}
+
+static void init_hrtick(void)
+{
+   hotcpu_notifier(hotplug_hrtick, 0);
+}
+
+static void init_rq_hrtick(struct rq *rq)
 {
    rq->hrtick_flags = 0;
    hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
@@ -1006,6 +1065,10 @@ static inline void init_rq_hrtick(struct rq *rq)
 void hrtick_resched(void)
 {
 }
+
+static inline void init_hrtick(void)
+{
+}
 #endif
 
 /*
@@ -7094,6 +7157,7 @@ void __init sched_init_smp(void)
    put_online_cpus();
    /* XXX: Theoretical race here - CPU may be hotplugged now */
    hotcpu_notifier(update_sched_domains, 0);
+   init_hrtick();
 
    /* Move init over to a non-isolated CPU */
    if (set_cpus_allowed(current, non_isolated_cpus) < 0)


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.