]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Merge commit '900cfa46191a7d87cf1891924cb90499287fd235'; branches 'timers/nohz',...
authorThomas Gleixner <tglx@linutronix.de>
Mon, 14 Jul 2008 16:09:05 +0000 (18:09 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 14 Jul 2008 16:09:05 +0000 (18:09 +0200)
Documentation/kernel-parameters.txt
drivers/clocksource/acpi_pm.c
kernel/hrtimer.c
kernel/posix-cpu-timers.c
kernel/time/tick-sched.c

index b52f47d588b40fea417bf4bca4ffdbfef4d02152..f22386321e7adfb12d46dd616391345d9a654fff 100644 (file)
@@ -1571,6 +1571,10 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format: { parport<nr> | timid | 0 }
                        See also Documentation/parport.txt.
 
+       pmtmr=          [X86] Manual setup of pmtmr I/O Port. 
+                       Override pmtimer IOPort with a hex value.
+                       e.g. pmtmr=0x508
+
        pnpacpi=        [ACPI]
                        { off }
 
index 7b46faf22318c31f57072e73ae711d86afc7ba45..bcd7d0e429e86dff2fdd43fe192e44dfecb09e85 100644 (file)
@@ -215,3 +215,22 @@ pm_good:
  * but we still need to load before device_initcall
  */
 fs_initcall(init_acpi_pm_clocksource);
+
+/*
+ * Allow an override of the IOPort. Stupid BIOSes do not tell us about
+ * the PMTimer, but we might know where it is.
+ */
+static int __init parse_pmtmr(char *arg)
+{
+       unsigned long base;
+
+       if (strict_strtoul(arg, 16, &base))
+               return -EINVAL;
+
+       printk(KERN_INFO "PMTMR IOPort override: 0x%04x -> 0x%04x\n",
+              (unsigned int)pmtmr_ioport, base);
+       pmtmr_ioport = base;
+
+       return 1;
+}
+__setup("pmtmr=", parse_pmtmr);
index ab80515008f4740fd980b1089d922811978ccff4..ffca825d24bc1db3f3810db01285bf5f08f50786 100644 (file)
@@ -300,11 +300,10 @@ EXPORT_SYMBOL_GPL(ktime_sub_ns);
  */
 u64 ktime_divns(const ktime_t kt, s64 div)
 {
-       u64 dclc, inc, dns;
+       u64 dclc;
        int sft = 0;
 
-       dclc = dns = ktime_to_ns(kt);
-       inc = div;
+       dclc = ktime_to_ns(kt);
        /* Make sure the divisor is less than 2^32: */
        while (div >> 32) {
                sft++;
@@ -632,8 +631,6 @@ void clock_was_set(void)
  */
 void hres_timers_resume(void)
 {
-       WARN_ON_ONCE(num_online_cpus() > 1);
-
        /* Retrigger the CPU local events: */
        retrigger_next_event(NULL);
 }
index f1525ad06cb3ebbb83680b2bc0176854002217ca..c42a03aef36f07fd326eba959a90aa7bbe45dbd8 100644 (file)
@@ -1037,6 +1037,9 @@ static void check_thread_timers(struct task_struct *tsk,
                                sig->rlim[RLIMIT_RTTIME].rlim_cur +=
                                                                USEC_PER_SEC;
                        }
+                       printk(KERN_INFO
+                               "RT Watchdog Timeout: %s[%d]\n",
+                               tsk->comm, task_pid_nr(tsk));
                        __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
                }
        }
index b854a895591efe4f1d40f522d079fe1de0cf256e..86baa4f0dfe4ba157403a614393cc5fbcc4d983f 100644 (file)
@@ -48,6 +48,13 @@ static void tick_do_update_jiffies64(ktime_t now)
        unsigned long ticks = 0;
        ktime_t delta;
 
+       /*
+        * Do a quick check without holding xtime_lock:
+        */
+       delta = ktime_sub(now, last_jiffies_update);
+       if (delta.tv64 < tick_period.tv64)
+               return;
+
        /* Reevalute with xtime_lock held */
        write_seqlock(&xtime_lock);
 
@@ -228,6 +235,7 @@ void tick_nohz_stop_sched_tick(void)
                               local_softirq_pending());
                        ratelimit++;
                }
+               goto end;
        }
 
        ts->idle_calls++;