* [PATCH] Dynamic Tick version 050406-1
@ 2005-04-06 8:30 Tony Lindgren
2005-04-06 21:16 ` Frank Sorenson
0 siblings, 1 reply; 34+ messages in thread
From: Tony Lindgren @ 2005-04-06 8:30 UTC (permalink / raw)
To: linux-kernel
Cc: Benjamin Herrenschmidt, Pavel Machek, Arjan van de Ven,
Martin Schwidefsky, Andrea Arcangeli, George Anzinger,
Thomas Gleixner, john stultz, Zwane Mwaikambo, Lee Revell,
Thomas Renninger
[-- Attachment #1: Type: text/plain, Size: 1111 bytes --]
Hi all,
Here's an updated dyn-tick patch. Some minor fixes:
- Moved updating of time happen before other interrupts are
called as noted by Russell King.
- Moved call to next_timer_interrupt to generic code from
a custom idle module to allow using other idle modules,
such as amd76x_pm.
- Added some experimental control options under
/sys/devices/system/timer/timer0.
I've also put together a minimal website for dyn-tick:
http://www.muru.com/linux/dyntick/
Regards,
Tony
The sysfs debug options are following:
Check the state of dyn tick:
cat /sys/devices/system/timer/timer0/dyn_tick_state
Stop dyn-tick, and use normal HZ:
echo 0 > /sys/devices/system/timer/timer0/dyn_tick_state
Re-enabled dyn-tick:
echo 1 > /sys/devices/system/timer/timer0/dyn_tick_state
Lots of debug output to console, don't use this
from main console...
echo 1 > /sys/devices/system/timer/timer0/dyn_tick_dbg
Kill timer interrupt, and update time only from other
interrupts. Only use this for PM experiments. Time
will not stay correct as timers overflow.
echo 1 > /sys/devices/system/timer/timer0/dyn_tick_int
[-- Attachment #2: patch-dynamic-tick-2.6.12-rc2-050406-1 --]
[-- Type: text/plain, Size: 29041 bytes --]
diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
--- a/arch/i386/Kconfig 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/Kconfig 2005-04-06 01:06:59 -07:00
@@ -460,6 +460,16 @@
bool "Provide RTC interrupt"
depends on HPET_TIMER && RTC=y
+config NO_IDLE_HZ
+ bool "Dynamic Tick Timer - Skip timer ticks during idle"
+ help
+ This option enables support for skipping timer ticks when the
+ processor is idle. During system load, timer is continuous.
+ This option saves power, as it allows the system to stay in
+ idle mode longer. Currently supported timers are ACPI PM
+ timer, local APIC timer, and TSC timer. HPET timer is currently
+ not supported.
+
config SMP
bool "Symmetric multi-processing support"
---help---
diff -Nru a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
--- a/arch/i386/kernel/apic.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/kernel/apic.c 2005-04-06 01:06:59 -07:00
@@ -26,6 +26,7 @@
#include <linux/mc146818rtc.h>
#include <linux/kernel_stat.h>
#include <linux/sysdev.h>
+#include <linux/dyn-tick-timer.h>
#include <asm/atomic.h>
#include <asm/smp.h>
@@ -909,6 +910,8 @@
#define APIC_DIVISOR 16
+static u32 apic_timer_val;
+
static void __setup_APIC_LVTT(unsigned int clocks)
{
unsigned int lvtt_value, tmp_value, ver;
@@ -927,7 +930,15 @@
& ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE))
| APIC_TDR_DIV_16);
- apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR);
+ apic_timer_val = clocks/APIC_DIVISOR;
+
+#ifdef CONFIG_NO_IDLE_HZ
+ /* Local APIC timer is 24-bit */
+ if (apic_timer_val)
+ dyn_tick->max_skip = 0xffffff / apic_timer_val;
+#endif
+
+ apic_write_around(APIC_TMICT, apic_timer_val);
}
static void __init setup_APIC_timer(unsigned int clocks)
@@ -1040,6 +1051,13 @@
*/
setup_APIC_timer(calibration_result);
+#ifdef CONFIG_NO_IDLE_HZ
+ if (calibration_result)
+ dyn_tick->state |= DYN_TICK_USE_APIC;
+ else
+ printk(KERN_INFO "dyn-tick: Cannot use local APIC\n");
+#endif
+
local_irq_enable();
}
@@ -1068,6 +1086,18 @@
}
}
+#if defined(CONFIG_NO_IDLE_HZ)
+void reprogram_apic_timer(unsigned int count)
+{
+ unsigned long flags;
+
+ count *= apic_timer_val;
+ local_irq_save(flags);
+ apic_write_around(APIC_TMICT, count);
+ local_irq_restore(flags);
+}
+#endif
+
/*
* the frequency of the profiling timer can be changed
* by writing a multiplier value into /proc/profile.
@@ -1160,6 +1190,7 @@
fastcall void smp_apic_timer_interrupt(struct pt_regs *regs)
{
+ unsigned long seq;
int cpu = smp_processor_id();
/*
@@ -1178,6 +1209,23 @@
* interrupt lock, which is the WrongThing (tm) to do.
*/
irq_enter();
+
+#ifdef CONFIG_NO_IDLE_HZ
+ /*
+ * Check if we need to wake up PIT interrupt handler.
+ * Otherwise just wake up local APIC timer.
+ */
+ do {
+ seq = read_seqbegin(&xtime_lock);
+ if (dyn_tick->state & (DYN_TICK_ENABLED | DYN_TICK_SKIPPING)) {
+ if (dyn_tick->skip_cpu == cpu && dyn_tick->skip > DYN_TICK_MIN_SKIP)
+ dyn_tick->interrupt(99, NULL, regs);
+ else
+ reprogram_apic_timer(1);
+ }
+ } while (read_seqretry(&xtime_lock, seq));
+#endif
+
smp_local_timer_interrupt(regs);
irq_exit();
}
diff -Nru a/arch/i386/kernel/dyn-tick.c b/arch/i386/kernel/dyn-tick.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/arch/i386/kernel/dyn-tick.c 2005-04-06 01:06:59 -07:00
@@ -0,0 +1,68 @@
+/*
+ * linux/arch/i386/kernel/dyn-tick.c
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/version.h>
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+//#include <linux/module.h>
+//#include <linux/interrupt.h>
+//#include <linux/cpumask.h>
+//#include <linux/pm.h>
+#include <linux/dyn-tick-timer.h>
+//#include <asm/io.h>
+#include "dyn-tick.h"
+
+extern int dyn_tick_late_init(void);
+
+void arch_reprogram_timer(void)
+{
+ if (cpu_has_local_apic()) {
+ disable_pit_tick();
+ if (dyn_tick->state & DYN_TICK_TIMER_INT)
+ reprogram_apic_timer(dyn_tick->skip);
+ } else {
+ if (dyn_tick->state & DYN_TICK_TIMER_INT)
+ reprogram_pit_tick(dyn_tick->skip);
+ else
+ disable_pit_tick();
+ }
+}
+
+static struct dyn_tick_timer arch_dyn_tick_timer = {
+ .arch_reprogram_timer = &arch_reprogram_timer,
+};
+
+int __init dyn_tick_init(void)
+{
+ arch_dyn_tick_timer.arch_init = dyn_tick_late_init;
+ dyn_tick_register(&arch_dyn_tick_timer);
+
+ return 0;
+}
+arch_initcall(dyn_tick_init);
diff -Nru a/arch/i386/kernel/dyn-tick.h b/arch/i386/kernel/dyn-tick.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/arch/i386/kernel/dyn-tick.h 2005-04-06 01:06:59 -07:00
@@ -0,0 +1,33 @@
+/*
+ * linux/arch/i386/kernel/dyn-tick.h
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#if defined(CONFIG_SMP) || defined(CONFIG_X86_UP_APIC)
+#define cpu_has_local_apic() (dyn_tick->state & DYN_TICK_USE_APIC)
+#else
+#define cpu_has_local_apic() 0
+#endif
diff -Nru a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
--- a/arch/i386/kernel/irq.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/kernel/irq.c 2005-04-06 01:06:59 -07:00
@@ -15,6 +15,7 @@
#include <linux/seq_file.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
+#include <linux/dyn-tick-timer.h>
DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_maxaligned_in_smp;
EXPORT_PER_CPU_SYMBOL(irq_stat);
@@ -102,6 +103,12 @@
);
} else
#endif
+
+#ifdef CONFIG_NO_IDLE_HZ
+ if (dyn_tick->state & (DYN_TICK_ENABLED | DYN_TICK_SKIPPING) && irq != 0)
+ dyn_tick->interrupt(irq, NULL, regs);
+#endif
+
__do_IRQ(irq, regs);
irq_exit();
diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
--- a/arch/i386/kernel/process.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/kernel/process.c 2005-04-06 01:06:59 -07:00
@@ -160,6 +160,10 @@
if (!idle)
idle = default_idle;
+#ifdef CONFIG_NO_IDLE_HZ
+ dyn_tick_reprogram_timer();
+#endif
+
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
idle();
}
diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/kernel/time.c 2005-04-06 01:06:59 -07:00
@@ -46,6 +46,7 @@
#include <linux/bcd.h>
#include <linux/efi.h>
#include <linux/mca.h>
+#include <linux/dyn-tick-timer.h>
#include <asm/io.h>
#include <asm/smp.h>
@@ -67,6 +68,7 @@
#include <asm/arch_hooks.h>
#include "io_ports.h"
+#include "dyn-tick.h"
extern spinlock_t i8259A_lock;
int pit_latch_buggy; /* extern */
@@ -308,6 +310,66 @@
return IRQ_HANDLED;
}
+#ifdef CONFIG_NO_IDLE_HZ
+static unsigned long long last_tick;
+void reprogram_pit_tick(int jiffies_to_skip);
+extern void replace_timer_interrupt(void * new_handler);
+
+#if defined(CONFIG_NO_IDLE_HZ) && defined(CONFIG_X86_LOCAL_APIC)
+extern void reprogram_apic_timer(unsigned int count);
+#else
+void reprogram_apic_timer(unsigned int count) {}
+#endif
+
+#ifdef DEBUG
+#define dbg_dyn_tick_irq() {if (skipped && skipped < dyn_tick->skip) \
+ printk("%u/%li ", skipped, dyn_tick->skip);}
+#else
+#define dbg_dyn_tick_irq() {}
+#endif
+
+/*
+ * This interrupt handler updates the time based on number of jiffies skipped
+ * It would be somewhat more optimized to have a customa handler in each timer
+ * using hardware ticks instead of nanoseconds. Note that CONFIG_NO_IDLE_HZ
+ * currently disables timer fallback on skipped jiffies.
+ */
+irqreturn_t dyn_tick_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ unsigned long flags;
+ volatile unsigned long long now;
+ unsigned int skipped = 0;
+
+ if (dyn_tick->state & DYN_TICK_DEBUG) {
+ if (irq == 0)
+ printk(".");
+ else
+ printk("%i ", irq);
+ }
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ now = cur_timer->get_hw_time();
+ while (now - last_tick >= NS_TICK_LEN) {
+ last_tick += NS_TICK_LEN;
+ cur_timer->mark_offset();
+ do_timer_interrupt(irq, NULL, regs);
+ skipped++;
+ }
+ if (dyn_tick->state & (DYN_TICK_ENABLED | DYN_TICK_SKIPPING)) {
+ dbg_dyn_tick_irq();
+ dyn_tick->skip = 1;
+ if (cpu_has_local_apic())
+ reprogram_apic_timer(dyn_tick->skip);
+ reprogram_pit_tick(dyn_tick->skip);
+ dyn_tick->state |= DYN_TICK_ENABLED;
+ dyn_tick->state &= ~DYN_TICK_SKIPPING;
+ }
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return IRQ_HANDLED;
+}
+#endif /* CONFIG_NO_IDLE_HZ */
+
/* not static: needed by APM */
unsigned long get_cmos_time(void)
{
@@ -416,7 +478,7 @@
/* XXX this driverfs stuff should probably go elsewhere later -john */
-static struct sys_device device_timer = {
+struct sys_device device_timer = {
.id = 0,
.cls = &timer_sysclass,
};
@@ -452,6 +514,69 @@
}
#endif
+#ifdef CONFIG_NO_IDLE_HZ
+
+void disable_pit_tick(void)
+{
+ extern spinlock_t i8253_lock;
+ unsigned long flags;
+ spin_lock_irqsave(&i8253_lock, flags);
+ outb_p(0x31, PIT_MODE); /* binary, mode 1, LSB/MSB, ch 0 */
+ spin_unlock_irqrestore(&i8253_lock, flags);
+}
+
+/*
+ * Reprograms the next timer interrupt
+ * PIT timer reprogramming code taken from APM code.
+ * Note that PIT timer is a 16-bit timer, which allows max
+ * skip of only few seconds.
+ */
+void reprogram_pit_tick(int jiffies_to_skip)
+{
+ int skip;
+ extern spinlock_t i8253_lock;
+ unsigned long flags;
+
+ skip = jiffies_to_skip * LATCH;
+ if (skip > 0xffff) {
+ skip = 0xffff;
+ }
+
+ spin_lock_irqsave(&i8253_lock, flags);
+ outb_p(0x34, PIT_MODE); /* binary, mode 2, LSB/MSB, ch 0 */
+ outb_p(skip & 0xff, PIT_CH0); /* LSB */
+ outb(skip >> 8, PIT_CH0); /* MSB */
+ spin_unlock_irqrestore(&i8253_lock, flags);
+}
+
+int __init dyn_tick_late_init(void)
+{
+ unsigned long flags;
+
+ if (!cur_timer->get_hw_time)
+ return -ENODEV;
+ write_seqlock_irqsave(&xtime_lock, flags);
+ last_tick = cur_timer->get_hw_time();
+ dyn_tick->skip = 1;
+ if (!cpu_has_local_apic())
+ dyn_tick->max_skip = 0xffff/LATCH; /* PIT timer length */
+ printk(KERN_INFO "dyn-tick: Maximum ticks to skip limited to %i\n",
+ dyn_tick->max_skip);
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ if (cur_timer->late_init)
+ cur_timer->late_init();
+ dyn_tick->interrupt = dyn_tick_timer_interrupt;
+ replace_timer_interrupt(dyn_tick->interrupt);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ dyn_tick->state |= DYN_TICK_ENABLED;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return 0;
+}
+#endif /* CONFIG_NO_IDLE_HZ */
+
void __init time_init(void)
{
#ifdef CONFIG_HPET_TIMER
@@ -471,6 +596,15 @@
cur_timer = select_timer();
printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
+
+#ifdef CONFIG_NO_IDLE_HZ
+ if (strncmp(cur_timer->name, "tsc", 3) == 0 ||
+ strncmp(cur_timer->name, "pmtmr", 3) == 0)
+ dyn_tick->state |= DYN_TICK_SUITABLE;
+ else
+ printk(KERN_INFO "dyn-tick: Cannot use timer %s\n",
+ cur_timer->name);
+#endif
time_init_hook();
}
diff -Nru a/arch/i386/kernel/timers/timer_pm.c b/arch/i386/kernel/timers/timer_pm.c
--- a/arch/i386/kernel/timers/timer_pm.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/kernel/timers/timer_pm.c 2005-04-06 01:06:59 -07:00
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/device.h>
#include <linux/init.h>
+#include <linux/dyn-tick-timer.h>
#include <asm/types.h>
#include <asm/timer.h>
#include <asm/smp.h>
@@ -168,6 +169,7 @@
monotonic_base += delta * NSEC_PER_USEC;
write_sequnlock(&monotonic_lock);
+#ifndef CONFIG_NO_IDLE_HZ
/* convert to ticks */
delta += offset_delay;
lost = delta / (USEC_PER_SEC / HZ);
@@ -184,6 +186,7 @@
first_run = 0;
offset_delay = 0;
}
+#endif
}
@@ -238,6 +241,25 @@
return (unsigned long) offset_delay + cyc2us(delta);
}
+static unsigned long long ns_time;
+
+static unsigned long long get_hw_time_pmtmr(void)
+{
+ u32 now, delta;
+ static unsigned int last_cycles;
+ now = read_pmtmr();
+ delta = (now - last_cycles) & ACPI_PM_MASK;
+ last_cycles = now;
+ ns_time += cyc2us(delta) * NSEC_PER_USEC;
+ return ns_time;
+}
+
+static void late_init_pmtmr(void)
+{
+ ns_time = monotonic_clock_pmtmr();
+}
+
+extern irqreturn_t pmtmr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
/* acpi timer_opts struct */
static struct timer_opts timer_pmtmr = {
@@ -245,7 +267,9 @@
.mark_offset = mark_offset_pmtmr,
.get_offset = get_offset_pmtmr,
.monotonic_clock = monotonic_clock_pmtmr,
+ .get_hw_time = get_hw_time_pmtmr,
.delay = delay_pmtmr,
+ .late_init = late_init_pmtmr,
};
struct init_timer_opts __initdata timer_pmtmr_init = {
diff -Nru a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c
--- a/arch/i386/kernel/timers/timer_tsc.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/kernel/timers/timer_tsc.c 2005-04-06 01:06:59 -07:00
@@ -112,6 +112,15 @@
return delay_at_last_interrupt + edx;
}
+static unsigned long get_hw_time_tsc(void)
+{
+ register unsigned long eax, edx;
+
+ unsigned long long hw_time;
+ rdtscll(hw_time);
+ return cycles_2_ns(hw_time);
+}
+
static unsigned long long monotonic_clock_tsc(void)
{
unsigned long long last_offset, this_offset, base;
@@ -348,6 +357,7 @@
rdtsc(last_tsc_low, last_tsc_high);
+#ifndef CONFIG_NO_IDLE_HZ
spin_lock(&i8253_lock);
outb_p(0x00, PIT_MODE); /* latch the count ASAP */
@@ -415,11 +425,14 @@
cpufreq_delayed_get();
} else
lost_count = 0;
+#endif
+
/* update the monotonic base value */
this_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low;
monotonic_base += cycles_2_ns(this_offset - last_offset);
write_sequnlock(&monotonic_lock);
+#ifndef CONFIG_NO_IDLE_HZ
/* calculate delay_at_last_interrupt */
count = ((LATCH-1) - count) * TICK_SIZE;
delay_at_last_interrupt = (count + LATCH/2) / LATCH;
@@ -430,6 +443,7 @@
*/
if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
jiffies_64++;
+#endif
}
static int __init init_tsc(char* override)
@@ -551,6 +565,7 @@
.mark_offset = mark_offset_tsc,
.get_offset = get_offset_tsc,
.monotonic_clock = monotonic_clock_tsc,
+ .get_hw_time = get_hw_time_tsc,
.delay = delay_tsc,
};
diff -Nru a/arch/i386/mach-default/setup.c b/arch/i386/mach-default/setup.c
--- a/arch/i386/mach-default/setup.c 2005-04-06 01:06:59 -07:00
+++ b/arch/i386/mach-default/setup.c 2005-04-06 01:06:59 -07:00
@@ -85,6 +85,22 @@
setup_irq(0, &irq0);
}
+/**
+ * replace_timer_interrupt - allow replacing timer interrupt handler
+ *
+ * Description:
+ * Can be used to replace timer interrupt handler with a more optimized
+ * handler. Used for enabling and disabling of CONFIG_NO_IDLE_HZ.
+ */
+void replace_timer_interrupt(void * new_handler)
+{
+ unsigned long flags;
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ irq0.handler = new_handler;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+}
+
#ifdef CONFIG_MCA
/**
* mca_nmi_hook - hook into MCA specific NMI chain
diff -Nru a/include/asm-i386/timer.h b/include/asm-i386/timer.h
--- a/include/asm-i386/timer.h 2005-04-06 01:06:59 -07:00
+++ b/include/asm-i386/timer.h 2005-04-06 01:06:59 -07:00
@@ -1,6 +1,7 @@
#ifndef _ASMi386_TIMER_H
#define _ASMi386_TIMER_H
#include <linux/init.h>
+#include <linux/interrupt.h>
/**
* struct timer_ops - used to define a timer source
@@ -21,7 +22,9 @@
void (*mark_offset)(void);
unsigned long (*get_offset)(void);
unsigned long long (*monotonic_clock)(void);
+ unsigned long long (*get_hw_time)(void);
void (*delay)(unsigned long);
+ void (*late_init)(void);
};
struct init_timer_opts {
diff -Nru a/include/linux/dyn-tick-timer.h b/include/linux/dyn-tick-timer.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/include/linux/dyn-tick-timer.h 2005-04-06 01:06:59 -07:00
@@ -0,0 +1,74 @@
+/*
+ * linux/include/linux/dyn-tick-timer.h
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _DYN_TICK_TIMER_H
+#define _DYN_TICK_TIMER_H
+
+#include <linux/interrupt.h>
+
+#define DYN_TICK_DEBUG (1 << 31)
+#define DYN_TICK_TIMER_INT (1 << 4)
+#define DYN_TICK_USE_APIC (1 << 3)
+#define DYN_TICK_SKIPPING (1 << 2)
+#define DYN_TICK_ENABLED (1 << 1)
+#define DYN_TICK_SUITABLE (1 << 0)
+
+struct dyn_tick_state {
+ unsigned int state; /* Current state */
+ int skip_cpu; /* Skip handling processor */
+ unsigned long skip; /* Ticks to skip */
+ unsigned int max_skip; /* Max number of ticks to skip */
+ unsigned long irq_skip_mask; /* Do not update time from these irqs */
+ irqreturn_t (*interrupt)(int, void *, struct pt_regs *);
+};
+
+struct dyn_tick_timer {
+ int (*arch_init) (void);
+ void (*arch_enable) (void);
+ void (*arch_disable) (void);
+ void (*arch_reprogram_timer) (void);
+};
+
+extern struct dyn_tick_state * dyn_tick;
+extern void dyn_tick_register(struct dyn_tick_timer * new_timer);
+
+#define NS_TICK_LEN ((1 * 1000000000)/HZ)
+#define DYN_TICK_MIN_SKIP 2
+
+#ifdef CONFIG_NO_IDLE_HZ
+
+extern unsigned long dyn_tick_reprogram_timer(void);
+
+#else
+
+#define arch_has_safe_halt() 0
+#define dyn_tick_reprogram_timer() {}
+
+
+#endif /* CONFIG_NO_IDLE_HZ */
+#endif /* _DYN_TICK_TIMER_H */
diff -Nru a/kernel/Makefile b/kernel/Makefile
--- a/kernel/Makefile 2005-04-06 01:06:59 -07:00
+++ b/kernel/Makefile 2005-04-06 01:06:59 -07:00
@@ -28,6 +28,7 @@
obj-$(CONFIG_SYSFS) += ksysfs.o
obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
obj-$(CONFIG_SECCOMP) += seccomp.o
+obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick-timer.o
ifneq ($(CONFIG_IA64),y)
# According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
diff -Nru a/kernel/dyn-tick-timer.c b/kernel/dyn-tick-timer.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/kernel/dyn-tick-timer.c 2005-04-06 01:06:59 -07:00
@@ -0,0 +1,254 @@
+/*
+ * linux/arch/i386/kernel/dyn-tick.c
+ *
+ * Beginnings of generic dynamic tick timer support
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/version.h>
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/sysdev.h>
+#include <linux/interrupt.h>
+#include <linux/cpumask.h>
+#include <linux/pm.h>
+#include <linux/dyn-tick-timer.h>
+#include <asm/io.h>
+
+#include "io_ports.h"
+
+#define DYN_TICK_VERSION "050301-1"
+
+struct dyn_tick_state dyn_tick_state;
+struct dyn_tick_state * dyn_tick = &dyn_tick_state;
+struct dyn_tick_timer * dyn_tick_cfg;
+
+static void (*orig_idle) (void) = 0;
+extern void disable_pit_tick(void);
+extern void reprogram_pit_tick(int jiffies_to_skip);
+extern void reprogram_apic_timer(unsigned int count);
+extern void reprogram_pit_tick(int jiffies_to_skip);
+static cpumask_t dyn_cpu_map;
+
+/*
+ * Arch independed code needed to reprogram next timer interrupt.
+ * Gets called from cpu_idle() before entering idle loop. Note that
+ * we want to have all processors idle before reprogramming the
+ * next timer interrupt.
+ */
+unsigned long dyn_tick_reprogram_timer(void)
+{
+ int cpu;
+ unsigned long flags;
+ cpumask_t idle_cpus;
+ unsigned long next;
+
+ if (dyn_tick->state & DYN_TICK_DEBUG)
+ printk("i");
+
+ if (!(dyn_tick->state & DYN_TICK_ENABLED))
+ return 0;
+
+ /* Check if we are already skipping ticks and can idle other cpus */
+ if (dyn_tick->state & DYN_TICK_SKIPPING) {
+ reprogram_apic_timer(dyn_tick->skip);
+ return 0;
+ }
+
+ /* Check if we can start skipping ticks */
+ write_seqlock_irqsave(&xtime_lock, flags);
+ cpu = smp_processor_id();
+ cpu_set(cpu, dyn_cpu_map);
+ cpus_and(idle_cpus, dyn_cpu_map, cpu_online_map);
+ if (cpus_equal(idle_cpus, cpu_online_map)) {
+ next = next_timer_interrupt();
+ if (jiffies > next) {
+ //printk("Too late? next: %lu jiffies: %lu\n",
+ // next, jjiffies);
+ dyn_tick->skip = 1;
+ } else
+ dyn_tick->skip = next_timer_interrupt() - jiffies;
+ if (dyn_tick->skip > DYN_TICK_MIN_SKIP) {
+ if (dyn_tick->skip > dyn_tick->max_skip)
+ dyn_tick->skip = dyn_tick->max_skip;
+
+ dyn_tick_cfg->arch_reprogram_timer();
+
+ dyn_tick->skip_cpu = cpu;
+ dyn_tick->state |= DYN_TICK_SKIPPING;
+ }
+ cpus_clear(dyn_cpu_map);
+ }
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return dyn_tick->skip;
+}
+
+void __init dyn_tick_register(struct dyn_tick_timer * arch_timer)
+{
+ dyn_tick_cfg = arch_timer;
+ printk(KERN_INFO "dyn-tick: Registering dynamic tick timer v%s\n",
+ DYN_TICK_VERSION);
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * Sysfs interface
+ * ---------------------------------------------------------------------------
+ */
+
+extern struct sys_device device_timer;
+
+static ssize_t show_dyn_tick_state(struct sys_device *dev, char *buf)
+{
+ return sprintf(buf, "suitable:\t%i\n"
+ "enabled:\t%i\n"
+ "skipping:\t%i\n"
+ "using APIC:\t%i\n"
+ "int enabled:\t%i\n"
+ "debug:\t\t%i\n",
+ dyn_tick->state & DYN_TICK_SUITABLE,
+ (dyn_tick->state & DYN_TICK_ENABLED) >> 1,
+ (dyn_tick->state & DYN_TICK_SKIPPING) >> 2,
+ (dyn_tick->state & DYN_TICK_USE_APIC) >> 3,
+ (dyn_tick->state & DYN_TICK_TIMER_INT) >> 4,
+ (dyn_tick->state & DYN_TICK_DEBUG) >> 31);
+}
+
+static ssize_t set_dyn_tick_state(struct sys_device *dev, const char * buf,
+ ssize_t count)
+{
+ unsigned long flags;
+ unsigned int enable = simple_strtoul(buf, NULL, 2);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ if (enable) {
+ if (dyn_tick_cfg->arch_enable)
+ dyn_tick_cfg->arch_enable();
+ dyn_tick->state |= DYN_TICK_ENABLED;
+ } else {
+ if (dyn_tick_cfg->arch_disable)
+ dyn_tick_cfg->arch_disable();
+ dyn_tick->state &= ~DYN_TICK_ENABLED;
+ }
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return count;
+}
+
+static SYSDEV_ATTR(dyn_tick_state, 0644, show_dyn_tick_state,
+ set_dyn_tick_state);
+
+static ssize_t show_dyn_tick_int(struct sys_device *dev, char *buf)
+{
+ return sprintf(buf, "%i\n",
+ (dyn_tick->state & DYN_TICK_TIMER_INT) >> 4);
+}
+
+static ssize_t set_dyn_tick_int(struct sys_device *dev, const char * buf,
+ ssize_t count)
+{
+ unsigned long flags;
+ unsigned int enable = simple_strtoul(buf, NULL, 2);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ if (enable)
+ dyn_tick->state |= DYN_TICK_TIMER_INT;
+ else
+ dyn_tick->state &= ~DYN_TICK_TIMER_INT;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return count;
+}
+
+static SYSDEV_ATTR(dyn_tick_int, 0644, show_dyn_tick_int, set_dyn_tick_int);
+
+static ssize_t show_dyn_tick_dbg(struct sys_device *dev, char *buf)
+{
+ return sprintf(buf, "%i\n",
+ (dyn_tick->state & DYN_TICK_DEBUG) >> 31);
+}
+
+static ssize_t set_dyn_tick_dbg(struct sys_device *dev, const char * buf,
+ ssize_t count)
+{
+ unsigned long flags;
+ unsigned int enable = simple_strtoul(buf, NULL, 2);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ if (enable)
+ dyn_tick->state |= DYN_TICK_DEBUG;
+ else
+ dyn_tick->state &= ~DYN_TICK_DEBUG;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return count;
+}
+
+static SYSDEV_ATTR(dyn_tick_dbg, 0644, show_dyn_tick_dbg, set_dyn_tick_dbg);
+
+/*
+ * ---------------------------------------------------------------------------
+ * Init functions
+ * ---------------------------------------------------------------------------
+ */
+
+static int __init dyn_tick_early_init(void)
+{
+ dyn_tick->state |= DYN_TICK_TIMER_INT;
+}
+
+subsys_initcall(dyn_tick_early_init);
+
+/*
+ * We need to initialize dynamic tick after calibrate delay
+ */
+static int __init dyn_tick_late_init(void)
+{
+ int ret = 0;
+
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_state);
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_int);
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_dbg);
+
+ if (dyn_tick_cfg->arch_init == NULL ||
+ !(dyn_tick->state & DYN_TICK_SUITABLE))
+ return -ENODEV;
+
+ ret = dyn_tick_cfg->arch_init();
+ if (ret != 0) {
+ printk(KERN_WARNING "dyn-tick: Init failed\n");
+ return -ENODEV;
+ }
+
+ printk(KERN_INFO "dyn-tick: Timer using dynamic tick\n");
+
+ return ret;
+}
+
+late_initcall(dyn_tick_late_init);
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-06 8:30 [PATCH] Dynamic Tick version 050406-1 Tony Lindgren
@ 2005-04-06 21:16 ` Frank Sorenson
2005-04-07 8:21 ` Tony Lindgren
0 siblings, 1 reply; 34+ messages in thread
From: Frank Sorenson @ 2005-04-06 21:16 UTC (permalink / raw)
To: Tony Lindgren
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
[-- Attachment #1: Type: text/plain, Size: 1913 bytes --]
Tony Lindgren wrote:
> Hi all,
>
> Here's an updated dyn-tick patch. Some minor fixes:
Doesn't look so good here. I get this with 2.6.12-rc2 (plus a few other patches).
Disabling Dynamic Tick makes everything happy again (it boots).
[4294688.655000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[4294688.656000] printing eip:
[4294688.657000] c077f818
[4294688.659000] *pde = 00000000
[4294688.660000] Oops: 0000 [#1]
[4294688.661000] PREEMPT
[4294688.662000] Modules linked in:
[4294688.663000] CPU: 0
[4294688.663000] EIP: 0060:[<c077f818>] Not tainted VLI
[4294688.663000] EFLAGS: 00010202 (2.6.12-rc2-fs3)
[4294688.666000] EIP is at dyn_tick_late_init+0x38/0x80
[4294688.667000] eax: 00000000 ebx: c079f0c0 ecx: 00000000 edx: f7c15d4c
[4294688.668000] esi: f7f02000 edi: 00000000 ebp: f7f03fb8 esp: f7f03fb4
[4294688.669000] ds: 007b es: 007b ss: 0068
[4294688.670000] Process swapper (pid: 1, threadinfo=f7f02000 task=f7f01830)
[4294688.670000] Stack: c077a0e2 f7f03fd8 c076a956 c019bde8 c01002a0 00000000 c01002a0 0000000
[4294688.671000] 00000000 f7f03fec c01002d5 0000007b 0000007b ffffffff 00000000 c0101365
[4294688.672000] 00000000 00000000 00000000
[4294688.673000] Call Trace:
[4294688.675000] [<c0104bfa>] show_stack+0x7a/0x90
[4294688.676000] [<c0104d79>] show_registers+0x149/0x1c0
[4294688.677000] [<c0104fea>] die+0x14a/0x2d0
[4294688.678000] [<c011e3ee>] do_page_fault+0x44e/0x633
[4294688.679000] [<c01046e3>] error_code+0x4f/0x54
[4294688.680000] [<c076a956>] do_initcalls+0x56/0xc0
[4294688.681000] [<c01002d5>] init+0x35/0x110
[4294688.682000] [<c0101365>] kernel_thread_helper+0x5/0x10
[4294688.683000] Code: 83 ec 04 e8 3b 6b c0 ff ba 14 b7<7>eth0: no IPv6 routers present
Frank
--
Frank Sorenson - KD7TZK
Systems Manager, Computer Science Department
Brigham Young University
frank@tuxrocks.com
[-- Attachment #2: kermit-log --]
[-- Type: text/plain, Size: 6535 bytes --]
[4294667.296000] Linux version 2.6.12-rc2-fs3 (root@moebius.cs.byu.edu) (gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)) #3 Wed Apr 6 13:14:48 MDT 2005
[4294667.296000] BIOS-provided physical RAM map:
[4294667.296000] BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
[4294667.296000] BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
[4294667.296000] BIOS-e820: 0000000000100000 - 000000005ffae000 (usable)
[4294667.296000] BIOS-e820: 000000005ffae000 - 0000000060000000 (reserved)
[4294667.296000] BIOS-e820: 00000000feda0000 - 00000000fee00000 (reserved)
[4294667.296000] BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved)
[4294667.296000] 639MB HIGHMEM available.
[4294667.296000] 896MB LOWMEM available.
[4294667.296000] DMI 2.3 present.
[4294667.296000] ACPI: PM-Timer IO Port: 0x808
[4294667.296000] Allocating PCI resources starting at 60000000 (gap: 60000000:9eda0000)
[4294667.296000] Built 1 zonelists
[4294667.296000] Kernel command line: ro root=LABEL=/1 vga=794 nmi_watchdog=1 lapic console=tty0 console=ttyUSB0,9600 psmouse.proto=exps i8k.ignore_dmi:bool=true netconsole=@128.187.171.101/eth0,5515@128.187.171.102/ single
[4294667.296000] Unknown boot option `i8k.ignore_dmi:bool=true': ignoring
[4294667.296000] netconsole: local port 6665
[4294667.296000] netconsole: local IP 128.187.171.101
[4294667.296000] netconsole: interface eth0
[4294667.296000] netconsole: remote port 5515[4294667.296000] netconsole: remote IP 128.187.171.102
[4294667.[4294667.296000] Console: colour dummy device 80x25
[4294667.298[4294667.472000] Capability LSM initialized as secondary
[429466[4294667.472000] Checking 'hlt' instruction... OK.
[4294667.4830[4294667.616000] checking if image is initramfs... it is
[429466[4294667.750000] Completing Region/Field/Buffer/Package initiali[4294667.881000] PCI: Transparent bridge - 0000:00:1e.0
[4294667[4294668.309000] pnp: PnP ACPI: found 10 devices
[4294668.310000[4294668.534000] pnp: 00:01: ioport range 0x808-0x80f could not [4294668.607000] audit(1112798526.606:0): initialized
[4294668.6[4294668.625000] ACPI: PCI Interrupt Link [LNKA] enabled at IRQ [4294668.947000] * connector 1 of type 2 (CRT) : 2320
[4294668[4294671.384000] radeonfb: Monitor 1 type LCD found
[4294671.384[4294671.384000] 320 x 400
[4294671.384000] 320 x 400
[4294671[4294671.384000] 1024 x 768
[4294671.384000] 1280 x 1024
[4294[4294671.384000] Setting up default mode based on panel info
[42[4294671.492000] fb1: VESA VGA frame buffer device
[4294671.4980[4294673.099000] agpgart: AGP aperture is 128M @ 0xe8000000
[429[4294673.156000] ACPI: PCI Interrupt Link [LNKB] enabled at IRQ [4294673.205000] PPP generic driver version 2.4.2
[4294673.20800[4294676.218000] b44: eth0: Link is up at 100 Mbps, full duplex.[4294677.477000] ICH4: not 100% native mode: will probe irqs lat[4294682.079000] hda: cache flushes supported
[4294682.081000] [4294682.253000] PCI: Enabling device 0000:02:01.0 (0000 -> 0002[4294682.646000] Badness in device_release at drivers/base/core.[4294682.657000] Databook TCIC-2 PCMCIA probe: not found.
[42946[4294682.683000] hub 1-0:1.0: 6 ports detected
[4294682.705000] [4294682.781000] ACPI: PCI Interrupt 0000:00:1d.1[B] -> Link [LN[4294682.919000] uhci_hcd 0000:00:1d.2: irq 11, io base 0x0000bf[4294683.124000] usbcore: registered new driver usbhid
[4294683.[4294683.141000] drivers/usb/serial/belkin_sa.c: USB Belkin Seri[4294683.155000] drivers/usb/serial/usb-serial.c: USB Serial sup[4294683.169000] drivers/usb/serial/usb-serial.c: USB Serial sup[4294683.183000] drivers/usb/serial/usb-serial.c: USB Serial sup[4294683.198000] drivers/usb/serial/keyspan.c: v1.1.4:Keyspan US[4294683.211000] drivers/usb/serial/usb-serial.c: USB Serial sup[4294685.808000] drivers/usb/serial/whiteheat.c: USB ConnectTech[4294685.833000] md: md driver 0.90.1 MAX_MD_DEVS=256, MD_SB_DIS[4294685.966000] input: PS/2 Generic Mouse on isa0060/serio1
[4294686.655000] intel8x0_measure_ac97_clock: measured 49315 usecs
[4294686.656000] intel8x0: clocking to 48000
[4294686.668000] ACPI: PCI Interrupt 0000:00:1f.6[B] -> Link [LNKB] -> GSI 7 (level, low) -> IRQ 7
[4294686.771000] MC'97 1 converters and GPIO not ready (0xff00)
[4294686.777000] ALSA device list:
[4294686.778000] #0: Intel 82801DB-ICH4 with STAC9750,51 at 0xf8fff800, irq 7
[4294686.779000] #1: Intel 82801DB-ICH4 Modem at 0xd400, irq 7
[4294686.780000] NET: Registered protocol family 2
[4294686.791000] IP: routing cache hash table of 4096 buckets, 128Kbytes
[4294686.792000] TCP established hash table entries: 262144 (order: 9, 2097152 bytes)
[4294686.796000] TCP bind hash table entries: 65536 (order: 8, 1835008 bytes)
[4294686.801000] TCP: Hash tables configured (established 262144 bind 65536)
[4294686.802000] IPv4 over IPv4 tunneling driver
[4294686.804000] GRE over IPv4 tunneling driver
[4294686.806000] Initializing IPsec netlink so[4294686.815000] NET: Registered protocol family 17
[4294688.655000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[4294688.656000] printing eip:
[4294688.657000] c077f818
[4294688.659000] *pde = 00000000
[4294688.660000] Oops: 0000 [#1]
[4294688.661000] PREEMPT
[4294688.662000] Modules linked in:
[4294688.663000] CPU: 0
[4294688.663000] EIP: 0060:[<c077f818>] Not tainted VLI
[4294688.663000] EFLAGS: 00010202 (2.6.12-rc2-fs3)
[4294688.666000] EIP is at dyn_tick_late_init+0x38/0x80
[4294688.667000] eax: 00000000 ebx: c079f0c0 ecx: 00000000 edx: f7c15d4c
[4294688.668000] esi: f7f02000 edi: 00000000 ebp: f7f03fb8 esp: f7f03fb4
[4294688.669000] ds: 007b es: 007b ss: 0068
[4294688.670000] Process swapper (pid: 1, threadinfo=f7f02000 task=f7f01830)
[4294688.670000] Stack: c077a0e2 f7f03fd8 c076a956 c019bde8 c01002a0 00000000 c01002a0 00000000
[4294688.671000] 00000000 f7f03fec c01002d5 0000007b 0000007b ffffffff 00000000 c0101365
[4294688.672000] 00000000 00000000 00000000
[4294688.673000] Call Trace:
[4294688.675000] [<c0104bfa>] show_stack+0x7a/0x90
[4294688.676000] [<c0104d79>] show_registers+0x149/0x1c0
[4294688.677000] [<c0104fea>] die+0x14a/0x2d0
[4294688.678000] [<c011e3ee>] do_page_fault+0x44e/0x633
[4294688.679000] [<c01046e3>] error_code+0x4f/0x54
[4294688.680000] [<c076a956>] do_initcalls+0x56/0xc0
[4294688.681000] [<c01002d5>] init+0x35/0x110
[4294688.682000] [<c0101365>] kernel_thread_helper+0x5/0x10
[4294688.683000] Code: 83 ec 04 e8 3b 6b c0 ff ba 14 b7<7>eth0: no IPv6 routers present
[4294703.238000] md: stopping all md devices.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-06 21:16 ` Frank Sorenson
@ 2005-04-07 8:21 ` Tony Lindgren
2005-04-07 9:26 ` Alexander Nyberg
2005-04-07 21:35 ` Frank Sorenson
0 siblings, 2 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-07 8:21 UTC (permalink / raw)
To: Frank Sorenson
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
[-- Attachment #1: Type: text/plain, Size: 580 bytes --]
* Frank Sorenson <frank@tuxrocks.com> [050406 14:16]:
> Tony Lindgren wrote:
> > Hi all,
> >
> > Here's an updated dyn-tick patch. Some minor fixes:
>
> Doesn't look so good here. I get this with 2.6.12-rc2 (plus a few other patches).
> Disabling Dynamic Tick makes everything happy again (it boots).
>
> [4294688.655000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
Thanks for trying it out. What kind of hardware do you have? Does it
have HPET? It looks like no suitable timer for dyn-tick is found...
Maybe the following patch helps?
Tony
[-- Attachment #2: patch-dyntick-init-fix --]
[-- Type: text/plain, Size: 806 bytes --]
--- a/kernel/dyn-tick-timer.c 2005-03-01 16:41:05 -08:00
+++ b/kernel/dyn-tick-timer.c 2005-04-07 00:57:30 -07:00
@@ -232,10 +232,6 @@
{
int ret = 0;
- ret = sysdev_create_file(&device_timer, &attr_dyn_tick_state);
- ret = sysdev_create_file(&device_timer, &attr_dyn_tick_int);
- ret = sysdev_create_file(&device_timer, &attr_dyn_tick_dbg);
-
if (dyn_tick_cfg->arch_init == NULL ||
!(dyn_tick->state & DYN_TICK_SUITABLE))
return -ENODEV;
@@ -245,6 +241,10 @@
printk(KERN_WARNING "dyn-tick: Init failed\n");
return -ENODEV;
}
+
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_state);
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_int);
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_dbg);
printk(KERN_INFO "dyn-tick: Timer using dynamic tick\n");
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-07 8:21 ` Tony Lindgren
@ 2005-04-07 9:26 ` Alexander Nyberg
2005-04-08 6:22 ` Tony Lindgren
2005-04-07 21:35 ` Frank Sorenson
1 sibling, 1 reply; 34+ messages in thread
From: Alexander Nyberg @ 2005-04-07 9:26 UTC (permalink / raw)
To: Tony Lindgren
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, Thomas Renninger
> > > Here's an updated dyn-tick patch. Some minor fixes:
> >
> > Doesn't look so good here. I get this with 2.6.12-rc2 (plus a few other patches).
> > Disabling Dynamic Tick makes everything happy again (it boots).
> >
> > [4294688.655000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
>
> Thanks for trying it out. What kind of hardware do you have? Does it
> have HPET? It looks like no suitable timer for dyn-tick is found...
> Maybe the following patch helps?
===== arch/i386/kernel/Makefile 1.67 vs edited =====
--- 1.67/arch/i386/kernel/Makefile 2005-01-26 06:21:13 +01:00
+++ edited/arch/i386/kernel/Makefile 2005-04-07 11:21:19 +02:00
@@ -32,6 +32,7 @@ obj-$(CONFIG_ACPI_SRAT) += srat.o
obj-$(CONFIG_HPET_TIMER) += time_hpet.o
obj-$(CONFIG_EFI) += efi.o efi_stub.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick.o
EXTRA_AFLAGS := -traditional
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-07 8:21 ` Tony Lindgren
2005-04-07 9:26 ` Alexander Nyberg
@ 2005-04-07 21:35 ` Frank Sorenson
2005-04-07 22:20 ` Frank Sorenson
1 sibling, 1 reply; 34+ messages in thread
From: Frank Sorenson @ 2005-04-07 21:35 UTC (permalink / raw)
To: linux-kernel
Cc: Benjamin Herrenschmidt, Pavel Machek, Arjan van de Ven,
Martin Schwidefsky, Andrea Arcangeli, George Anzinger,
Thomas Gleixner, john stultz, Zwane Mwaikambo, Lee Revell,
Thomas Renninger
[-- Attachment #1: Type: text/plain, Size: 1633 bytes --]
Tony Lindgren wrote:
> Thanks for trying it out. What kind of hardware do you have? Does it
> have HPET? It looks like no suitable timer for dyn-tick is found...
> Maybe the following patch helps?
>
> Tony
Does 'different crash' qualify as "helping"? :)
With this additional patch, I get this line followed by a system hang:
[4294688.246000] dyn-tick: Maximum ticks to skip limited to 2693
With "nmi_watchdog=1", the "dyn-tick: Maximum..." line is followed by
(my serial console stops logging):
<4>[4294688.741000] NMI Watchdog detected LOCKUP on CPU0, eip c011a2ab,
registers:
Modules linked in:
CPU: 0
EIP: 0060:[<c011a2ab>] Not tainted VLI
EFLAGS: 00000046 (2.6.12-rc2-dyntick)
EIP is at smp_apic_timer_interrupt
... etc ...
This is on my Dell Inspiron 9200:
/proc/cpuinfo:
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 13
model name : Intel(R) Pentium(R) M processor 2.00GHz
stepping : 6
cpu MHz : 598.130
cache size : 2048 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr mce cx8 apic sep mtrr pge mca
cmov pat clflush dts acpi mmx fxsr sse sse2 ss tm pbe est tm2
bogomips : 1183.74
Attached are the serial log and the .config. HPET is enabled, and
appears to be detected.
Let me know if you need any additional info or need me to try anything
else out.
Frank
--
Frank Sorenson - KD7TZK
Systems Manager, Computer Science Department
Brigham Young University
frank@tuxrocks.com
[-- Attachment #2: config-2.6.12-rc2 --]
[-- Type: text/plain, Size: 45013 bytes --]
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.12-rc2
# Thu Apr 7 13:09:54 2005
#
CONFIG_X86=y
CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
#
# General setup
#
CONFIG_LOCALVERSION="-dyntick"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
CONFIG_SYSCTL=y
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_HOTPLUG=y
CONFIG_KOBJECT_UEVENT=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_KALLSYMS_EXTRA_PASS=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
#
# Loadable module support
#
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
CONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# Processor type and features
#
CONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_X86_BIGSMP is not set
# CONFIG_X86_VISWS is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_ES7000 is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
CONFIG_MPENTIUMM=y
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MGEODE is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
CONFIG_X86_GENERIC=y
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_L1_CACHE_SHIFT=7
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_NO_IDLE_HZ=y
# CONFIG_SMP is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_BKL=y
CONFIG_X86_UP_APIC=y
CONFIG_X86_UP_IOAPIC=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_TSC=y
CONFIG_X86_MCE=y
# CONFIG_X86_MCE_NONFATAL is not set
# CONFIG_X86_MCE_P4THERMAL is not set
# CONFIG_TOSHIBA is not set
CONFIG_I8K=m
CONFIG_MICROCODE=m
CONFIG_X86_MSR=m
CONFIG_X86_CPUID=m
#
# Firmware Drivers
#
CONFIG_EDD=m
# CONFIG_NOHIGHMEM is not set
CONFIG_HIGHMEM4G=y
# CONFIG_HIGHMEM64G is not set
CONFIG_HIGHMEM=y
CONFIG_HIGHPTE=y
# CONFIG_MATH_EMULATION is not set
CONFIG_MTRR=y
# CONFIG_EFI is not set
CONFIG_HAVE_DEC_LOCK=y
CONFIG_REGPARM=y
CONFIG_SECCOMP=y
#
# Power management options (ACPI, APM)
#
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_SOFTWARE_SUSPEND is not set
#
# ACPI (Advanced Configuration and Power Interface) Support
#
CONFIG_ACPI=y
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_SLEEP_PROC_FS=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_ASUS=m
CONFIG_ACPI_IBM=m
CONFIG_ACPI_TOSHIBA=m
CONFIG_ACPI_BLACKLIST_YEAR=2001
CONFIG_ACPI_DEBUG=y
CONFIG_ACPI_BUS=y
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=m
#
# APM (Advanced Power Management) BIOS Support
#
CONFIG_APM=y
# CONFIG_APM_IGNORE_USER_SUSPEND is not set
# CONFIG_APM_DO_ENABLE is not set
CONFIG_APM_CPU_IDLE=y
# CONFIG_APM_DISPLAY_BLANK is not set
CONFIG_APM_RTC_IS_GMT=y
# CONFIG_APM_ALLOW_INTS is not set
# CONFIG_APM_REAL_MODE_POWER_OFF is not set
#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_DEBUG=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_STAT_DETAILS=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
#
# CPUFreq processor drivers
#
CONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_POWERNOW_K6 is not set
# CONFIG_X86_POWERNOW_K7 is not set
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_GX_SUSPMOD is not set
CONFIG_X86_SPEEDSTEP_CENTRINO=y
CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y
CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y
CONFIG_X86_SPEEDSTEP_ICH=y
# CONFIG_X86_SPEEDSTEP_SMI is not set
# CONFIG_X86_P4_CLOCKMOD is not set
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
# CONFIG_X86_LONGRUN is not set
# CONFIG_X86_LONGHAUL is not set
#
# shared options
#
# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
CONFIG_X86_SPEEDSTEP_LIB=y
# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
#
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
#
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
# CONFIG_PCIEPORTBUS is not set
# CONFIG_PCI_MSI is not set
CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y
# CONFIG_PCI_DEBUG is not set
CONFIG_ISA=y
# CONFIG_EISA is not set
# CONFIG_MCA is not set
# CONFIG_SCx200 is not set
#
# PCCARD (PCMCIA/CardBus) support
#
CONFIG_PCCARD=y
# CONFIG_PCMCIA_DEBUG is not set
CONFIG_PCMCIA=y
CONFIG_CARDBUS=y
#
# PC-card bridges
#
CONFIG_YENTA=y
CONFIG_PD6729=y
CONFIG_I82092=y
CONFIG_I82365=y
CONFIG_TCIC=y
CONFIG_PCMCIA_PROBE=y
CONFIG_PCCARD_NONSTATIC=y
#
# PCI Hotplug Support
#
CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_FAKE is not set
# CONFIG_HOTPLUG_PCI_COMPAQ is not set
# CONFIG_HOTPLUG_PCI_IBM is not set
CONFIG_HOTPLUG_PCI_ACPI=m
# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_SHPC is not set
#
# Executable file formats
#
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_MISC=y
#
# Device Drivers
#
#
# Generic Driver Options
#
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_DEBUG_DRIVER=y
#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set
#
# Parallel port support
#
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y
CONFIG_PARPORT_SERIAL=m
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
# CONFIG_PARPORT_PC_PCMCIA is not set
CONFIG_PARPORT_NOT_PC=y
# CONFIG_PARPORT_GSC is not set
CONFIG_PARPORT_1284=y
#
# Plug and Play support
#
CONFIG_PNP=y
# CONFIG_PNP_DEBUG is not set
#
# Protocols
#
CONFIG_ISAPNP=y
# CONFIG_PNPBIOS is not set
CONFIG_PNPACPI=y
#
# Block devices
#
CONFIG_BLK_DEV_FD=m
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
CONFIG_BLK_CPQ_DA=m
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_CRYPTOLOOP=m
CONFIG_BLK_DEV_NBD=m
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_LBD=y
CONFIG_CDROM_PKTCDVD=m
CONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_ATA_OVER_ETH is not set
#
# ATA/ATAPI/MFM/RLL support
#
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
# CONFIG_BLK_DEV_IDECS is not set
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set
CONFIG_BLK_DEV_IDEFLOPPY=y
CONFIG_BLK_DEV_IDESCSI=m
# CONFIG_IDE_TASK_IOCTL is not set
#
# IDE chipset support/bugfixes
#
CONFIG_IDE_GENERIC=y
# CONFIG_BLK_DEV_CMD640 is not set
CONFIG_BLK_DEV_IDEPNP=y
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_SHARE_IRQ=y
# CONFIG_BLK_DEV_OFFBOARD is not set
CONFIG_BLK_DEV_GENERIC=y
# CONFIG_BLK_DEV_OPTI621 is not set
CONFIG_BLK_DEV_RZ1000=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
# CONFIG_IDEDMA_PCI_AUTO is not set
# CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_BLK_DEV_ATIIXP is not set
# CONFIG_BLK_DEV_CMD64X is not set
# CONFIG_BLK_DEV_TRIFLEX is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5520 is not set
# CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_BLK_DEV_HPT366 is not set
# CONFIG_BLK_DEV_SC1200 is not set
CONFIG_BLK_DEV_PIIX=y
# CONFIG_BLK_DEV_NS87415 is not set
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
# CONFIG_BLK_DEV_SVWKS is not set
# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
CONFIG_IDE_CHIPSETS=y
#
# Note: most of these also require special kernel boot parameters
#
# CONFIG_BLK_DEV_4DRIVES is not set
# CONFIG_BLK_DEV_ALI14XX is not set
# CONFIG_BLK_DEV_DTC2278 is not set
# CONFIG_BLK_DEV_HT6560B is not set
# CONFIG_BLK_DEV_QD65XX is not set
# CONFIG_BLK_DEV_UMC8672 is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_HD is not set
#
# SCSI device support
#
CONFIG_SCSI=m
CONFIG_SCSI_PROC_FS=y
#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=m
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=m
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
#
# SCSI Transport Attributes
#
# CONFIG_SCSI_SPI_ATTRS is not set
# CONFIG_SCSI_FC_ATTRS is not set
# CONFIG_SCSI_ISCSI_ATTRS is not set
#
# SCSI low-level drivers
#
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_7000FASST is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AHA152X is not set
# CONFIG_SCSI_AHA1542 is not set
# CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_IN2000 is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_DTC3280 is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_GENERIC_NCR5380 is not set
# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_PPA is not set
CONFIG_SCSI_IMM=m
# CONFIG_SCSI_IZIP_EPP16 is not set
# CONFIG_SCSI_IZIP_SLOW_CTR is not set
# CONFIG_SCSI_NCR53C406A is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_PAS16 is not set
# CONFIG_SCSI_PSI240I is not set
# CONFIG_SCSI_QLOGIC_FAS is not set
# CONFIG_SCSI_QLOGIC_FC is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
CONFIG_SCSI_QLA2XXX=m
# CONFIG_SCSI_QLA21XX is not set
# CONFIG_SCSI_QLA22XX is not set
# CONFIG_SCSI_QLA2300 is not set
# CONFIG_SCSI_QLA2322 is not set
# CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_SYM53C416 is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_T128 is not set
# CONFIG_SCSI_U14_34F is not set
# CONFIG_SCSI_ULTRASTOR is not set
# CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set
#
# PCMCIA SCSI adapter support
#
# CONFIG_PCMCIA_AHA152X is not set
# CONFIG_PCMCIA_FDOMAIN is not set
# CONFIG_PCMCIA_NINJA_SCSI is not set
# CONFIG_PCMCIA_QLOGIC is not set
# CONFIG_PCMCIA_SYM53C500 is not set
#
# Old CD-ROM drivers (not SCSI, not IDE)
#
# CONFIG_CD_NO_IDESCSI is not set
#
# Multi-device support (RAID and LVM)
#
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
CONFIG_MD_RAID1=m
# CONFIG_MD_RAID10 is not set
CONFIG_MD_RAID5=m
# CONFIG_MD_RAID6 is not set
# CONFIG_MD_MULTIPATH is not set
# CONFIG_MD_FAULTY is not set
# CONFIG_BLK_DEV_DM is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
#
# IEEE 1394 (FireWire) support
#
CONFIG_IEEE1394=y
#
# Subsystem Options
#
# CONFIG_IEEE1394_VERBOSEDEBUG is not set
CONFIG_IEEE1394_OUI_DB=y
# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
#
# Device Drivers
#
# CONFIG_IEEE1394_PCILYNX is not set
CONFIG_IEEE1394_OHCI1394=y
#
# Protocol Drivers
#
CONFIG_IEEE1394_VIDEO1394=y
CONFIG_IEEE1394_SBP2=m
# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
# CONFIG_IEEE1394_ETH1394 is not set
CONFIG_IEEE1394_DV1394=m
CONFIG_IEEE1394_RAWIO=m
CONFIG_IEEE1394_CMP=m
CONFIG_IEEE1394_AMDTP=m
#
# I2O device support
#
CONFIG_I2O=y
CONFIG_I2O_CONFIG=m
CONFIG_I2O_BLOCK=m
# CONFIG_I2O_SCSI is not set
CONFIG_I2O_PROC=y
#
# Networking support
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
CONFIG_NET_KEY=m
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_FWMARK=y
CONFIG_IP_ROUTE_MULTIPATH=y
# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set
CONFIG_IP_ROUTE_VERBOSE=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=y
CONFIG_NET_IPGRE=y
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
CONFIG_INET_AH=m
CONFIG_INET_ESP=m
CONFIG_INET_IPCOMP=m
CONFIG_INET_TUNNEL=y
CONFIG_IP_TCPDIAG=y
CONFIG_IP_TCPDIAG_IPV6=y
#
# IP: Virtual Server Configuration
#
CONFIG_IP_VS=m
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IPV6=y
CONFIG_IPV6_PRIVACY=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_INET6_TUNNEL=m
CONFIG_IPV6_TUNNEL=m
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_BRIDGE_NETFILTER=y
#
# IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_CT_ACCT=y
# CONFIG_IP_NF_CONNTRACK_MARK is not set
CONFIG_IP_NF_CT_PROTO_SCTP=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_AMANDA=m
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_IPRANGE=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_RECENT=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_MATCH_PHYSDEV=m
CONFIG_IP_NF_MATCH_ADDRTYPE=m
CONFIG_IP_NF_MATCH_REALM=m
CONFIG_IP_NF_MATCH_SCTP=m
CONFIG_IP_NF_MATCH_COMMENT=m
# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_SAME=m
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_NAT_TFTP=m
CONFIG_IP_NF_NAT_AMANDA=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_CLASSIFY=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_TARGET_NOTRACK=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
#
# IPv6: Netfilter Configuration (EXPERIMENTAL)
#
# CONFIG_IP6_NF_QUEUE is not set
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_LIMIT=m
CONFIG_IP6_NF_MATCH_MAC=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_MULTIPORT=m
CONFIG_IP6_NF_MATCH_OWNER=m
CONFIG_IP6_NF_MATCH_MARK=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_AHESP=m
CONFIG_IP6_NF_MATCH_LENGTH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_PHYSDEV=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_TARGET_MARK=m
CONFIG_IP6_NF_RAW=m
#
# Bridge: Netfilter Configuration
#
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
CONFIG_BRIDGE_EBT_T_NAT=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
# CONFIG_BRIDGE_EBT_ULOG is not set
CONFIG_XFRM=y
CONFIG_XFRM_USER=y
#
# SCTP Configuration (EXPERIMENTAL)
#
CONFIG_IP_SCTP=m
# CONFIG_SCTP_DBG_MSG is not set
# CONFIG_SCTP_DBG_OBJCNT is not set
# CONFIG_SCTP_HMAC_NONE is not set
# CONFIG_SCTP_HMAC_SHA1 is not set
CONFIG_SCTP_HMAC_MD5=y
# CONFIG_ATM is not set
CONFIG_BRIDGE=m
CONFIG_VLAN_8021Q=m
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
CONFIG_NET_DIVERT=y
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CLK_JIFFIES=y
# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
# CONFIG_NET_SCH_CLK_CPU is not set
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
# CONFIG_NET_CLS_BASIC is not set
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_PERF=y
CONFIG_NET_CLS_IND=y
# CONFIG_CLS_U32_MARK is not set
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
# CONFIG_NET_EMATCH is not set
# CONFIG_NET_CLS_ACT is not set
CONFIG_NET_CLS_POLICE=y
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_RX is not set
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y
CONFIG_DUMMY=m
CONFIG_BONDING=m
CONFIG_EQUALIZER=m
CONFIG_TUN=m
# CONFIG_NET_SB1000 is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
#
# Tulip family network device support
#
# CONFIG_NET_TULIP is not set
# CONFIG_AT1700 is not set
# CONFIG_DEPCA is not set
# CONFIG_HP100 is not set
# CONFIG_NET_ISA is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_AC3200 is not set
# CONFIG_APRICOT is not set
CONFIG_B44=y
# CONFIG_FORCEDETH is not set
# CONFIG_CS89x0 is not set
# CONFIG_DGRS is not set
CONFIG_EEPRO100=m
CONFIG_E100=m
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
CONFIG_NE2K_PCI=y
# CONFIG_8139CP is not set
# CONFIG_8139TOO is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
CONFIG_NET_POCKET=y
CONFIG_ATP=m
CONFIG_DE600=m
CONFIG_DE620=m
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_E1000 is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set
# CONFIG_TIGON3 is not set
#
# Ethernet (10000 Mbit)
#
# CONFIG_IXGB is not set
# CONFIG_S2IO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
#
# Wireless LAN (non-hamradio)
#
CONFIG_NET_RADIO=y
#
# Obsolete Wireless cards support (pre-802.11)
#
# CONFIG_STRIP is not set
# CONFIG_ARLAN is not set
CONFIG_WAVELAN=m
# CONFIG_PCMCIA_WAVELAN is not set
# CONFIG_PCMCIA_NETWAVE is not set
#
# Wireless 802.11 Frequency Hopping cards support
#
# CONFIG_PCMCIA_RAYCS is not set
#
# Wireless 802.11b ISA/PCI cards support
#
CONFIG_AIRO=m
CONFIG_HERMES=m
CONFIG_PLX_HERMES=m
CONFIG_TMD_HERMES=m
CONFIG_PCI_HERMES=m
CONFIG_ATMEL=m
CONFIG_PCI_ATMEL=m
#
# Wireless 802.11b Pcmcia/Cardbus cards support
#
CONFIG_PCMCIA_HERMES=m
CONFIG_AIRO_CS=m
# CONFIG_PCMCIA_ATMEL is not set
# CONFIG_PCMCIA_WL3501 is not set
#
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
#
CONFIG_PRISM54=m
CONFIG_NET_WIRELESS=y
#
# PCMCIA network device support
#
CONFIG_NET_PCMCIA=y
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_PCMCIA_AXNET=m
#
# Wan interfaces
#
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
CONFIG_PPP=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_BSDCOMP=y
CONFIG_PPPOE=y
CONFIG_SLIP=y
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLIP_SMART=y
# CONFIG_SLIP_MODE_SLIP6 is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
CONFIG_NETCONSOLE=y
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Telephony Support
#
# CONFIG_PHONE is not set
#
# Input device support
#
CONFIG_INPUT=y
#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_INPORT is not set
# CONFIG_MOUSE_LOGIBM is not set
# CONFIG_MOUSE_PC110PAD is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y
CONFIG_INPUT_PCSPKR=y
CONFIG_INPUT_UINPUT=m
#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
# CONFIG_DIGIEPCA is not set
# CONFIG_ESPSERIAL is not set
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
# CONFIG_ISI is not set
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set
# CONFIG_SX is not set
# CONFIG_RIO is not set
# CONFIG_STALDRV is not set
#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
# CONFIG_SERIAL_8250_CS is not set
# CONFIG_SERIAL_8250_ACPI is not set
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
# CONFIG_SERIAL_8250_MANY_PORTS is not set
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_RSA is not set
#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_PRINTER=y
CONFIG_LP_CONSOLE=y
CONFIG_PPDEV=m
CONFIG_TIPAR=m
#
# IPMI
#
CONFIG_IPMI_HANDLER=y
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=y
CONFIG_IPMI_SI=y
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
#
# Watchdog Cards
#
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=y
# CONFIG_ACQUIRE_WDT is not set
# CONFIG_ADVANTECH_WDT is not set
# CONFIG_ALIM1535_WDT is not set
# CONFIG_ALIM7101_WDT is not set
# CONFIG_SC520_WDT is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
# CONFIG_WAFER_WDT is not set
# CONFIG_I8XX_TCO is not set
# CONFIG_SC1200_WDT is not set
# CONFIG_60XX_WDT is not set
# CONFIG_CPU5_WDT is not set
# CONFIG_W83627HF_WDT is not set
# CONFIG_W83877F_WDT is not set
# CONFIG_MACHZ_WDT is not set
#
# ISA-based Watchdog Cards
#
# CONFIG_PCWATCHDOG is not set
# CONFIG_MIXCOMWD is not set
# CONFIG_WDT is not set
#
# PCI-based Watchdog Cards
#
# CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set
#
# USB-based Watchdog Cards
#
# CONFIG_USBPCWATCHDOG is not set
CONFIG_HW_RANDOM=m
# CONFIG_NVRAM is not set
CONFIG_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
CONFIG_AGP=y
# CONFIG_AGP_ALI is not set
CONFIG_AGP_ATI=y
# CONFIG_AGP_AMD is not set
# CONFIG_AGP_AMD64 is not set
CONFIG_AGP_INTEL=y
# CONFIG_AGP_NVIDIA is not set
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_SWORKS is not set
# CONFIG_AGP_VIA is not set
# CONFIG_AGP_EFFICEON is not set
CONFIG_DRM=y
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not set
CONFIG_DRM_RADEON=m
# CONFIG_DRM_I810 is not set
# CONFIG_DRM_I830 is not set
# CONFIG_DRM_I915 is not set
# CONFIG_DRM_MGA is not set
# CONFIG_DRM_SIS is not set
#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not set
# CONFIG_MWAVE is not set
# CONFIG_RAW_DRIVER is not set
CONFIG_HPET=y
# CONFIG_HPET_RTC_IRQ is not set
CONFIG_HPET_MMAP=y
CONFIG_HANGCHECK_TIMER=y
#
# TPM devices
#
# CONFIG_TCG_TPM is not set
#
# I2C support
#
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
#
# I2C Algorithms
#
CONFIG_I2C_ALGOBIT=y
CONFIG_I2C_ALGOPCF=m
CONFIG_I2C_ALGOPCA=m
#
# I2C Hardware Bus support
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
# CONFIG_I2C_AMD756 is not set
# CONFIG_I2C_AMD8111 is not set
# CONFIG_I2C_ELEKTOR is not set
CONFIG_I2C_I801=m
CONFIG_I2C_I810=m
CONFIG_I2C_PIIX4=m
CONFIG_I2C_ISA=m
# CONFIG_I2C_NFORCE2 is not set
# CONFIG_I2C_PARPORT is not set
# CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_I2C_PROSAVAGE is not set
# CONFIG_I2C_SAVAGE4 is not set
# CONFIG_SCx200_ACB is not set
CONFIG_I2C_SIS5595=m
CONFIG_I2C_SIS630=m
CONFIG_I2C_SIS96X=m
CONFIG_I2C_STUB=m
# CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set
# CONFIG_I2C_VOODOO3 is not set
# CONFIG_I2C_PCA_ISA is not set
#
# Hardware Sensors Chip support
#
CONFIG_I2C_SENSOR=m
CONFIG_SENSORS_ADM1021=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1026=m
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_DS1621=m
CONFIG_SENSORS_FSCHER=m
CONFIG_SENSORS_FSCPOS=m
CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_GL520SM=m
CONFIG_SENSORS_IT87=m
CONFIG_SENSORS_LM63=m
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m
CONFIG_SENSORS_LM85=m
CONFIG_SENSORS_LM87=m
CONFIG_SENSORS_LM90=m
CONFIG_SENSORS_LM92=m
CONFIG_SENSORS_MAX1619=m
CONFIG_SENSORS_PC87360=m
CONFIG_SENSORS_SMSC47B397=m
CONFIG_SENSORS_SIS5595=m
CONFIG_SENSORS_SMSC47M1=m
CONFIG_SENSORS_VIA686A=m
CONFIG_SENSORS_W83781D=m
CONFIG_SENSORS_W83L785TS=m
CONFIG_SENSORS_W83627HF=m
#
# Other I2C Chip support
#
CONFIG_SENSORS_DS1337=m
CONFIG_SENSORS_EEPROM=m
CONFIG_SENSORS_PCF8574=m
CONFIG_SENSORS_PCF8591=m
CONFIG_SENSORS_RTC8564=m
CONFIG_I2C_DEBUG_CORE=y
CONFIG_I2C_DEBUG_ALGO=y
CONFIG_I2C_DEBUG_BUS=y
CONFIG_I2C_DEBUG_CHIP=y
#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set
#
# Misc devices
#
# CONFIG_IBM_ASM is not set
#
# Multimedia devices
#
CONFIG_VIDEO_DEV=m
#
# Video For Linux
#
#
# Video Adapters
#
CONFIG_VIDEO_BT848=m
CONFIG_VIDEO_PMS=m
CONFIG_VIDEO_BWQCAM=m
CONFIG_VIDEO_CQCAM=m
CONFIG_VIDEO_W9966=m
CONFIG_VIDEO_CPIA=m
CONFIG_VIDEO_CPIA_PP=m
CONFIG_VIDEO_CPIA_USB=m
CONFIG_VIDEO_SAA5246A=m
CONFIG_VIDEO_SAA5249=m
CONFIG_TUNER_3036=m
CONFIG_VIDEO_STRADIS=m
CONFIG_VIDEO_ZORAN=m
CONFIG_VIDEO_ZORAN_BUZ=m
CONFIG_VIDEO_ZORAN_DC10=m
CONFIG_VIDEO_ZORAN_DC30=m
CONFIG_VIDEO_ZORAN_LML33=m
CONFIG_VIDEO_ZORAN_LML33R10=m
CONFIG_VIDEO_SAA7134=m
CONFIG_VIDEO_MXB=m
CONFIG_VIDEO_DPC=m
CONFIG_VIDEO_HEXIUM_ORION=m
CONFIG_VIDEO_HEXIUM_GEMINI=m
CONFIG_VIDEO_CX88=m
CONFIG_VIDEO_OVCAMCHIP=m
#
# Radio Adapters
#
CONFIG_RADIO_CADET=m
CONFIG_RADIO_RTRACK=m
CONFIG_RADIO_RTRACK2=m
CONFIG_RADIO_AZTECH=m
CONFIG_RADIO_GEMTEK=m
CONFIG_RADIO_GEMTEK_PCI=m
CONFIG_RADIO_MAXIRADIO=m
CONFIG_RADIO_MAESTRO=m
CONFIG_RADIO_SF16FMI=m
CONFIG_RADIO_SF16FMR2=m
CONFIG_RADIO_TERRATEC=m
CONFIG_RADIO_TRUST=m
CONFIG_RADIO_TYPHOON=m
CONFIG_RADIO_TYPHOON_PROC_FS=y
CONFIG_RADIO_ZOLTRIX=m
#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set
CONFIG_VIDEO_SAA7146=m
CONFIG_VIDEO_SAA7146_VV=m
CONFIG_VIDEO_VIDEOBUF=m
CONFIG_VIDEO_TUNER=m
CONFIG_VIDEO_BUF=m
CONFIG_VIDEO_BTCX=m
CONFIG_VIDEO_IR=m
CONFIG_VIDEO_TVEEPROM=m
#
# Graphics support
#
CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SOFT_CURSOR=y
# CONFIG_FB_MACMODES is not set
CONFIG_FB_MODE_HELPERS=y
# CONFIG_FB_TILEBLITTING is not set
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
# CONFIG_FB_VGA16 is not set
CONFIG_FB_VESA=y
CONFIG_VIDEO_SELECT=y
# CONFIG_FB_HGA is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_I810 is not set
# CONFIG_FB_INTEL is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON_OLD is not set
CONFIG_FB_RADEON=y
CONFIG_FB_RADEON_I2C=y
CONFIG_FB_RADEON_DEBUG=y
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_SAVAGE is not set
# CONFIG_FB_SIS is not set
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_TRIDENT is not set
# CONFIG_FB_GEODE is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_VIRTUAL is not set
#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_MDA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
#
# Logo configuration
#
CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_LOGO_LINUX_CLUT224=y
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
#
# Sound
#
CONFIG_SOUND=y
#
# Advanced Linux Sound Architecture
#
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_HWDEP=m
CONFIG_SND_RAWMIDI=m
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_RTCTIMER=m
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
#
# Generic devices
#
CONFIG_SND_MPU401_UART=m
CONFIG_SND_DUMMY=m
CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m
# CONFIG_SND_SERIAL_U16550 is not set
CONFIG_SND_MPU401=m
#
# ISA devices
#
# CONFIG_SND_AD1816A is not set
# CONFIG_SND_AD1848 is not set
# CONFIG_SND_CS4231 is not set
# CONFIG_SND_CS4232 is not set
# CONFIG_SND_CS4236 is not set
# CONFIG_SND_ES968 is not set
# CONFIG_SND_ES1688 is not set
# CONFIG_SND_ES18XX is not set
# CONFIG_SND_GUSCLASSIC is not set
# CONFIG_SND_GUSEXTREME is not set
# CONFIG_SND_GUSMAX is not set
# CONFIG_SND_INTERWAVE is not set
# CONFIG_SND_INTERWAVE_STB is not set
# CONFIG_SND_OPTI92X_AD1848 is not set
# CONFIG_SND_OPTI92X_CS4231 is not set
# CONFIG_SND_OPTI93X is not set
# CONFIG_SND_SB8 is not set
# CONFIG_SND_SB16 is not set
# CONFIG_SND_SBAWE is not set
# CONFIG_SND_WAVEFRONT is not set
# CONFIG_SND_ALS100 is not set
# CONFIG_SND_AZT2320 is not set
# CONFIG_SND_CMI8330 is not set
# CONFIG_SND_DT019X is not set
# CONFIG_SND_OPL3SA2 is not set
# CONFIG_SND_SGALAXY is not set
# CONFIG_SND_SSCAPE is not set
#
# PCI devices
#
CONFIG_SND_AC97_CODEC=y
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AZT3328 is not set
CONFIG_SND_BT87X=m
# CONFIG_SND_BT87X_OVERCLOCK is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_EMU10K1 is not set
CONFIG_SND_EMU10K1X=m
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_YMFPCI is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_FM801 is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
CONFIG_SND_INTEL8X0=y
CONFIG_SND_INTEL8X0M=y
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_VIA82XX is not set
CONFIG_SND_VIA82XX_MODEM=m
# CONFIG_SND_VX222 is not set
# CONFIG_SND_HDA_INTEL is not set
#
# USB devices
#
CONFIG_SND_USB_AUDIO=m
CONFIG_SND_USB_USX2Y=m
#
# PCMCIA devices
#
# CONFIG_SND_VXPOCKET is not set
# CONFIG_SND_VXP440 is not set
# CONFIG_SND_PDAUDIOCF is not set
#
# Open Sound System
#
# CONFIG_SOUND_PRIME is not set
#
# USB support
#
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_BANDWIDTH is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
CONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG is not set
#
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_SPLIT_ISO=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set
#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set
CONFIG_USB_BLUETOOTH_TTY=y
# CONFIG_USB_MIDI is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_DATAFAB=y
CONFIG_USB_STORAGE_FREECOM=y
CONFIG_USB_STORAGE_ISD200=y
CONFIG_USB_STORAGE_DPCM=y
# CONFIG_USB_STORAGE_USBAT is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_SDDR55 is not set
CONFIG_USB_STORAGE_JUMPSHOT=y
#
# USB Input Devices
#
CONFIG_USB_HID=y
CONFIG_USB_HIDINPUT=y
CONFIG_HID_FF=y
CONFIG_HID_PID=y
CONFIG_LOGITECH_FF=y
CONFIG_THRUSTMASTER_FF=y
CONFIG_USB_HIDDEV=y
# CONFIG_USB_AIPTEK is not set
# CONFIG_USB_WACOM is not set
# CONFIG_USB_KBTAB is not set
# CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set
# CONFIG_USB_EGALAX is not set
# CONFIG_USB_XPAD is not set
CONFIG_USB_ATI_REMOTE=m
#
# USB Imaging devices
#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
#
# USB Multimedia devices
#
CONFIG_USB_DABUSB=m
CONFIG_USB_VICAM=m
CONFIG_USB_DSBR=m
CONFIG_USB_IBMCAM=m
CONFIG_USB_KONICAWC=m
CONFIG_USB_OV511=m
CONFIG_USB_SE401=m
CONFIG_USB_SN9C102=m
CONFIG_USB_STV680=m
CONFIG_USB_W9968CF=m
CONFIG_USB_PWC=m
#
# USB Network Adapters
#
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_USBNET=m
#
# USB Host-to-Host Cables
#
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_GENESYS=y
CONFIG_USB_NET1080=y
CONFIG_USB_PL2301=y
CONFIG_USB_KC2190=y
#
# Intelligent USB Devices/Gadgets
#
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_ZAURUS=y
CONFIG_USB_CDCETHER=y
#
# USB Network Adapters
#
CONFIG_USB_AX8817X=y
# CONFIG_USB_ZD1201 is not set
CONFIG_USB_MON=y
#
# USB port drivers
#
CONFIG_USB_USS720=m
#
# USB Serial Converter support
#
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_CONSOLE=y
CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_BELKIN=y
CONFIG_USB_SERIAL_WHITEHEAT=y
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=y
CONFIG_USB_SERIAL_CP2101=y
CONFIG_USB_SERIAL_CYPRESS_M8=y
# CONFIG_USB_SERIAL_EMPEG is not set
CONFIG_USB_SERIAL_FTDI_SIO=y
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_IPAQ is not set
# CONFIG_USB_SERIAL_IR is not set
CONFIG_USB_SERIAL_EDGEPORT=y
CONFIG_USB_SERIAL_EDGEPORT_TI=y
# CONFIG_USB_SERIAL_GARMIN is not set
# CONFIG_USB_SERIAL_IPW is not set
CONFIG_USB_SERIAL_KEYSPAN_PDA=y
CONFIG_USB_SERIAL_KEYSPAN=y
CONFIG_USB_SERIAL_KEYSPAN_MPR=y
CONFIG_USB_SERIAL_KEYSPAN_USA28=y
CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
CONFIG_USB_SERIAL_KEYSPAN_USA19=y
CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
CONFIG_USB_SERIAL_KLSI=m
# CONFIG_USB_SERIAL_KOBIL_SCT is not set
CONFIG_USB_SERIAL_MCT_U232=y
CONFIG_USB_SERIAL_PL2303=y
CONFIG_USB_SERIAL_SAFE=m
CONFIG_USB_SERIAL_SAFE_PADDED=y
# CONFIG_USB_SERIAL_TI is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_XIRCOM is not set
CONFIG_USB_SERIAL_OMNINET=m
CONFIG_USB_EZUSB=y
#
# USB Miscellaneous drivers
#
CONFIG_USB_EMI62=m
# CONFIG_USB_EMI26 is not set
CONFIG_USB_AUERSWALD=m
CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
CONFIG_USB_LED=m
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGETKIT is not set
CONFIG_USB_PHIDGETSERVO=m
CONFIG_USB_IDMOUSE=m
CONFIG_USB_SISUSBVGA=m
CONFIG_USB_TEST=m
#
# USB ATM/DSL drivers
#
#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set
#
# MMC/SD Card support
#
# CONFIG_MMC is not set
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set
#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y
#
# XFS support
#
# CONFIG_XFS_FS is not set
CONFIG_MINIX_FS=m
CONFIG_ROMFS_FS=m
CONFIG_QUOTA=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y
#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_ZISOFS_FS=y
CONFIG_UDF_FS=m
CONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
# CONFIG_NTFS_FS is not set
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set
CONFIG_DEVPTS_FS_XATTR=y
CONFIG_DEVPTS_FS_SECURITY=y
CONFIG_TMPFS=y
CONFIG_TMPFS_XATTR=y
CONFIG_TMPFS_SECURITY=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
CONFIG_CRAMFS=m
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
#
# Network File Systems
#
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V4=y
CONFIG_NFS_DIRECTIO=y
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_TCP=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
CONFIG_RPCSEC_GSS_KRB5=y
# CONFIG_RPCSEC_GSS_SPKM3 is not set
CONFIG_SMB_FS=m
# CONFIG_SMB_NLS_DEFAULT is not set
CONFIG_CIFS=m
# CONFIG_CIFS_STATS is not set
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
# CONFIG_CIFS_EXPERIMENTAL is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not set
# CONFIG_OSF_PARTITION is not set
# CONFIG_AMIGA_PARTITION is not set
# CONFIG_ATARI_PARTITION is not set
# CONFIG_MAC_PARTITION is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
# CONFIG_LDM_PARTITION is not set
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_EFI_PARTITION is not set
#
# Native Language Support
#
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=m
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=m
#
# Profiling support
#
# CONFIG_PROFILING is not set
#
# Kernel hacking
#
CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_LOG_BUF_SHIFT=17
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
CONFIG_DEBUG_PREEMPT=y
CONFIG_DEBUG_SPINLOCK=y
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_HIGHMEM is not set
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_FS is not set
CONFIG_FRAME_POINTER=y
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_STACKOVERFLOW=y
# CONFIG_KPROBES is not set
CONFIG_DEBUG_STACK_USAGE=y
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_4KSTACKS is not set
CONFIG_X86_FIND_SMP_CONFIG=y
CONFIG_X86_MPPARSE=y
#
# Security options
#
# CONFIG_KEYS is not set
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_CAPABILITIES=y
# CONFIG_SECURITY_ROOTPLUG is not set
# CONFIG_SECURITY_SECLVL is not set
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
#
# Cryptographic options
#
CONFIG_CRYPTO=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_AES_586=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_KHAZAD=m
# CONFIG_CRYPTO_ANUBIS is not set
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_CRC32C=m
# CONFIG_CRYPTO_TEST is not set
#
# Hardware crypto devices
#
# CONFIG_CRYPTO_DEV_PADLOCK is not set
#
# Library routines
#
CONFIG_CRC_CCITT=y
CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_X86_BIOS_REBOOT=y
CONFIG_PC=y
[-- Attachment #3: dyntick.log --]
[-- Type: text/plain, Size: 4952 bytes --]
[4294667.296000] Linux version 2.6.12-rc2-dyntick (root@moebius.cs.byu.edu) (gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)) #2 Thu Apr 7 13:12:16 MDT 2005
[4294667.296000] BIOS-provided physical RAM map:
[4294667.296000] BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
[4294667.296000] BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
[4294667.296000] BIOS-e820: 0000000000100000 - 000000005ffae000 (usable)
[4294667.296000] BIOS-e820: 000000005ffae000 - 0000000060000000 (reserved)
[4294667.296000] BIOS-e820: 00000000feda0000 - 00000000fee00000 (reserved)
[4294667.296000] BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved)
[4294667.296000] 639MB HIGHMEM available.
[4294667.296000] 896MB LOWMEM available.
[4294667.296000] DMI 2.3 present.
[4294667.296000] ACPI: PM-Timer IO Port: 0x808
[4294667.296000] Allocating PCI resources starting at 60000000 (gap: 60000000:9eda0000)
[4294667.296000] Built 1 zonelists
[4294667.296000] Kernel command line: ro root=LABEL=/1 vga=794 lapic console=tty0 console=ttyUSB0,9600 psmouse.proto=exps i8k.ignore_dmi:bool=true netconsole=@128.187.171.101/eth0,5515@128.187.171.102/ single
[4294667.296000] Unknown boot option `i8k.ignore_dmi:bool=true': ignoring
[4294667.296000] netconsole: local port 6665
[4294667.296000] netconsole: local IP 128.187.171.101
[4294667.296000] netconsole: interface eth0
[4294667.296000] netconsole: remote port 5515
[4294667.296000] netconsole: remote IP 128.187.171.102
[4294667.296000] netcon[4294667.297000] Dentry cache hash table entries: 131072 (order:[4294667.471000] Mount-cache hash table entries: 512
[4294667.47[4294667.482000] tbxface-0118 [02] acpi_load_tables : ACPI[4294667.684000] dyn-tick: Registering dynamic tick timer v05030[4294667.783000] Executing all Device _STA and_INI methods:.....[4294667.959000] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 7) *11
[4294668.299000] options: [pci] [cardbus] [pm]
[4294668.30000[4294668.523000] pnp: 00:02: ioport range 0x806-0x807 has been r[4294668.597000] Total HugeTLB memory allocated, 0
[4294668.5970[4294668.616000] ACPI: PCI Interrupt 0000:01:00.0[A] -> Link [LN[4294668.938000] Starting monitor auto detection...
[4294669.301[4294671.375000] radeonfb: Monitor 2 type no found
[4294671.3750[4294671.375000] 320 x 480
[4294671.375000] 400 x 600
[4294671[4294671.375000] 1280 x 800
[4294671.375000] 1440 x 900
[42946[4294671.375000] vStart = 1201, vEnd = 1204, vTotal = 1250
[4294[4294672.578000] ACPI: Lid Switch [LID]
[4294672.578000] ACPI: P[4294673.083000] ipmi device interface version v33
[4294673.0830[4294673.129000] ACPI: PCI Interrupt 0000:00:1f.6[B] -> Link [LN[4294673.177000] PPP Deflate Compression module registered
[4294[4294677.438000] Uniform Multi-Platform E-IDE driver Revision: 7[4294677.714000] hda: HTS726060M9AT00, ATA DISK drive
[4294678.3[4294682.145000] Uniform CD-ROM driver Revision: 3.20
[4294682.3[4294682.399000] Yenta: CardBus bridge found at 0000:02:01.0 [10[4294682.783000] [<c02a9cbc>] kref_put+0x3c/0x80
[4294682.78400[4294682.805000] ACPI: PCI Interrupt 0000:00:1d.7[D] -> Link [LN[4294682.842000] uhci_hcd 0000:00:1d.0: Intel Corporation 82801D[4294682.979000] uhci_hcd 0000:00:1d.1: irq 11, io base 0x0000bf[4294683.060000] drivers/usb/class/bluetty.c: USB Bluetooth supp[4294683.264000] usbcore: registered new driver usbserial_generi[4294683.278000] drivers/usb/serial/cp2101.c: Silicon Labs CP210[4294683.292000] drivers/usb/serial/usb-serial.c: USB Serial sup[4294683.306000] drivers/usb/serial/io_ti.c: Edgeport USB Serial[4294683.319000] drivers/usb/serial/ftdi_sio.c: v1.4.1:USB FTDI [4294683.334000] usbcore: registered new driver keyspan_pda
[429[4294685.914000] usbcore: registered new driver pl2303
[4294685.[4294685.928000] I2O subsystem v$Rev$
[4294685.930000] i2o: max [4294685.951000] Advanced Linux Sound Architecture Driver Versio[4294686.081000] input: PS/2 Generic Mouse on isa0060/serio1
[4294686.769000] intel8x0_measure_ac97_clock: measured 49355 usecs
[4294686.770000] intel8x0: clocking to 48000
[4294686.781000] ACPI: PCI Interrupt 0000:00:1f.6[B] -> Link [LNKB] -> GSI 7 (level, low) -> IRQ 7
[4294686.884000] MC'97 1 converters and GPIO not ready (0xff00)
[4294686.890000] ALSA device list:
[4294686.891000] #0: Intel 82801DB-ICH4 with STAC9750,51 at 0xf8fff800, irq 7
[4294686.892000] #1: Intel 82801DB-ICH4 Modem at 0xd400, irq 7
[4294686.893000] NET: Registered protocol family 2
[4294686.904000] IP: routing cache hash table of 4096 buckets, 128Kbytes
[4294686.905000] TCP established hash table entries: 262144 (order: 9, 2097152 bytes)
[4294686.909000] TCP bind hash table entries: 65536 (order: 8, 1835008 bytes)
[4294686.914000] TCP: Hash tables configured (established 262144 bind 65536)
[4294686.915000] IPv4 over IPv4 tunneling driver
[4294686.917000] GRE over IPv4[4294686.919000] Initializing IPsec netlink socket
[4294686.9200[4294688.767000] dyn-tick: Maximum ticks to skip limited to 2693
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-07 21:35 ` Frank Sorenson
@ 2005-04-07 22:20 ` Frank Sorenson
2005-04-08 6:25 ` Tony Lindgren
0 siblings, 1 reply; 34+ messages in thread
From: Frank Sorenson @ 2005-04-07 22:20 UTC (permalink / raw)
To: Tony Lindgren
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Frank Sorenson wrote:
> Tony Lindgren wrote:
>
>>Thanks for trying it out. What kind of hardware do you have? Does it
>>have HPET? It looks like no suitable timer for dyn-tick is found...
>>Maybe the following patch helps?
>>
>>Tony
>
>
> Does 'different crash' qualify as "helping"? :)
Update:
The patch does seem to fix the crash. This "different crash" I
mentioned appears to be related to the netconsole I was using (serial
console produces stairstepping text, netconsole seems to duplicate
lines--go figure). Without netconsole, dynamic tick appears to be
working, so I'm not sure whether this is a netconsole bug or a dynamic
tick bug.
While dynamic tick no longer panics, with dynamic tick, my system slows
to whatever is slower than a crawl. It now takes 6 minutes 50 seconds
to boot all the way up, compared to 1 minute 35 seconds with my 2.6.12
kernel without the dynamic tick patch. I'm not sure where this slowdown
is occurring yet.
Frank
- --
Frank Sorenson - KD7TZK
Systems Manager, Computer Science Department
Brigham Young University
frank@tuxrocks.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFCVbJHaI0dwg4A47wRAmijAKCRgg9MTxrrNWKanMmmSS010BTWdgCeNMnJ
4YJWhHAcizMgZNH/+643Hvk=
=w9Ii
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-07 9:26 ` Alexander Nyberg
@ 2005-04-08 6:22 ` Tony Lindgren
0 siblings, 0 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-08 6:22 UTC (permalink / raw)
To: Alexander Nyberg
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, Thomas Renninger
* Alexander Nyberg <alexn@dsv.su.se> [050407 02:31]:
> > > > Here's an updated dyn-tick patch. Some minor fixes:
> > >
> > > Doesn't look so good here. I get this with 2.6.12-rc2 (plus a few other patches).
> > > Disabling Dynamic Tick makes everything happy again (it boots).
> > >
> > > [4294688.655000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
> >
> > Thanks for trying it out. What kind of hardware do you have? Does it
> > have HPET? It looks like no suitable timer for dyn-tick is found...
> > Maybe the following patch helps?
>
>
> ===== arch/i386/kernel/Makefile 1.67 vs edited =====
> --- 1.67/arch/i386/kernel/Makefile 2005-01-26 06:21:13 +01:00
> +++ edited/arch/i386/kernel/Makefile 2005-04-07 11:21:19 +02:00
> @@ -32,6 +32,7 @@ obj-$(CONFIG_ACPI_SRAT) += srat.o
> obj-$(CONFIG_HPET_TIMER) += time_hpet.o
> obj-$(CONFIG_EFI) += efi.o efi_stub.o
> obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
> +obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick.o
>
> EXTRA_AFLAGS := -traditional
Ah, that explains :) Thanks!
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Dynamic Tick version 050406-1
2005-04-07 22:20 ` Frank Sorenson
@ 2005-04-08 6:25 ` Tony Lindgren
2005-04-08 7:50 ` [PATCH] Updated: Dynamic Tick version 050408-1 Tony Lindgren
0 siblings, 1 reply; 34+ messages in thread
From: Tony Lindgren @ 2005-04-08 6:25 UTC (permalink / raw)
To: Frank Sorenson
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
* Frank Sorenson <frank@tuxrocks.com> [050407 15:21]:
> Frank Sorenson wrote:
> > Tony Lindgren wrote:
> >
> >>Thanks for trying it out. What kind of hardware do you have? Does it
> >>have HPET? It looks like no suitable timer for dyn-tick is found...
> >>Maybe the following patch helps?
> >>
> >>Tony
> >
> >
> > Does 'different crash' qualify as "helping"? :)
>
> Update:
> The patch does seem to fix the crash. This "different crash" I
> mentioned appears to be related to the netconsole I was using (serial
> console produces stairstepping text, netconsole seems to duplicate
> lines--go figure). Without netconsole, dynamic tick appears to be
> working, so I'm not sure whether this is a netconsole bug or a dynamic
> tick bug.
This might be because time does not run correctly, see below.
> While dynamic tick no longer panics, with dynamic tick, my system slows
> to whatever is slower than a crawl. It now takes 6 minutes 50 seconds
> to boot all the way up, compared to 1 minute 35 seconds with my 2.6.12
> kernel without the dynamic tick patch. I'm not sure where this slowdown
> is occurring yet.
I think I have an idea on what's going on; Your system does not wake to
APIC interrupt, and the system timer updates time only on other interrupts.
I'm experiencing the same on a loaner ThinkPad T30.
I'll try to do another patch today. Meanwhile it now should work
without lapic in cmdline.
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 6:25 ` Tony Lindgren
@ 2005-04-08 7:50 ` Tony Lindgren
2005-04-08 8:49 ` Frank Sorenson
2005-04-08 10:28 ` [PATCH] Updated: Dynamic Tick version 050408-1 Pavel Machek
0 siblings, 2 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-08 7:50 UTC (permalink / raw)
To: Frank Sorenson
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
[-- Attachment #1: Type: text/plain, Size: 534 bytes --]
* Tony Lindgren <tony@atomide.com> [050407 23:28]:
>
> I think I have an idea on what's going on; Your system does not wake to
> APIC interrupt, and the system timer updates time only on other interrupts.
> I'm experiencing the same on a loaner ThinkPad T30.
>
> I'll try to do another patch today. Meanwhile it now should work
> without lapic in cmdline.
Following is an updated patch. Anybody having trouble, please try
disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
I'm hoping this might work on Pavel's machine too?
Tony
[-- Attachment #2: patch-dynamic-tick-2.6.12-rc2-050408-1 --]
[-- Type: text/plain, Size: 30478 bytes --]
diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
--- a/arch/i386/Kconfig 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/Kconfig 2005-04-08 00:43:41 -07:00
@@ -460,6 +460,26 @@
bool "Provide RTC interrupt"
depends on HPET_TIMER && RTC=y
+config NO_IDLE_HZ
+ bool "Dynamic Tick Timer - Skip timer ticks during idle"
+ help
+ This option enables support for skipping timer ticks when the
+ processor is idle. During system load, timer is continuous.
+ This option saves power, as it allows the system to stay in
+ idle mode longer. Currently supported timers are ACPI PM
+ timer, local APIC timer, and TSC timer. HPET timer is currently
+ not supported.
+
+config DYN_TICK_USE_APIC
+ bool "Use APIC timer instead of PIT timer"
+ help
+ This option enables using APIC timer interrupt if your hardware
+ supports it. APIC timer allows longer sleep periods compared
+ to PIT timer. Note that on some hardware disabling PIT timer
+ also disables APIC timer interrupts, and system won't run
+ properly. Symptoms include slow system boot, and time running
+ slow. If unsure, don't enable this option.
+
config SMP
bool "Symmetric multi-processing support"
---help---
diff -Nru a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile
--- a/arch/i386/kernel/Makefile 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/Makefile 2005-04-08 00:43:41 -07:00
@@ -30,6 +30,7 @@
obj-y += sysenter.o vsyscall.o
obj-$(CONFIG_ACPI_SRAT) += srat.o
obj-$(CONFIG_HPET_TIMER) += time_hpet.o
+obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick.o
obj-$(CONFIG_EFI) += efi.o efi_stub.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
diff -Nru a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
--- a/arch/i386/kernel/apic.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/apic.c 2005-04-08 00:43:41 -07:00
@@ -26,6 +26,7 @@
#include <linux/mc146818rtc.h>
#include <linux/kernel_stat.h>
#include <linux/sysdev.h>
+#include <linux/dyn-tick-timer.h>
#include <asm/atomic.h>
#include <asm/smp.h>
@@ -909,6 +910,8 @@
#define APIC_DIVISOR 16
+static u32 apic_timer_val;
+
static void __setup_APIC_LVTT(unsigned int clocks)
{
unsigned int lvtt_value, tmp_value, ver;
@@ -927,7 +930,15 @@
& ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE))
| APIC_TDR_DIV_16);
- apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR);
+ apic_timer_val = clocks/APIC_DIVISOR;
+
+#ifdef CONFIG_NO_IDLE_HZ
+ /* Local APIC timer is 24-bit */
+ if (apic_timer_val)
+ dyn_tick->max_skip = 0xffffff / apic_timer_val;
+#endif
+
+ apic_write_around(APIC_TMICT, apic_timer_val);
}
static void __init setup_APIC_timer(unsigned int clocks)
@@ -1040,6 +1051,13 @@
*/
setup_APIC_timer(calibration_result);
+#ifdef CONFIG_NO_IDLE_HZ
+ if (calibration_result)
+ dyn_tick->state |= DYN_TICK_USE_APIC;
+ else
+ printk(KERN_INFO "dyn-tick: Cannot use local APIC\n");
+#endif
+
local_irq_enable();
}
@@ -1068,6 +1086,18 @@
}
}
+#if defined(CONFIG_NO_IDLE_HZ)
+void reprogram_apic_timer(unsigned int count)
+{
+ unsigned long flags;
+
+ count *= apic_timer_val;
+ local_irq_save(flags);
+ apic_write_around(APIC_TMICT, count);
+ local_irq_restore(flags);
+}
+#endif
+
/*
* the frequency of the profiling timer can be changed
* by writing a multiplier value into /proc/profile.
@@ -1160,6 +1190,7 @@
fastcall void smp_apic_timer_interrupt(struct pt_regs *regs)
{
+ unsigned long seq;
int cpu = smp_processor_id();
/*
@@ -1178,6 +1209,23 @@
* interrupt lock, which is the WrongThing (tm) to do.
*/
irq_enter();
+
+#ifdef CONFIG_NO_IDLE_HZ
+ /*
+ * Check if we need to wake up PIT interrupt handler.
+ * Otherwise just wake up local APIC timer.
+ */
+ do {
+ seq = read_seqbegin(&xtime_lock);
+ if (dyn_tick->state & (DYN_TICK_ENABLED | DYN_TICK_SKIPPING)) {
+ if (dyn_tick->skip_cpu == cpu && dyn_tick->skip > DYN_TICK_MIN_SKIP)
+ dyn_tick->interrupt(99, NULL, regs);
+ else
+ reprogram_apic_timer(1);
+ }
+ } while (read_seqretry(&xtime_lock, seq));
+#endif
+
smp_local_timer_interrupt(regs);
irq_exit();
}
diff -Nru a/arch/i386/kernel/dyn-tick.c b/arch/i386/kernel/dyn-tick.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/arch/i386/kernel/dyn-tick.c 2005-04-08 00:43:41 -07:00
@@ -0,0 +1,64 @@
+/*
+ * linux/arch/i386/kernel/dyn-tick.c
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/version.h>
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/dyn-tick-timer.h>
+#include "dyn-tick.h"
+
+extern int dyn_tick_arch_init(void);
+
+void arch_reprogram_timer(void)
+{
+ if (cpu_has_local_apic()) {
+ disable_pit_tick();
+ if (dyn_tick->state & DYN_TICK_TIMER_INT)
+ reprogram_apic_timer(dyn_tick->skip);
+ } else {
+ if (dyn_tick->state & DYN_TICK_TIMER_INT)
+ reprogram_pit_tick(dyn_tick->skip);
+ else
+ disable_pit_tick();
+ }
+}
+
+static struct dyn_tick_timer arch_dyn_tick_timer = {
+ .arch_reprogram_timer = &arch_reprogram_timer,
+};
+
+int __init dyn_tick_init(void)
+{
+ arch_dyn_tick_timer.arch_init = dyn_tick_arch_init;
+ dyn_tick_register(&arch_dyn_tick_timer);
+
+ return 0;
+}
+arch_initcall(dyn_tick_init);
diff -Nru a/arch/i386/kernel/dyn-tick.h b/arch/i386/kernel/dyn-tick.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/arch/i386/kernel/dyn-tick.h 2005-04-08 00:43:41 -07:00
@@ -0,0 +1,33 @@
+/*
+ * linux/arch/i386/kernel/dyn-tick.h
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#if defined(CONFIG_DYN_TICK_USE_APIC) && (defined(CONFIG_SMP) || defined(CONFIG_X86_UP_APIC))
+#define cpu_has_local_apic() (dyn_tick->state & DYN_TICK_USE_APIC)
+#else
+#define cpu_has_local_apic() 0
+#endif
diff -Nru a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
--- a/arch/i386/kernel/irq.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/irq.c 2005-04-08 00:43:41 -07:00
@@ -15,6 +15,7 @@
#include <linux/seq_file.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
+#include <linux/dyn-tick-timer.h>
DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_maxaligned_in_smp;
EXPORT_PER_CPU_SYMBOL(irq_stat);
@@ -102,6 +103,12 @@
);
} else
#endif
+
+#ifdef CONFIG_NO_IDLE_HZ
+ if (dyn_tick->state & (DYN_TICK_ENABLED | DYN_TICK_SKIPPING) && irq != 0)
+ dyn_tick->interrupt(irq, NULL, regs);
+#endif
+
__do_IRQ(irq, regs);
irq_exit();
diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
--- a/arch/i386/kernel/process.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/process.c 2005-04-08 00:43:41 -07:00
@@ -160,6 +160,10 @@
if (!idle)
idle = default_idle;
+#ifdef CONFIG_NO_IDLE_HZ
+ dyn_tick_reprogram_timer();
+#endif
+
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
idle();
}
diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/time.c 2005-04-08 00:43:41 -07:00
@@ -46,6 +46,7 @@
#include <linux/bcd.h>
#include <linux/efi.h>
#include <linux/mca.h>
+#include <linux/dyn-tick-timer.h>
#include <asm/io.h>
#include <asm/smp.h>
@@ -67,6 +68,7 @@
#include <asm/arch_hooks.h>
#include "io_ports.h"
+#include "dyn-tick.h"
extern spinlock_t i8259A_lock;
int pit_latch_buggy; /* extern */
@@ -308,6 +310,66 @@
return IRQ_HANDLED;
}
+#ifdef CONFIG_NO_IDLE_HZ
+static unsigned long long last_tick;
+void reprogram_pit_tick(int jiffies_to_skip);
+extern void replace_timer_interrupt(void * new_handler);
+
+#if defined(CONFIG_NO_IDLE_HZ) && defined(CONFIG_X86_LOCAL_APIC)
+extern void reprogram_apic_timer(unsigned int count);
+#else
+void reprogram_apic_timer(unsigned int count) {}
+#endif
+
+#ifdef DEBUG
+#define dbg_dyn_tick_irq() {if (skipped && skipped < dyn_tick->skip) \
+ printk("%u/%li ", skipped, dyn_tick->skip);}
+#else
+#define dbg_dyn_tick_irq() {}
+#endif
+
+/*
+ * This interrupt handler updates the time based on number of jiffies skipped
+ * It would be somewhat more optimized to have a customa handler in each timer
+ * using hardware ticks instead of nanoseconds. Note that CONFIG_NO_IDLE_HZ
+ * currently disables timer fallback on skipped jiffies.
+ */
+irqreturn_t dyn_tick_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ unsigned long flags;
+ volatile unsigned long long now;
+ unsigned int skipped = 0;
+
+ if (dyn_tick->state & DYN_TICK_DEBUG) {
+ if (irq == 0)
+ printk(".");
+ else
+ printk("%i ", irq);
+ }
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ now = cur_timer->get_hw_time();
+ while (now - last_tick >= NS_TICK_LEN) {
+ last_tick += NS_TICK_LEN;
+ cur_timer->mark_offset();
+ do_timer_interrupt(irq, NULL, regs);
+ skipped++;
+ }
+ if (dyn_tick->state & (DYN_TICK_ENABLED | DYN_TICK_SKIPPING)) {
+ dbg_dyn_tick_irq();
+ dyn_tick->skip = 1;
+ if (cpu_has_local_apic())
+ reprogram_apic_timer(dyn_tick->skip);
+ reprogram_pit_tick(dyn_tick->skip);
+ dyn_tick->state |= DYN_TICK_ENABLED;
+ dyn_tick->state &= ~DYN_TICK_SKIPPING;
+ }
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return IRQ_HANDLED;
+}
+#endif /* CONFIG_NO_IDLE_HZ */
+
/* not static: needed by APM */
unsigned long get_cmos_time(void)
{
@@ -416,7 +478,7 @@
/* XXX this driverfs stuff should probably go elsewhere later -john */
-static struct sys_device device_timer = {
+struct sys_device device_timer = {
.id = 0,
.cls = &timer_sysclass,
};
@@ -452,6 +514,82 @@
}
#endif
+#ifdef CONFIG_NO_IDLE_HZ
+
+/*
+ * REVISIT: Looks like on p3 APIC timer keeps running if PIT mode
+ * is changed. On p4, changing PIT mode seems to kill
+ * APIC timer interrupts. Same thing with disabling PIT
+ * interrupt.
+ */
+void disable_pit_tick(void)
+{
+ extern spinlock_t i8253_lock;
+ unsigned long flags;
+ spin_lock_irqsave(&i8253_lock, flags);
+ //irq_desc[0].handler->disable(0);
+ outb_p(0x32, PIT_MODE); /* binary, mode 1, LSB/MSB, ch 0 */
+#if 0
+ outb_p(0xff, PIT_CH0); /* LSB */
+ outb(0xff, PIT_CH0); /* MSB */
+#endif
+ spin_unlock_irqrestore(&i8253_lock, flags);
+}
+
+/*
+ * Reprograms the next timer interrupt
+ * PIT timer reprogramming code taken from APM code.
+ * Note that PIT timer is a 16-bit timer, which allows max
+ * skip of only few seconds.
+ */
+void reprogram_pit_tick(int jiffies_to_skip)
+{
+ int skip;
+ extern spinlock_t i8253_lock;
+ unsigned long flags;
+
+ skip = jiffies_to_skip * LATCH;
+ if (skip > 0xffff)
+ skip = 0xffff;
+
+ spin_lock_irqsave(&i8253_lock, flags);
+ outb_p(0x34, PIT_MODE); /* binary, mode 2, LSB/MSB, ch 0 */
+ outb_p(skip & 0xff, PIT_CH0); /* LSB */
+ outb(skip >> 8, PIT_CH0); /* MSB */
+ //irq_desc[0].handler->enable(0);
+ spin_unlock_irqrestore(&i8253_lock, flags);
+}
+
+int __init dyn_tick_arch_init(void)
+{
+ unsigned long flags;
+
+ if (!cur_timer->get_hw_time) {
+ printk(KERN_ERR "dyn-tick: Timer does not have get_hw_time!\n");
+ return -ENODEV;
+ }
+ write_seqlock_irqsave(&xtime_lock, flags);
+ last_tick = cur_timer->get_hw_time();
+ dyn_tick->skip = 1;
+ if (!cpu_has_local_apic())
+ dyn_tick->max_skip = 0xffff/LATCH; /* PIT timer length */
+ printk(KERN_INFO "dyn-tick: Maximum ticks to skip limited to %i\n",
+ dyn_tick->max_skip);
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ if (cur_timer->late_init)
+ cur_timer->late_init();
+ dyn_tick->interrupt = dyn_tick_timer_interrupt;
+ replace_timer_interrupt(dyn_tick->interrupt);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ dyn_tick->state |= DYN_TICK_ENABLED;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return 0;
+}
+#endif /* CONFIG_NO_IDLE_HZ */
+
void __init time_init(void)
{
#ifdef CONFIG_HPET_TIMER
@@ -471,6 +609,17 @@
cur_timer = select_timer();
printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
+
+#ifdef CONFIG_NO_IDLE_HZ
+ if (strncmp(cur_timer->name, "tsc", 3) == 0 ||
+ strncmp(cur_timer->name, "pmtmr", 3) == 0) {
+ dyn_tick->state |= DYN_TICK_SUITABLE;
+ printk(KERN_INFO "dyn-tick: Found suitable timer: %s\n",
+ cur_timer->name);
+ } else
+ printk(KERN_ERR "dyn-tick: Cannot use timer %s\n",
+ cur_timer->name);
+#endif
time_init_hook();
}
diff -Nru a/arch/i386/kernel/timers/timer_pm.c b/arch/i386/kernel/timers/timer_pm.c
--- a/arch/i386/kernel/timers/timer_pm.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/timers/timer_pm.c 2005-04-08 00:43:41 -07:00
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/device.h>
#include <linux/init.h>
+#include <linux/dyn-tick-timer.h>
#include <asm/types.h>
#include <asm/timer.h>
#include <asm/smp.h>
@@ -168,6 +169,7 @@
monotonic_base += delta * NSEC_PER_USEC;
write_sequnlock(&monotonic_lock);
+#ifndef CONFIG_NO_IDLE_HZ
/* convert to ticks */
delta += offset_delay;
lost = delta / (USEC_PER_SEC / HZ);
@@ -184,6 +186,7 @@
first_run = 0;
offset_delay = 0;
}
+#endif
}
@@ -238,6 +241,25 @@
return (unsigned long) offset_delay + cyc2us(delta);
}
+static unsigned long long ns_time;
+
+static unsigned long long get_hw_time_pmtmr(void)
+{
+ u32 now, delta;
+ static unsigned int last_cycles;
+ now = read_pmtmr();
+ delta = (now - last_cycles) & ACPI_PM_MASK;
+ last_cycles = now;
+ ns_time += cyc2us(delta) * NSEC_PER_USEC;
+ return ns_time;
+}
+
+static void late_init_pmtmr(void)
+{
+ ns_time = monotonic_clock_pmtmr();
+}
+
+extern irqreturn_t pmtmr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
/* acpi timer_opts struct */
static struct timer_opts timer_pmtmr = {
@@ -245,7 +267,9 @@
.mark_offset = mark_offset_pmtmr,
.get_offset = get_offset_pmtmr,
.monotonic_clock = monotonic_clock_pmtmr,
+ .get_hw_time = get_hw_time_pmtmr,
.delay = delay_pmtmr,
+ .late_init = late_init_pmtmr,
};
struct init_timer_opts __initdata timer_pmtmr_init = {
diff -Nru a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c
--- a/arch/i386/kernel/timers/timer_tsc.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/kernel/timers/timer_tsc.c 2005-04-08 00:43:41 -07:00
@@ -112,6 +112,15 @@
return delay_at_last_interrupt + edx;
}
+static unsigned long get_hw_time_tsc(void)
+{
+ register unsigned long eax, edx;
+
+ unsigned long long hw_time;
+ rdtscll(hw_time);
+ return cycles_2_ns(hw_time);
+}
+
static unsigned long long monotonic_clock_tsc(void)
{
unsigned long long last_offset, this_offset, base;
@@ -348,6 +357,7 @@
rdtsc(last_tsc_low, last_tsc_high);
+#ifndef CONFIG_NO_IDLE_HZ
spin_lock(&i8253_lock);
outb_p(0x00, PIT_MODE); /* latch the count ASAP */
@@ -415,11 +425,14 @@
cpufreq_delayed_get();
} else
lost_count = 0;
+#endif
+
/* update the monotonic base value */
this_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low;
monotonic_base += cycles_2_ns(this_offset - last_offset);
write_sequnlock(&monotonic_lock);
+#ifndef CONFIG_NO_IDLE_HZ
/* calculate delay_at_last_interrupt */
count = ((LATCH-1) - count) * TICK_SIZE;
delay_at_last_interrupt = (count + LATCH/2) / LATCH;
@@ -430,6 +443,7 @@
*/
if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
jiffies_64++;
+#endif
}
static int __init init_tsc(char* override)
@@ -551,6 +565,7 @@
.mark_offset = mark_offset_tsc,
.get_offset = get_offset_tsc,
.monotonic_clock = monotonic_clock_tsc,
+ .get_hw_time = get_hw_time_tsc,
.delay = delay_tsc,
};
diff -Nru a/arch/i386/mach-default/setup.c b/arch/i386/mach-default/setup.c
--- a/arch/i386/mach-default/setup.c 2005-04-08 00:43:41 -07:00
+++ b/arch/i386/mach-default/setup.c 2005-04-08 00:43:41 -07:00
@@ -85,6 +85,22 @@
setup_irq(0, &irq0);
}
+/**
+ * replace_timer_interrupt - allow replacing timer interrupt handler
+ *
+ * Description:
+ * Can be used to replace timer interrupt handler with a more optimized
+ * handler. Used for enabling and disabling of CONFIG_NO_IDLE_HZ.
+ */
+void replace_timer_interrupt(void * new_handler)
+{
+ unsigned long flags;
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ irq0.handler = new_handler;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+}
+
#ifdef CONFIG_MCA
/**
* mca_nmi_hook - hook into MCA specific NMI chain
diff -Nru a/include/asm-i386/timer.h b/include/asm-i386/timer.h
--- a/include/asm-i386/timer.h 2005-04-08 00:43:41 -07:00
+++ b/include/asm-i386/timer.h 2005-04-08 00:43:41 -07:00
@@ -1,6 +1,7 @@
#ifndef _ASMi386_TIMER_H
#define _ASMi386_TIMER_H
#include <linux/init.h>
+#include <linux/interrupt.h>
/**
* struct timer_ops - used to define a timer source
@@ -21,7 +22,9 @@
void (*mark_offset)(void);
unsigned long (*get_offset)(void);
unsigned long long (*monotonic_clock)(void);
+ unsigned long long (*get_hw_time)(void);
void (*delay)(unsigned long);
+ void (*late_init)(void);
};
struct init_timer_opts {
diff -Nru a/include/linux/dyn-tick-timer.h b/include/linux/dyn-tick-timer.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/include/linux/dyn-tick-timer.h 2005-04-08 00:43:41 -07:00
@@ -0,0 +1,74 @@
+/*
+ * linux/include/linux/dyn-tick-timer.h
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _DYN_TICK_TIMER_H
+#define _DYN_TICK_TIMER_H
+
+#include <linux/interrupt.h>
+
+#define DYN_TICK_DEBUG (1 << 31)
+#define DYN_TICK_TIMER_INT (1 << 4)
+#define DYN_TICK_USE_APIC (1 << 3)
+#define DYN_TICK_SKIPPING (1 << 2)
+#define DYN_TICK_ENABLED (1 << 1)
+#define DYN_TICK_SUITABLE (1 << 0)
+
+struct dyn_tick_state {
+ unsigned int state; /* Current state */
+ int skip_cpu; /* Skip handling processor */
+ unsigned long skip; /* Ticks to skip */
+ unsigned int max_skip; /* Max number of ticks to skip */
+ unsigned long irq_skip_mask; /* Do not update time from these irqs */
+ irqreturn_t (*interrupt)(int, void *, struct pt_regs *);
+};
+
+struct dyn_tick_timer {
+ int (*arch_init) (void);
+ void (*arch_enable) (void);
+ void (*arch_disable) (void);
+ void (*arch_reprogram_timer) (void);
+};
+
+extern struct dyn_tick_state * dyn_tick;
+extern void dyn_tick_register(struct dyn_tick_timer * new_timer);
+
+#define NS_TICK_LEN ((1 * 1000000000)/HZ)
+#define DYN_TICK_MIN_SKIP 2
+
+#ifdef CONFIG_NO_IDLE_HZ
+
+extern unsigned long dyn_tick_reprogram_timer(void);
+
+#else
+
+#define arch_has_safe_halt() 0
+#define dyn_tick_reprogram_timer() {}
+
+
+#endif /* CONFIG_NO_IDLE_HZ */
+#endif /* _DYN_TICK_TIMER_H */
diff -Nru a/kernel/Makefile b/kernel/Makefile
--- a/kernel/Makefile 2005-04-08 00:43:41 -07:00
+++ b/kernel/Makefile 2005-04-08 00:43:41 -07:00
@@ -28,6 +28,7 @@
obj-$(CONFIG_SYSFS) += ksysfs.o
obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
obj-$(CONFIG_SECCOMP) += seccomp.o
+obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick-timer.o
ifneq ($(CONFIG_IA64),y)
# According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
diff -Nru a/kernel/dyn-tick-timer.c b/kernel/dyn-tick-timer.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/kernel/dyn-tick-timer.c 2005-04-08 00:43:41 -07:00
@@ -0,0 +1,256 @@
+/*
+ * linux/arch/i386/kernel/dyn-tick.c
+ *
+ * Beginnings of generic dynamic tick timer support
+ *
+ * Copyright (C) 2004 Nokia Corporation
+ * Written by Tony Lindgen <tony@atomide.com> and
+ * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/version.h>
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/sysdev.h>
+#include <linux/interrupt.h>
+#include <linux/cpumask.h>
+#include <linux/pm.h>
+#include <linux/dyn-tick-timer.h>
+#include <asm/io.h>
+
+#include "io_ports.h"
+
+#define DYN_TICK_VERSION "050301-1"
+
+struct dyn_tick_state dyn_tick_state;
+struct dyn_tick_state * dyn_tick = &dyn_tick_state;
+struct dyn_tick_timer * dyn_tick_cfg;
+
+static void (*orig_idle) (void) = 0;
+extern void disable_pit_tick(void);
+extern void reprogram_pit_tick(int jiffies_to_skip);
+extern void reprogram_apic_timer(unsigned int count);
+extern void reprogram_pit_tick(int jiffies_to_skip);
+static cpumask_t dyn_cpu_map;
+
+/*
+ * Arch independed code needed to reprogram next timer interrupt.
+ * Gets called from cpu_idle() before entering idle loop. Note that
+ * we want to have all processors idle before reprogramming the
+ * next timer interrupt.
+ */
+unsigned long dyn_tick_reprogram_timer(void)
+{
+ int cpu;
+ unsigned long flags;
+ cpumask_t idle_cpus;
+ unsigned long next;
+
+ if (dyn_tick->state & DYN_TICK_DEBUG)
+ printk("i");
+
+ if (!(dyn_tick->state & DYN_TICK_ENABLED))
+ return 0;
+
+ /* Check if we are already skipping ticks and can idle other cpus */
+ if (dyn_tick->state & DYN_TICK_SKIPPING) {
+ reprogram_apic_timer(dyn_tick->skip);
+ return 0;
+ }
+
+ /* Check if we can start skipping ticks */
+ write_seqlock_irqsave(&xtime_lock, flags);
+ cpu = smp_processor_id();
+ cpu_set(cpu, dyn_cpu_map);
+ cpus_and(idle_cpus, dyn_cpu_map, cpu_online_map);
+ if (cpus_equal(idle_cpus, cpu_online_map)) {
+ next = next_timer_interrupt();
+ if (jiffies > next) {
+ //printk("Too late? next: %lu jiffies: %lu\n",
+ // next, jjiffies);
+ dyn_tick->skip = 1;
+ } else
+ dyn_tick->skip = next_timer_interrupt() - jiffies;
+ if (dyn_tick->skip > DYN_TICK_MIN_SKIP) {
+ if (dyn_tick->skip > dyn_tick->max_skip)
+ dyn_tick->skip = dyn_tick->max_skip;
+
+ dyn_tick_cfg->arch_reprogram_timer();
+
+ dyn_tick->skip_cpu = cpu;
+ dyn_tick->state |= DYN_TICK_SKIPPING;
+ }
+ cpus_clear(dyn_cpu_map);
+ }
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return dyn_tick->skip;
+}
+
+void __init dyn_tick_register(struct dyn_tick_timer * arch_timer)
+{
+ dyn_tick_cfg = arch_timer;
+ printk(KERN_INFO "dyn-tick: Registering dynamic tick timer v%s\n",
+ DYN_TICK_VERSION);
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * Sysfs interface
+ * ---------------------------------------------------------------------------
+ */
+
+extern struct sys_device device_timer;
+
+static ssize_t show_dyn_tick_state(struct sys_device *dev, char *buf)
+{
+ return sprintf(buf, "suitable:\t%i\n"
+ "enabled:\t%i\n"
+ "skipping:\t%i\n"
+ "using APIC:\t%i\n"
+ "int enabled:\t%i\n"
+ "debug:\t\t%i\n",
+ dyn_tick->state & DYN_TICK_SUITABLE,
+ (dyn_tick->state & DYN_TICK_ENABLED) >> 1,
+ (dyn_tick->state & DYN_TICK_SKIPPING) >> 2,
+ (dyn_tick->state & DYN_TICK_USE_APIC) >> 3,
+ (dyn_tick->state & DYN_TICK_TIMER_INT) >> 4,
+ (dyn_tick->state & DYN_TICK_DEBUG) >> 31);
+}
+
+static ssize_t set_dyn_tick_state(struct sys_device *dev, const char * buf,
+ ssize_t count)
+{
+ unsigned long flags;
+ unsigned int enable = simple_strtoul(buf, NULL, 2);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ if (enable) {
+ if (dyn_tick_cfg->arch_enable)
+ dyn_tick_cfg->arch_enable();
+ dyn_tick->state |= DYN_TICK_ENABLED;
+ } else {
+ if (dyn_tick_cfg->arch_disable)
+ dyn_tick_cfg->arch_disable();
+ dyn_tick->state &= ~DYN_TICK_ENABLED;
+ }
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return count;
+}
+
+static SYSDEV_ATTR(dyn_tick_state, 0644, show_dyn_tick_state,
+ set_dyn_tick_state);
+
+static ssize_t show_dyn_tick_int(struct sys_device *dev, char *buf)
+{
+ return sprintf(buf, "%i\n",
+ (dyn_tick->state & DYN_TICK_TIMER_INT) >> 4);
+}
+
+static ssize_t set_dyn_tick_int(struct sys_device *dev, const char * buf,
+ ssize_t count)
+{
+ unsigned long flags;
+ unsigned int enable = simple_strtoul(buf, NULL, 2);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ if (enable)
+ dyn_tick->state |= DYN_TICK_TIMER_INT;
+ else
+ dyn_tick->state &= ~DYN_TICK_TIMER_INT;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return count;
+}
+
+static SYSDEV_ATTR(dyn_tick_int, 0644, show_dyn_tick_int, set_dyn_tick_int);
+
+static ssize_t show_dyn_tick_dbg(struct sys_device *dev, char *buf)
+{
+ return sprintf(buf, "%i\n",
+ (dyn_tick->state & DYN_TICK_DEBUG) >> 31);
+}
+
+static ssize_t set_dyn_tick_dbg(struct sys_device *dev, const char * buf,
+ ssize_t count)
+{
+ unsigned long flags;
+ unsigned int enable = simple_strtoul(buf, NULL, 2);
+
+ write_seqlock_irqsave(&xtime_lock, flags);
+ if (enable)
+ dyn_tick->state |= DYN_TICK_DEBUG;
+ else
+ dyn_tick->state &= ~DYN_TICK_DEBUG;
+ write_sequnlock_irqrestore(&xtime_lock, flags);
+
+ return count;
+}
+
+static SYSDEV_ATTR(dyn_tick_dbg, 0644, show_dyn_tick_dbg, set_dyn_tick_dbg);
+
+/*
+ * ---------------------------------------------------------------------------
+ * Init functions
+ * ---------------------------------------------------------------------------
+ */
+
+static int __init dyn_tick_early_init(void)
+{
+ dyn_tick->state |= DYN_TICK_TIMER_INT;
+}
+
+subsys_initcall(dyn_tick_early_init);
+
+/*
+ * We need to initialize dynamic tick after calibrate delay
+ */
+static int __init dyn_tick_late_init(void)
+{
+ int ret = 0;
+
+ if (dyn_tick_cfg == NULL || dyn_tick_cfg->arch_init == NULL ||
+ !(dyn_tick->state & DYN_TICK_SUITABLE)) {
+ printk(KERN_ERR, "dyn-tick: No suitable timer found\n");
+ return -ENODEV;
+ }
+
+ ret = dyn_tick_cfg->arch_init();
+ if (ret != 0) {
+ printk(KERN_ERR "dyn-tick: Init failed\n");
+ return -ENODEV;
+ }
+
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_state);
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_int);
+ ret = sysdev_create_file(&device_timer, &attr_dyn_tick_dbg);
+
+ printk(KERN_INFO "dyn-tick: Timer using dynamic tick\n");
+
+ return ret;
+}
+
+late_initcall(dyn_tick_late_init);
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 7:50 ` [PATCH] Updated: Dynamic Tick version 050408-1 Tony Lindgren
@ 2005-04-08 8:49 ` Frank Sorenson
2005-04-08 9:17 ` Tony Lindgren
2005-04-08 11:33 ` Thomas Renninger
2005-04-08 10:28 ` [PATCH] Updated: Dynamic Tick version 050408-1 Pavel Machek
1 sibling, 2 replies; 34+ messages in thread
From: Frank Sorenson @ 2005-04-08 8:49 UTC (permalink / raw)
To: Tony Lindgren
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Tony Lindgren wrote:
| * Tony Lindgren <tony@atomide.com> [050407 23:28]:
|
|>I think I have an idea on what's going on; Your system does not wake to
|>APIC interrupt, and the system timer updates time only on other
interrupts.
|>I'm experiencing the same on a loaner ThinkPad T30.
|>
|>I'll try to do another patch today. Meanwhile it now should work
|>without lapic in cmdline.
|
|
| Following is an updated patch. Anybody having trouble, please try
| disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
|
| I'm hoping this might work on Pavel's machine too?
|
| Tony
This updated patch seems to work just fine on my machine with lapic on
the cmdline and CONFIG_DYN_TICK_USE_APIC disabled.
Also, you were correct that removing lapic from the cmdline allowed the
previous version to run at full speed.
Now, how can I tell if the patch is doing its thing? What should I be
seeing? :)
Functionally, it looks like it's working. There were a number of
compiler warnings you might wish to fix before calling it good. Such as
"initialization from incompatible pointer type" several times in
dyn-tick-timer.c and a "too many arguments for format" in
dyn_tick_late_init.
Frank
- --
Frank Sorenson - KD7TZK
Systems Manager, Computer Science Department
Brigham Young University
frank@tuxrocks.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFCVkWDaI0dwg4A47wRAgzOAKCHcx8p59ZbihYtZJ84p62v2rMauQCfUuzz
D7O98hHvjtTa/CvFHHtJe4c=
=G2I/
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 8:49 ` Frank Sorenson
@ 2005-04-08 9:17 ` Tony Lindgren
2005-04-08 21:42 ` Frank Sorenson
2005-04-08 11:33 ` Thomas Renninger
1 sibling, 1 reply; 34+ messages in thread
From: Tony Lindgren @ 2005-04-08 9:17 UTC (permalink / raw)
To: Frank Sorenson
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
* Frank Sorenson <frank@tuxrocks.com> [050408 01:49]:
> Tony Lindgren wrote:
> | * Tony Lindgren <tony@atomide.com> [050407 23:28]:
> |
> |>I think I have an idea on what's going on; Your system does not wake to
> |>APIC interrupt, and the system timer updates time only on other
> interrupts.
> |>I'm experiencing the same on a loaner ThinkPad T30.
> |>
> |>I'll try to do another patch today. Meanwhile it now should work
> |>without lapic in cmdline.
> |
> |
> | Following is an updated patch. Anybody having trouble, please try
> | disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
> |
> | I'm hoping this might work on Pavel's machine too?
> |
> | Tony
>
> This updated patch seems to work just fine on my machine with lapic on
> the cmdline and CONFIG_DYN_TICK_USE_APIC disabled.
>
> Also, you were correct that removing lapic from the cmdline allowed the
> previous version to run at full speed.
Cool.
> Now, how can I tell if the patch is doing its thing? What should I be
> seeing? :)
Download pmstats from http://www.muru.com/linux/dyntick/, you may
need to edit it a bit for correct ACPI battery values. But it should
show you HZ during idle and load. I believe idle still does not go
to ACPI C3 with dyn-tick though...
Then you might as well run timetest from same location too to make
sure your clock keeps correct time.
> Functionally, it looks like it's working. There were a number of
> compiler warnings you might wish to fix before calling it good. Such as
> "initialization from incompatible pointer type" several times in
> dyn-tick-timer.c and a "too many arguments for format" in
> dyn_tick_late_init.
Yeah, I'll fix those...
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 7:50 ` [PATCH] Updated: Dynamic Tick version 050408-1 Tony Lindgren
2005-04-08 8:49 ` Frank Sorenson
@ 2005-04-08 10:28 ` Pavel Machek
2005-04-08 10:54 ` Tony Lindgren
1 sibling, 1 reply; 34+ messages in thread
From: Pavel Machek @ 2005-04-08 10:28 UTC (permalink / raw)
To: Tony Lindgren
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, Thomas Renninger
Hi!
> > I think I have an idea on what's going on; Your system does not wake to
> > APIC interrupt, and the system timer updates time only on other interrupts.
> > I'm experiencing the same on a loaner ThinkPad T30.
> >
> > I'll try to do another patch today. Meanwhile it now should work
> > without lapic in cmdline.
>
> Following is an updated patch. Anybody having trouble, please try
> disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
>
> I'm hoping this might work on Pavel's machine too?
The "volume hang" was explained: I was using CPU frequency scaling, it
probably did not like that. After disabling CPU frequency scaling, it
seems to work ok:
Pavel
pavel@Elf:~$ cat /proc/interrupts ; sleep 1 ; cat /proc/interrupts
CPU0
0: 33288 XT-PIC timer
1: 1021 XT-PIC i8042
2: 0 XT-PIC cascade
9: 2 XT-PIC acpi
10: 94036 XT-PIC yenta, yenta, ehci_hcd:usb1,
uhci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb4
11: 3941 XT-PIC Intel 82801DB-ICH4, eth0
12: 17 XT-PIC i8042
14: 5119 XT-PIC ide0
NMI: 0
LOC: 0
ERR: 0
MIS: 0
CPU0
0: 33568 XT-PIC timer
1: 1022 XT-PIC i8042
2: 0 XT-PIC cascade
9: 2 XT-PIC acpi
10: 94323 XT-PIC yenta, yenta, ehci_hcd:usb1,
uhci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb4
11: 3951 XT-PIC Intel 82801DB-ICH4, eth0
12: 17 XT-PIC i8042
14: 5192 XT-PIC ide0
NMI: 0
LOC: 0
ERR: 0
MIS: 0
pavel@Elf:~$
--
Boycott Kodak -- for their patent abuse against Java.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 10:28 ` [PATCH] Updated: Dynamic Tick version 050408-1 Pavel Machek
@ 2005-04-08 10:54 ` Tony Lindgren
2005-04-08 12:24 ` Pavel Machek
2005-04-09 9:56 ` Pavel Machek
0 siblings, 2 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-08 10:54 UTC (permalink / raw)
To: Pavel Machek
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
* Pavel Machek <pavel@suse.cz> [050408 03:30]:
> Hi!
>
> > > I think I have an idea on what's going on; Your system does not wake to
> > > APIC interrupt, and the system timer updates time only on other interrupts.
> > > I'm experiencing the same on a loaner ThinkPad T30.
> > >
> > > I'll try to do another patch today. Meanwhile it now should work
> > > without lapic in cmdline.
> >
> > Following is an updated patch. Anybody having trouble, please try
> > disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
> >
> > I'm hoping this might work on Pavel's machine too?
>
> The "volume hang" was explained: I was using CPU frequency scaling, it
> probably did not like that. After disabling CPU frequency scaling, it
> seems to work ok:
OK, good. I assume this was the same machine that did not work with
any of the earlier patches?
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 8:49 ` Frank Sorenson
2005-04-08 9:17 ` Tony Lindgren
@ 2005-04-08 11:33 ` Thomas Renninger
2005-04-08 11:55 ` Tony Lindgren
1 sibling, 1 reply; 34+ messages in thread
From: Thomas Renninger @ 2005-04-08 11:33 UTC (permalink / raw)
To: Frank Sorenson
Cc: Tony Lindgren, linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell
Frank Sorenson wrote:
> Tony Lindgren wrote:
> | * Tony Lindgren <tony@atomide.com> [050407 23:28]:
> |
> |>I think I have an idea on what's going on; Your system does not wake to
> |>APIC interrupt, and the system timer updates time only on other
> interrupts.
> |>I'm experiencing the same on a loaner ThinkPad T30.
> |>
> |>I'll try to do another patch today. Meanwhile it now should work
> |>without lapic in cmdline.
> |
> |
> | Following is an updated patch. Anybody having trouble, please try
> | disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
> |
> | I'm hoping this might work on Pavel's machine too?
> |
> | Tony
>
> This updated patch seems to work just fine on my machine with lapic on
> the cmdline and CONFIG_DYN_TICK_USE_APIC disabled.
>
> Also, you were correct that removing lapic from the cmdline allowed the
> previous version to run at full speed.
>
> Now, how can I tell if the patch is doing its thing? What should I be
> seeing? :)
>
> Functionally, it looks like it's working. There were a number of
> compiler warnings you might wish to fix before calling it good. Such as
> "initialization from incompatible pointer type" several times in
> dyn-tick-timer.c and a "too many arguments for format" in
> dyn_tick_late_init.
>
Here are some figures about idle/C-states:
Passing bm_history=0xF to processor module makes it going into C3 and deeper.
Passing lower values, deeper states are reached more often, but system could freeze:
bm_activity=0x4
bus master activity: fefffffd
states:
C1: type[C1] promotion[C2] demotion[--] latency[001] usage[00000010]
*C2: type[C2] promotion[C3] demotion[C1] latency[001] usage[00007183]
C3: type[C3] promotion[C4] demotion[C2] latency[085] usage[00000515]
C4: type[C3] promotion[--] demotion[C3] latency[185] usage[00000330]
bm_activity=0x1
bus master activity: ffff7ffd
states:
C1: type[C1] promotion[C2] demotion[--] latency[001] usage[00000010]
*C2: type[C2] promotion[C3] demotion[C1] latency[001] usage[00005495]
C3: type[C3] promotion[C4] demotion[C2] latency[085] usage[00000537]
C4: type[C3] promotion[--] demotion[C3] latency[185] usage[00000472]
Figures NO_IDLE_HZ disabled, HZ=1000 (max sleep 1ms)
(Don't trust the figures too much, there probably are little bugs...):
Active C0/C1 state:
Total(ms): 145
Usage: 20205
Failures: 0
Maximum(us): 1967
Average(us): 7
Sleep C2 state:
Total(ms): 19306
Usage: 20074
Failures: 0
Maximum(us): 1275 (-> strange max should be 1000us)
Average(us): 961
Sleep C3 state:
Total(ms): 34
Usage: 131
Failures: 0
Maximum(us): 984
Average(us): 259
Measures based on ACPI PM timer reads
Total switches between C-states: 20205
Switches between C-states per second: 1063 per second
Total measure time (s): 19
Total measure time (based on starting measures) (s): 20
Figures NO_IDLE_HZ enabled, processor.bm_history=0xF HZ=1000:
(Don't trust the figures too much, there probably are little bugs...):
Active C0/C1 state:
Total(ms): 81
Usage: 4659
Failures: 0
Maximum(us): 1608
Average(us): 17
Sleep C2 state:
Total(ms): 71108
Usage: 4241
Failures: 0
Maximum(us): 49921
Average(us): 16766
Sleep C3 state:
Total(ms): 219
Usage: 167
Failures: 0
Maximum(us): 28296
Average(us): 1311
Sleep C4 state:
Total(ms): 374
Usage: 251
Failures: 0
Maximum(us): 18870
Average(us): 1490
Measures based on ACPI PM timer reads
Total switches between C-states: 4659
Switches between C-states per second: 65 per second
Total measure time (s): 71
Total measure time (based on starting measures) (s): 75
I buffer C-state times in an array and write them to /dev/cstX.
>From there I calc the stats from userspace.
Tony: If you like I can send you the patch and dump prog for
http://www.muru.com/linux/dyntick/ ?
I try to find a better algorithm (directly adjust slept time to
C-state latency or something) for NO_IDLE_HZ (hints are very welcome)
and try to come up with new figures soon.
Thomas
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 11:33 ` Thomas Renninger
@ 2005-04-08 11:55 ` Tony Lindgren
2005-04-08 12:58 ` Thomas Renninger
2005-04-19 14:56 ` [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures Thomas Renninger
0 siblings, 2 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-08 11:55 UTC (permalink / raw)
To: Thomas Renninger
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell
* Thomas Renninger <trenn@suse.de> [050408 04:34]:
>
> Here are some figures about idle/C-states:
>
> Passing bm_history=0xF to processor module makes it going into C3 and deeper.
> Passing lower values, deeper states are reached more often, but system could freeze:
Hmm, I wonder why it freezes? Is it ACPI issue or related to dyn-tick?
> Figures NO_IDLE_HZ disabled, HZ=1000 (max sleep 1ms)
...
> Total switches between C-states: 20205
> Switches between C-states per second: 1063 per second
>
> Figures NO_IDLE_HZ enabled, processor.bm_history=0xF HZ=1000:
...
> Total switches between C-states: 4659
> Switches between C-states per second: 65 per second
The reduction in C state changes should produce some power savings,
assuming the C states do something...
> I buffer C-state times in an array and write them to /dev/cstX.
> From there I calc the stats from userspace.
>
> Tony: If you like I can send you the patch and dump prog for
> http://www.muru.com/linux/dyntick/ ?
Yeah, that would nice to have!
> I try to find a better algorithm (directly adjust slept time to
> C-state latency or something) for NO_IDLE_HZ (hints are very welcome)
> and try to come up with new figures soon.
I suggest we modify idle so we can call it with the estimated sleep
length in usecs. Then the idle loop can directly decide when to go to
C2 or C3 depening on the estimated sleep length.
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 10:54 ` Tony Lindgren
@ 2005-04-08 12:24 ` Pavel Machek
2005-04-09 9:56 ` Pavel Machek
1 sibling, 0 replies; 34+ messages in thread
From: Pavel Machek @ 2005-04-08 12:24 UTC (permalink / raw)
To: Tony Lindgren
Cc: Pavel Machek, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, Thomas Renninger
Hi!
> > > > I think I have an idea on what's going on; Your system does not wake to
> > > > APIC interrupt, and the system timer updates time only on other interrupts.
> > > > I'm experiencing the same on a loaner ThinkPad T30.
> > > >
> > > > I'll try to do another patch today. Meanwhile it now should work
> > > > without lapic in cmdline.
> > >
> > > Following is an updated patch. Anybody having trouble, please try
> > > disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
> > >
> > > I'm hoping this might work on Pavel's machine too?
> >
> > The "volume hang" was explained: I was using CPU frequency scaling, it
> > probably did not like that. After disabling CPU frequency scaling, it
> > seems to work ok:
>
> OK, good. I assume this was the same machine that did not work with
> any of the earlier patches?
I do not have *that* machine near me just now, but I'll try it.
Pavel
--
Boycott Kodak -- for their patent abuse against Java.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 11:55 ` Tony Lindgren
@ 2005-04-08 12:58 ` Thomas Renninger
2005-04-09 8:22 ` Tony Lindgren
2005-04-19 14:56 ` [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures Thomas Renninger
1 sibling, 1 reply; 34+ messages in thread
From: Thomas Renninger @ 2005-04-08 12:58 UTC (permalink / raw)
To: Tony Lindgren
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell
Tony Lindgren wrote:
> * Thomas Renninger <trenn@suse.de> [050408 04:34]:
>>Here are some figures about idle/C-states:
>>
>>Passing bm_history=0xF to processor module makes it going into C3 and deeper.
>>Passing lower values, deeper states are reached more often, but system could freeze:
>
> Hmm, I wonder why it freezes? Is it ACPI issue or related to dyn-tick?
>
It's an ACPI issue.
As far as I understand: If there has been bus master activity in the last
xx(~30?!?) ms, C3 and deeper sleep states must not be triggered.
If running into it, the system just freezes without any further output
or response.
>>Figures NO_IDLE_HZ disabled, HZ=1000 (max sleep 1ms)
> ...
>>Total switches between C-states: 20205
>>Switches between C-states per second: 1063 per second
>>
>>Figures NO_IDLE_HZ enabled, processor.bm_history=0xF HZ=1000:
> ...
>>Total switches between C-states: 4659
>>Switches between C-states per second: 65 per second
>
> The reduction in C state changes should produce some power savings,
> assuming the C states do something...
>
I heard on this machine battery lasts half an hour longer since
C4 state is used, hopefully we can get some more minutes by using it
more often and longer ...
>>I buffer C-state times in an array and write them to /dev/cstX.
>>From there I calc the stats from userspace.
>>
>>Tony: If you like I can send you the patch and dump prog for
>>http://www.muru.com/linux/dyntick/ ?
>
> Yeah, that would nice to have!
-> I'll send you privately.
>
>>I try to find a better algorithm (directly adjust slept time to
>>C-state latency or something) for NO_IDLE_HZ (hints are very welcome)
>>and try to come up with new figures soon.
>
> I suggest we modify idle so we can call it with the estimated sleep
> length in usecs. Then the idle loop can directly decide when to go to
> C2 or C3 depening on the estimated sleep length.
The sleep time history could be enough?
I don't know how to calc C1 state sleep time (from drivers/acpi/processor_idle.c):
/*
* TBD: Can't get time duration while in C1, as resumes
* go to an ISR rather than here. Need to instrument
* base interrupt handler.
*/
It probably would help to go to deeper states faster.
Whatabout reprogramming timer interrupt for C1 (latency==0), so that it comes out after e.g. 1 ms again.
If it really stayed sleeping for 1ms, 5 times, the machine is really idle and deeper
states are adjusted after sleep time and C-state latency...
(Or only disable timer interrupt after C1 slept long enough X times?)
Thomas
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 9:17 ` Tony Lindgren
@ 2005-04-08 21:42 ` Frank Sorenson
2005-04-09 8:09 ` Tony Lindgren
0 siblings, 1 reply; 34+ messages in thread
From: Frank Sorenson @ 2005-04-08 21:42 UTC (permalink / raw)
To: Tony Lindgren
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Tony Lindgren wrote:
> * Frank Sorenson <frank@tuxrocks.com> [050408 01:49]:
>>This updated patch seems to work just fine on my machine with lapic on
>>the cmdline and CONFIG_DYN_TICK_USE_APIC disabled.
>>
>>Also, you were correct that removing lapic from the cmdline allowed the
>>previous version to run at full speed.
>
>
> Cool.
>
>
>>Now, how can I tell if the patch is doing its thing? What should I be
>>seeing? :)
>
>
> Download pmstats from http://www.muru.com/linux/dyntick/, you may
> need to edit it a bit for correct ACPI battery values. But it should
> show you HZ during idle and load. I believe idle still does not go
> to ACPI C3 with dyn-tick though...
>
> Then you might as well run timetest from same location too to make
> sure your clock keeps correct time.
Seems to be going up when under load, and down when idle, so I suppose
it's working :) The clock is only a little jittery, but not more than
I'd expect across the network, so it looks like it's keeping time okay.
Would it be possible to determine whether the system will wake to the
APIC interrupt at system boot, rather than hardcoded in the config?
After you explained the problem, I noticed that creating my own
interrupts (holding down a key on the keyboard for example) kept the
system moving and not slow. For example, something like this (sorry, I
don't know the code well enough yet to attempt to code it myself):
set the APIC timer to fire in X
set another timer/interrupt to fire in 2X
wait for the interrupt
if (time_elapsed >= 2X) disable the APIC timer
else APIC timer should work
Or, determine which timer woke us up, etc.
Thanks,
Frank
- --
Frank Sorenson - KD7TZK
Systems Manager, Computer Science Department
Brigham Young University
frank@tuxrocks.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFCVvriaI0dwg4A47wRAhhyAJ928wgPEY/9X4KmyJcsaJ+WZk0XRQCfTfcj
x3yKiwYOhMac/SQ7El9N0q0=
=2QVB
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 21:42 ` Frank Sorenson
@ 2005-04-09 8:09 ` Tony Lindgren
0 siblings, 0 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-09 8:09 UTC (permalink / raw)
To: Frank Sorenson
Cc: linux-kernel, Benjamin Herrenschmidt, Pavel Machek,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
On Fri, Apr 08, 2005 at 03:42:59PM -0600, Frank Sorenson wrote:
> Tony Lindgren wrote:
> >
> > Then you might as well run timetest from same location too to make
> > sure your clock keeps correct time.
>
> Seems to be going up when under load, and down when idle, so I suppose
> it's working :) The clock is only a little jittery, but not more than
> I'd expect across the network, so it looks like it's keeping time okay.
Good.
> Would it be possible to determine whether the system will wake to the
> APIC interrupt at system boot, rather than hardcoded in the config?
> After you explained the problem, I noticed that creating my own
> interrupts (holding down a key on the keyboard for example) kept the
> system moving and not slow. For example, something like this (sorry, I
> don't know the code well enough yet to attempt to code it myself):
>
> set the APIC timer to fire in X
> set another timer/interrupt to fire in 2X
> wait for the interrupt
> if (time_elapsed >= 2X) disable the APIC timer
> else APIC timer should work
>
> Or, determine which timer woke us up, etc.
Yeah, I was thinking that too. But maybe there's some way of stopping
PIT interrupts while keeping APIC timer interrupts running on all chips.
It seems to work OK on my P3 boxes, but seems to fail on newer machines.
BTW, stopping PIT interrupts (like the HRT VST patch does) seems to
kill APIC timer interrupts too, the same way as reprogamming PIT does.
Or maybe there's something else that needs to be done to get APIC
interrupts going after PIT interrupts are disabled.
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 12:58 ` Thomas Renninger
@ 2005-04-09 8:22 ` Tony Lindgren
0 siblings, 0 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-09 8:22 UTC (permalink / raw)
To: Thomas Renninger
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell
On Fri, Apr 08, 2005 at 02:58:50PM +0200, Thomas Renninger wrote:
> Tony Lindgren wrote:
> > * Thomas Renninger <trenn@suse.de> [050408 04:34]:
> >>Here are some figures about idle/C-states:
> >>
> >>Passing bm_history=0xF to processor module makes it going into C3 and deeper.
> >>Passing lower values, deeper states are reached more often, but system could freeze:
> >
> > Hmm, I wonder why it freezes? Is it ACPI issue or related to dyn-tick?
> >
> It's an ACPI issue.
OK
> As far as I understand: If there has been bus master activity in the last
> xx(~30?!?) ms, C3 and deeper sleep states must not be triggered.
> If running into it, the system just freezes without any further output
> or response.
OK
> >>Figures NO_IDLE_HZ disabled, HZ=1000 (max sleep 1ms)
> > ...
> >>Total switches between C-states: 20205
> >>Switches between C-states per second: 1063 per second
> >>
> >>Figures NO_IDLE_HZ enabled, processor.bm_history=0xF HZ=1000:
> > ...
> >>Total switches between C-states: 4659
> >>Switches between C-states per second: 65 per second
> >
> > The reduction in C state changes should produce some power savings,
> > assuming the C states do something...
> >
> I heard on this machine battery lasts half an hour longer since
> C4 state is used, hopefully we can get some more minutes by using it
> more often and longer ...
Yeah, it would be interesting to know how much of a difference it makes.
> >>I buffer C-state times in an array and write them to /dev/cstX.
> >>From there I calc the stats from userspace.
> >>
> >>Tony: If you like I can send you the patch and dump prog for
> >>http://www.muru.com/linux/dyntick/ ?
> >
> > Yeah, that would nice to have!
>
> -> I'll send you privately.
OK
> >>I try to find a better algorithm (directly adjust slept time to
> >>C-state latency or something) for NO_IDLE_HZ (hints are very welcome)
> >>and try to come up with new figures soon.
> >
> > I suggest we modify idle so we can call it with the estimated sleep
> > length in usecs. Then the idle loop can directly decide when to go to
> > C2 or C3 depening on the estimated sleep length.
>
> The sleep time history could be enough?
Well we already know when the next timer interrupt is scheduled to
happen, so make use of that information would make the state selection
easy. And we should probably at some point also account for the wake-up
latency so we can program the timer a bit early depending on the sleep
state.
> I don't know how to calc C1 state sleep time (from drivers/acpi/processor_idle.c):
> /*
> * TBD: Can't get time duration while in C1, as resumes
> * go to an ISR rather than here. Need to instrument
> * base interrupt handler.
> */
>
> It probably would help to go to deeper states faster.
Yes, we should be able to go directly to deeper states with the next
timer interrupt value.
> Whatabout reprogramming timer interrupt for C1 (latency==0), so that it comes out after e.g. 1 ms again.
> If it really stayed sleeping for 1ms, 5 times, the machine is really idle and deeper
> states are adjusted after sleep time and C-state latency...
> (Or only disable timer interrupt after C1 slept long enough X times?)
I'm not sure if I follow this one... But if we know the next timer
interrupt is 500ms away, we should go directly to C3/C4, and no
other calculations should be needed.
Regards,
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-08 10:54 ` Tony Lindgren
2005-04-08 12:24 ` Pavel Machek
@ 2005-04-09 9:56 ` Pavel Machek
2005-04-14 19:41 ` Tony Lindgren
1 sibling, 1 reply; 34+ messages in thread
From: Pavel Machek @ 2005-04-09 9:56 UTC (permalink / raw)
To: Tony Lindgren
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
Hi!
> > > > I think I have an idea on what's going on; Your system does not wake to
> > > > APIC interrupt, and the system timer updates time only on other interrupts.
> > > > I'm experiencing the same on a loaner ThinkPad T30.
> > > >
> > > > I'll try to do another patch today. Meanwhile it now should work
> > > > without lapic in cmdline.
> > >
> > > Following is an updated patch. Anybody having trouble, please try
> > > disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
> > >
> > > I'm hoping this might work on Pavel's machine too?
> >
> > The "volume hang" was explained: I was using CPU frequency scaling, it
> > probably did not like that. After disabling CPU frequency scaling, it
> > seems to work ok:
>
> OK, good. I assume this was the same machine that did not work with
> any of the earlier patches
I did testing on that machine today, and yes it works okay if I disable the
NO_IDLE_HZ_USE_APIC (or how is it called) option. Time problems are gone.
Pavel
--
64 bytes from 195.113.31.123: icmp_seq=28 ttl=51 time=448769.1 ms
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1
2005-04-09 9:56 ` Pavel Machek
@ 2005-04-14 19:41 ` Tony Lindgren
0 siblings, 0 replies; 34+ messages in thread
From: Tony Lindgren @ 2005-04-14 19:41 UTC (permalink / raw)
To: Pavel Machek
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, Thomas Renninger
On Sat, Apr 09, 2005 at 11:56:08AM +0200, Pavel Machek wrote:
> Hi!
>
> > > > > I think I have an idea on what's going on; Your system does not wake to
> > > > > APIC interrupt, and the system timer updates time only on other interrupts.
> > > > > I'm experiencing the same on a loaner ThinkPad T30.
> > > > >
> > > > > I'll try to do another patch today. Meanwhile it now should work
> > > > > without lapic in cmdline.
> > > >
> > > > Following is an updated patch. Anybody having trouble, please try
> > > > disabling CONFIG_DYN_TICK_USE_APIC Kconfig option.
> > > >
> > > > I'm hoping this might work on Pavel's machine too?
> > >
> > > The "volume hang" was explained: I was using CPU frequency scaling, it
> > > probably did not like that. After disabling CPU frequency scaling, it
> > > seems to work ok:
> >
> > OK, good. I assume this was the same machine that did not work with
> > any of the earlier patches
>
> I did testing on that machine today, and yes it works okay if I disable the
> NO_IDLE_HZ_USE_APIC (or how is it called) option. Time problems are gone.
That's great!
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-08 11:55 ` Tony Lindgren
2005-04-08 12:58 ` Thomas Renninger
@ 2005-04-19 14:56 ` Thomas Renninger
2005-04-19 15:27 ` Dominik Brodowski
2005-04-19 21:09 ` Pavel Machek
1 sibling, 2 replies; 34+ messages in thread
From: Thomas Renninger @ 2005-04-19 14:56 UTC (permalink / raw)
To: Tony Lindgren
Cc: Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Pavel Machek, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, ML ACPI-devel, Bodo Bauer,
Andi Kleen
[-- Attachment #1: Type: text/plain, Size: 3036 bytes --]
Here are some figures (I used your pmstats):
The machine is a Pentium M 2.00 GHz, supporting C0-C4 processor power states.
The machine run at 2.00 GHz all the time.
A lot of modules (pcmcia, usb, ...) where loaded, services that could
produce load where stopped -> processor is mostly idle.
_____________________________________________________________________________________
*Running with 1000Hz:*
_No processor module:_
Average current the last 100 seconds: *2289mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_No_module_loaded)
_passing bm_history=0xFFFFFFFF (default) to processor module:_
Average current the last 470 seconds: *1986mA* (also measured better values ~1800, does battery level play a role?!?)
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FFFFFFFF)
_passing bm_history=0xFF to processor module:_
Average current the last 190 seconds: *1757mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FF)
(Usage count could be bogus, as some invokations could not succeed if bm has currently been active).
_____________________________________________________________________________________
*Running with CONFIG_NO_IDLE_HZ:*
Patched with http://www.muru.com/linux/dyntick/patches/patch-dynamic-tick-2.6.12-rc2-050408-1.gz
(With the c-state patch attached applied)
_No processor module:_
Average current the last 80 seconds: *2262mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_No_module_loaded)
idle_ms == 40, bm_promote_bs == 30
Average current the last 160 seconds: *1507mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_40_bm_30)
idle_ms == 100, bm_promote_bs == 30
Average current the last 80 seconds: *1466mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_100_bm_30)
idle_ms == 40, bm_promote_bs == 50
Average current the last 150 seconds: *1481mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_40_bm_30)
idle_ms == 40, bm_promote_bs == 10
Average current the last 330 seconds: *1474mA*
(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_40_bm_10)
Hmm, parameters do not influence at all ... (idle_ms should only comes in when switching between idle/not idle).
_____________________________________________________________________________________
The measures are based on the /proc/acpi/battery/*/* info and are not very accurate, but could give an overall picture.
Thomas
P.S.: Not tested, because I have no x86_64 C3 machine, but the patch should also work reliable with Andi's dyn_tick patch
for x86_64 machines.
Tony: I modified your pmstats to produce an average current value: ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/pmstats
[-- Attachment #2: dynamic_tick_cstate_patch_final.diff --]
[-- Type: text/x-patch, Size: 10275 bytes --]
Patch not enough tested, yet.
Should behave the same if compile with !CONFIG_IDLE_HZ.
If CONFIG_IDLE_HZ is set, the c-state will be evaluated on
three control values (averages of the last 4 measures):
a) idle_ms -> if machine was active for longer than this
value (avg), the machine is assumed to not be idle
and C1 will be triggered.
b) bm_promote_ms -> if the avg bus master activity is below
this threshold, C2 is invoked.
c) sleep_avg (no module param) -> the average sleep time of the
last four C2 (or higher) invokations.
If a and b does not apply, a C-state will be searched that has
the highest latency, but still has a latency below the latest
C2 (or higher) sleeping time and average sleeping time value.
ToDo:
Test on other machines (only C2 or C0 support).
Discuss and enhance algorithm.
If it is used this way, average calculations could get MMX optimised.
--- linux-2.6.12-rc2.orig/drivers/acpi/processor_idle.c 2005-04-19 15:03:13.000000000 +0200
+++ linux-2.6.12-rc2/drivers/acpi/processor_idle.c 2005-04-19 15:17:56.000000000 +0200
@@ -60,6 +60,22 @@
static unsigned int nocst = 0;
module_param(nocst, uint, 0000);
+static unsigned int idle_ms = 40;
+module_param(idle_ms, uint, 0644);
+MODULE_PARM_DESC(idle_ms, "Promote to lower state if machine stays shorter than x ms not in idle func (avg) [40].");
+
+static unsigned int bm_promote_ms = 30;
+module_param(bm_promote_ms, uint, 0644);
+MODULE_PARM_DESC(bm_promote_ms, "Promote to lower state if avg bm is less than x ms [30].");
+
+//#define DEBUG 1
+#ifdef DEBUG
+#define myPrintk(string, args...) printk(KERN_INFO ""string, ##args);
+#else
+#define myPrintk(string, args...) {};
+#endif
+
+
/*
* bm_history -- bit-mask with a bit per jiffy of bus-master activity
* 1000 HZ: 0xFFFFFFFF: 32 jiffies = 32ms
@@ -162,6 +178,88 @@
return;
}
+u16 calc_average (u64 last_measures){
+ int x;
+ u16 ret = 0;
+ for (x = 0; x < sizeof(u64)*8; x+=16){
+ ret += (last_measures >> x) & (u64)0xFFFF;
+// myPrintk (KERN_INFO "x: %d - ret: %X - last_measures: %X - result %X\n", x, ret, (u64)last_measures, (last_measures >> x) & (u64)0xFFFF);
+ }
+/* divide by four -> average bm activity for the last 4 times */
+ ret >>= 2;
+ return ret;
+}
+
+/*
+ * check BM Activity
+ * -----------------
+ * Check for bus mastering activity and save history in
+ * pr->power.bm_activity
+ *
+ * return 0 -> no bm activity for long time
+ * return 1 -> we currently have bus master activity
+ *
+ */
+
+static void check_bm_activity(struct acpi_processor *pr) {
+ u32 bm_status = 0;
+ unsigned long diff = jiffies - pr->power.bm_check_timestamp;
+
+#ifndef CONFIG_NO_IDLE_HZ
+ if (diff > 32)
+ diff = 32;
+ while (diff) {
+ /* if we didn't get called, assume there was busmaster activity */
+ diff--;
+ if (diff)
+ pr->power.bm_activity |= 0x1;
+ pr->power.bm_activity <<= 1;
+ }
+
+ acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
+ &bm_status, ACPI_MTX_DO_NOT_LOCK);
+ if (bm_status) {
+ pr->power.bm_activity++;
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS,
+ 1, ACPI_MTX_DO_NOT_LOCK);
+ }
+ /*
+ * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect
+ * the true state of bus mastering activity; forcing us to
+ * manually check the BMIDEA bit of each IDE channel.
+ */
+ else if (errata.piix4.bmisx) {
+ if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
+ || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
+ pr->power.bm_activity++;
+ }
+ pr->power.bm_check_timestamp = jiffies;
+
+#else
+ if (diff > 0xFFFF)
+ diff = 0xFFFF;
+ acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
+ &bm_status, ACPI_MTX_DO_NOT_LOCK);
+// myPrintk (KERN_INFO "bm_status - %d, diff: %lu - bm_avg_ms: %X\n",
+// bm_status, diff, pr->power.bm_avg_ms);
+ if (bm_status) {
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS,
+ 1, ACPI_MTX_DO_NOT_LOCK);
+ /* we had an active bus master -> get timestamp */
+ pr->power.bm_check_timestamp = jiffies;
+ pr->power.bm_last_measures <<= 16;
+ }
+ /* just OR, even if !bm_status, shouldn't matter */
+ pr->power.bm_last_measures |= diff;
+
+// myPrintk (KERN_INFO "diff: %lu - Avg: bm_last_measures: %#16X\n", diff, (u64)pr->power.bm_last_measures);
+
+ pr->power.bm_avg_ms = calc_average (pr->power.bm_last_measures);
+
+
+// printk (KERN_INFO "Avg: bm_avg_ms: %lu ms \n", (unsigned long)pr->power.bm_avg_ms);
+#endif
+}
static void acpi_processor_idle (void)
{
@@ -171,6 +269,12 @@
int sleep_ticks = 0;
u32 t1, t2 = 0;
+#ifdef CONFIG_NO_IDLE_HZ
+ struct acpi_processor_cx *temp_state = NULL;
+ int i = 0;
+ unsigned long diff = jiffies - pr->power.active_timestamp;
+#endif
+
pr = processors[_smp_processor_id()];
if (!pr)
return;
@@ -191,9 +295,27 @@
}
cx = pr->power.state;
+
+#ifdef CONFIG_NO_IDLE_HZ
+ /* keep track of bm activity */
+ check_bm_activity(pr);
+
+ unsigned long diff = jiffies - pr->power.active_timestamp;
+ if (diff > 0xFFFF)
+ diff = 0xFFFF;
+ pr->power.active_last_measures <<= 16;
+ pr->power.active_last_measures |= (u16)diff;
+ pr->power.active_avg_ms = calc_average(pr->power.active_last_measures);
+ if (pr->power.active_avg_ms > idle_ms){
+ printk (KERN_INFO "We were not idle for %d ms (4 times avg) -> goto C1\n", pr->power.active_avg_ms);
+ next_state = &pr->power.states[ACPI_STATE_C1];
+ goto end;
+ }
+#endif
if (!cx)
goto easy_out;
-
+
+#ifndef CONFIG_NO_IDLE_HZ
/*
* Check BM Activity
* -----------------
@@ -201,40 +323,8 @@
* for demotion.
*/
if (pr->flags.bm_check) {
- u32 bm_status = 0;
- unsigned long diff = jiffies - pr->power.bm_check_timestamp;
-
- if (diff > 32)
- diff = 32;
-
- while (diff) {
- /* if we didn't get called, assume there was busmaster activity */
- diff--;
- if (diff)
- pr->power.bm_activity |= 0x1;
- pr->power.bm_activity <<= 1;
- }
-
- acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
- &bm_status, ACPI_MTX_DO_NOT_LOCK);
- if (bm_status) {
- pr->power.bm_activity++;
- acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS,
- 1, ACPI_MTX_DO_NOT_LOCK);
- }
- /*
- * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect
- * the true state of bus mastering activity; forcing us to
- * manually check the BMIDEA bit of each IDE channel.
- */
- else if (errata.piix4.bmisx) {
- if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
- || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
- pr->power.bm_activity++;
- }
-
- pr->power.bm_check_timestamp = jiffies;
-
+
+ check_bm_activity(pr);
/*
* Apply bus mastering demotion policy. Automatically demote
* to avoid a faulty transition. Note that the processor
@@ -253,6 +343,8 @@
goto end;
}
}
+#endif
+ cx->usage++;
cx->usage++;
@@ -278,7 +370,7 @@
* go to an ISR rather than here. Need to instrument
* base interrupt handler.
*/
- sleep_ticks = 0xFFFFFFFF;
+ sleep_ticks = 0xFFFFFFF;
break;
case ACPI_STATE_C2:
@@ -320,8 +412,51 @@
return;
}
+ if (sleep_ticks <= 0)
+ cx->failed++;
+
+#ifdef CONFIG_NO_IDLE_HZ
+ pr->power.sleep_last_measures <<= 16;
+ pr->power.sleep_last_measures |= sleep_ticks;
+ pr->power.sleep_avg_ticks = calc_average(pr->power.sleep_last_measures);
+#endif
+
next_state = pr->power.state;
+#ifdef CONFIG_NO_IDLE_HZ
+
+ /* use C1/C2 if we have to much bus master activity */
+ if (bm_promote_ms >= pr->power.bm_avg_ms){
+ myPrintk ("pr->power.bm_avg_ms: %d\n", (int)pr->power.bm_avg_ms);
+ next_state = &pr->power.states[ACPI_STATE_C2];
+ if (next_state == NULL || !next_state->valid){
+ next_state = &pr->power.states[ACPI_STATE_C1];
+ if (next_state == NULL || !next_state->valid)
+ goto easy_out;
+
+ }
+ goto end;
+ }
+
+
+ /* goto sleep state which latency fits best to avg sleep time
+ of the last 4 sleep cycles */
+ for (i=ACPI_STATE_C2; i < ACPI_PROCESSOR_MAX_POWER; i++) {
+ temp_state = &pr->power.states[i];
+ if (temp_state == NULL || !temp_state->valid)
+ break;
+ myPrintk ("pr->power.sleep_avg_ticks: %d - temp_state->promotion.threshold.ticks: %d"
+ " - sleep_ticks; %d\n",
+ pr->power.sleep_avg_ticks, temp_state->promotion.threshold.ticks, sleep_ticks);
+ if (temp_state->promotion.state &&
+ sleep_ticks > temp_state->promotion.threshold.ticks &&
+ pr->power.sleep_avg_ticks > temp_state->promotion.threshold.ticks){
+ next_state = temp_state->promotion.state;
+ }
+ else
+ break;
+ }
+#else
/*
* Promotion?
* ----------
@@ -330,6 +465,7 @@
* mastering activity may prevent promotions.
* Do not promote above max_cstate.
*/
+
if (cx->promotion.state &&
((cx->promotion.state - pr->power.states) <= max_cstate)) {
if (sleep_ticks > cx->promotion.threshold.ticks) {
@@ -366,6 +502,7 @@
}
}
}
+#endif
end:
/*
@@ -384,7 +521,9 @@
*/
if (next_state != pr->power.state)
acpi_processor_power_activate(pr, next_state);
-
+#ifdef CONFIG_NO_IDLE_HZ
+ pr->power.active_timestamp = jiffies;
+#endif
return;
easy_out:
@@ -393,6 +532,9 @@
pm_idle_save();
else
safe_halt();
+#ifdef CONFIG_NO_IDLE_HZ
+ pr->power.active_timestamp = jiffies;
+#endif
return;
}
@@ -910,6 +1052,9 @@
seq_printf(seq, "latency[%03d] usage[%08d]\n",
pr->power.states[i].latency,
pr->power.states[i].usage);
+ seq_printf(seq, " failed[%08d]\n",
+ pr->power.states[i].failed);
+
}
end:
--- linux-2.6.12-rc2.orig/include/acpi/processor.h 2005-04-19 15:03:44.000000000 +0200
+++ linux-2.6.12-rc2/include/acpi/processor.h 2005-04-19 15:17:56.000000000 +0200
@@ -48,6 +48,7 @@
u32 latency_ticks;
u32 power;
u32 usage;
+ u32 failed;
struct acpi_processor_cx_policy promotion;
struct acpi_processor_cx_policy demotion;
};
@@ -55,8 +56,16 @@
struct acpi_processor_power {
struct acpi_processor_cx *state;
unsigned long bm_check_timestamp;
- u32 default_state;
u32 bm_activity;
+#ifdef CONFIG_NO_IDLE_HZ
+ u16 bm_avg_ms;
+ u64 bm_last_measures;
+ u16 sleep_avg_ticks;
+ u64 sleep_last_measures;
+ unsigned long active_timestamp;
+ u16 active_avg_ms;
+ u64 active_last_measures;
+#endif
int count;
struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
};
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-19 14:56 ` [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures Thomas Renninger
@ 2005-04-19 15:27 ` Dominik Brodowski
2005-04-19 21:03 ` Thomas Renninger
2005-04-19 21:09 ` Pavel Machek
1 sibling, 1 reply; 34+ messages in thread
From: Dominik Brodowski @ 2005-04-19 15:27 UTC (permalink / raw)
To: Thomas Renninger
Cc: Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Pavel Machek, Arjan van de Ven,
Martin Schwidefsky, Andrea Arcangeli, George Anzinger,
Thomas Gleixner, john stultz, Zwane Mwaikambo, Lee Revell,
ML ACPI-devel, Bodo Bauer, Andi Kleen
Hi,
On Tue, Apr 19, 2005 at 04:56:56PM +0200, Thomas Renninger wrote:
> If CONFIG_IDLE_HZ is set, the c-state will be evaluated on
> three control values (averages of the last 4 measures):
>
> a) idle_ms -> if machine was active for longer than this
> value (avg), the machine is assumed to not be idle
> and C1 will be triggered.
>
> b) bm_promote_ms -> if the avg bus master activity is below
> this threshold, C2 is invoked.
>
> c) sleep_avg (no module param) -> the average sleep time of the
> last four C2 (or higher) invokations.
> If a and b does not apply, a C-state will be searched that has
> the highest latency, but still has a latency below the latest
> C2 (or higher) sleeping time and average sleeping time value.
I think that we don't need this complication:
> +//#define DEBUG 1
> +#ifdef DEBUG
> +#define myPrintk(string, args...) printk(KERN_INFO ""string, ##args);
> +#else
> +#define myPrintk(string, args...) {};
> +#endif
Please don't do that... dprintk() is much more common. Also, then don't
comment dprintk() out below in the patch...
> if (pr->flags.bm_check) {
> - u32 bm_status = 0;
> - unsigned long diff = jiffies - pr->power.bm_check_timestamp;
> -
> - if (diff > 32)
> - diff = 32;
> -
> - while (diff) {
> - /* if we didn't get called, assume there was busmaster activity */
> - diff--;
> - if (diff)
> - pr->power.bm_activity |= 0x1;
> - pr->power.bm_activity <<= 1;
> - }
"All" we need to do is to update the "diff". Without dynamic ticks, if the
idle loop didn't get called each jiffy, it was a big hint that there was so
much activity in between, and if there is activity, there is most likely
also bus master activity, or at least more work to do, so interrupt activity
is likely. Therefore we assume there was bm_activity even if there was none.
Now, we do know the jiffy value when we started sleeping. If we use
ticks_elapsed(t1, t2), convert it to jiffies, and do
diff = jiffies - (pr->power.bm_check_timestamp + last_sleep_jiffies);
it should work. I wrote a quick patch to do that, but it locked up my
notebook, so it is most likely broken; hopefully I'll find some time to debug
it, if somebody does it earlier, that'd be great, though.
Thanks,
Dominik
Only assume busmaster activity on non-idle ticks if we didn't sleep until
that jiffy. Needed for dyn-idle.
Signed-off-by: Dominik Brodowski <linux@brodo.de>
--- linux/drivers/acpi/processor_idle.c.original 2005-04-10 20:04:12.000000000 +0200
+++ linux/drivers/acpi/processor_idle.c 2005-04-10 20:14:33.000000000 +0200
@@ -120,6 +120,14 @@
return ((0xFFFFFFFF - t1) + t2);
}
+static inline u32
+ticks_to_jiffies (u32 pm_ticks)
+{
+ pm_ticks *= 286;
+ pm_ticks = (pm_ticks >> 10);
+ return (pm_ticks / (USEC_PER_SEC / HZ));
+}
+
static void
acpi_processor_power_activate (
@@ -169,7 +177,7 @@
struct acpi_processor_cx *cx = NULL;
struct acpi_processor_cx *next_state = NULL;
int sleep_ticks = 0;
- u32 t1, t2 = 0;
+ u32 t1, t2, td = 0;
pr = processors[_smp_processor_id()];
if (!pr)
@@ -201,11 +209,13 @@
* for demotion.
*/
if (pr->flags.bm_check) {
- u32 bm_status = 0;
- unsigned long diff = jiffies - pr->power.bm_check_timestamp;
+ u32 bm_status = 0;
+ long diff = jiffies - pr->power.bm_check_timestamp;
if (diff > 32)
diff = 32;
+ else if (diff < 0)
+ diff = 0;
while (diff) {
/* if we didn't get called, assume there was busmaster activity */
@@ -293,7 +303,9 @@
/* Re-enable interrupts */
local_irq_enable();
/* Compute time (ticks) that we were actually asleep */
- sleep_ticks = ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD;
+ td = ticks_elapsed(t1, t2);
+ sleep_ticks = td - cx->latency_ticks - C2_OVERHEAD;
+ pr->power.bm_check_timestamp += ticks_to_jiffies(td);
break;
case ACPI_STATE_C3:
@@ -312,7 +324,9 @@
/* Re-enable interrupts */
local_irq_enable();
/* Compute time (ticks) that we were actually asleep */
- sleep_ticks = ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD;
+ td = ticks_elapsed(t1, t2);
+ sleep_ticks = td - cx->latency_ticks - C3_OVERHEAD;
+ pr->power.bm_check_timestamp += ticks_to_jiffies(td);
break;
default:
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-19 15:27 ` Dominik Brodowski
@ 2005-04-19 21:03 ` Thomas Renninger
2005-04-20 11:44 ` Dominik Brodowski
0 siblings, 1 reply; 34+ messages in thread
From: Thomas Renninger @ 2005-04-19 21:03 UTC (permalink / raw)
To: Dominik Brodowski
Cc: Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Pavel Machek, Arjan van de Ven,
Martin Schwidefsky, Andrea Arcangeli, George Anzinger,
Thomas Gleixner, john stultz, Zwane Mwaikambo, Lee Revell,
ML ACPI-devel, Bodo Bauer, Andi Kleen
Reducing the CC'd people a bit ...
Dominik Brodowski wrote:
> Hi,
>
> On Tue, Apr 19, 2005 at 04:56:56PM +0200, Thomas Renninger wrote:
>>If CONFIG_IDLE_HZ is set, the c-state will be evaluated on
>>three control values (averages of the last 4 measures):
>>
>>a) idle_ms -> if machine was active for longer than this
>> value (avg), the machine is assumed to not be idle
>> and C1 will be triggered.
>>
>>b) bm_promote_ms -> if the avg bus master activity is below
>> this threshold, C2 is invoked.
>>
>>c) sleep_avg (no module param) -> the average sleep time of the
>> last four C2 (or higher) invokations.
>> If a and b does not apply, a C-state will be searched that has
>> the highest latency, but still has a latency below the latest
>> C2 (or higher) sleeping time and average sleeping time value.
>
> I think that we don't need this complication:
>
>>+//#define DEBUG 1
>>+#ifdef DEBUG
>>+#define myPrintk(string, args...) printk(KERN_INFO ""string, ##args);
>>+#else
>>+#define myPrintk(string, args...) {};
>>+#endif
>
> Please don't do that... dprintk() is much more common. Also, then don't
> comment dprintk() out below in the patch...
>
Ok, this patch is far from perfect, I am happy that it finally runs that nice on
my machine.
>> if (pr->flags.bm_check) {
>>- u32 bm_status = 0;
>>- unsigned long diff = jiffies - pr->power.bm_check_timestamp;
>>-
>>- if (diff > 32)
>>- diff = 32;
>>-
>>- while (diff) {
>>- /* if we didn't get called, assume there was busmaster activity */
>>- diff--;
>>- if (diff)
>>- pr->power.bm_activity |= 0x1;
>>- pr->power.bm_activity <<= 1;
>>- }
>
> "All" we need to do is to update the "diff". Without dynamic ticks, if the
> idle loop didn't get called each jiffy, it was a big hint that there was so
> much activity in between, and if there is activity, there is most likely
> also bus master activity, or at least more work to do, so interrupt activity
> is likely. Therefore we assume there was bm_activity even if there was none.
>
If I understand this right you want at least wait 32 (or whatever value) ms if there was bm activity,
before it is allowed to trigger C3/C4?
I think the problem is (at least I made the experience with this particular machine)
that bm activity comes very often and regularly (each 30-150ms?).
I think the approach to directly adjust the latency to a deeper sleep state if the
average bus master and OS activity is low is very efficient.
Because I don't consider whether there was bm_activity the last ms, I only
consider the average, it seems to happen that I try to trigger
C3/C4 when there is just something copied and some bm active ?!? Therefore, it seems to happen
that triggering C3/C4 fails (sleep_ticks < 0). The value of failures is getting smaller if I increase
the limit for average bm activity before triggering C3/C4 (bm_promote_ms must be smaller than average bm activity),
but it never will reach zero.
The patch is useless if these failures end up in system freezes on other machines...
AFAIK there were a lot of freeze problems with C-states? Don't know, it works here.
The problem with the old approach is, that after (doesn't matter C1-Cx) sleep and dyn_idle_tick,
the chance to wake up because of bm activity is very likely.
You enter idle() again -> there was bm_activity -> C2. Wake up after e.g. 50ms, because
of bm_activity again (bm_sts bit set) -> stay in C2, wake up after 40ms -> bm activity...
You only have the chance to get into deeper states if the sleeps are interrupted by an interrupt, not bm activity.
I also thought about only reprogram timer if C1/C2 was successful x times and no bm activity was detected,
same mechanism as now, then only reprogram timer (dyn tick) for deeper sleep states -> like that, you
still can be sure the last x ms was no bm activity bit set before going to deep sleeps.
But I don't know how to do it.
> Now, we do know the jiffy value when we started sleeping. If we use
> ticks_elapsed(t1, t2), convert it to jiffies, and do
> diff = jiffies - (pr->power.bm_check_timestamp + last_sleep_jiffies);
> it should work. I wrote a quick patch to do that, but it locked up my
> notebook, so it is most likely broken; hopefully I'll find some time to debug
> it, if somebody does it earlier, that'd be great, though.
>
> Thanks,
> Dominik
>
>
> Only assume busmaster activity on non-idle ticks if we didn't sleep until
> that jiffy. Needed for dyn-idle.
>
> Signed-off-by: Dominik Brodowski <linux@brodo.de>
>
> --- linux/drivers/acpi/processor_idle.c.original 2005-04-10 20:04:12.000000000 +0200
> +++ linux/drivers/acpi/processor_idle.c 2005-04-10 20:14:33.000000000 +0200
> @@ -120,6 +120,14 @@
> return ((0xFFFFFFFF - t1) + t2);
> }
>
> +static inline u32
> +ticks_to_jiffies (u32 pm_ticks)
> +{
> + pm_ticks *= 286;
> + pm_ticks = (pm_ticks >> 10);
> + return (pm_ticks / (USEC_PER_SEC / HZ));
> +}
> +
>
> static void
> acpi_processor_power_activate (
> @@ -169,7 +177,7 @@
> struct acpi_processor_cx *cx = NULL;
> struct acpi_processor_cx *next_state = NULL;
> int sleep_ticks = 0;
> - u32 t1, t2 = 0;
> + u32 t1, t2, td = 0;
>
> pr = processors[_smp_processor_id()];
> if (!pr)
> @@ -201,11 +209,13 @@
> * for demotion.
> */
> if (pr->flags.bm_check) {
> - u32 bm_status = 0;
> - unsigned long diff = jiffies - pr->power.bm_check_timestamp;
> + u32 bm_status = 0;
> + long diff = jiffies - pr->power.bm_check_timestamp;
>
> if (diff > 32)
> diff = 32;
> + else if (diff < 0)
> + diff = 0;
>
> while (diff) {
> /* if we didn't get called, assume there was busmaster activity */
> @@ -293,7 +303,9 @@
> /* Re-enable interrupts */
> local_irq_enable();
> /* Compute time (ticks) that we were actually asleep */
> - sleep_ticks = ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD;
> + td = ticks_elapsed(t1, t2);
> + sleep_ticks = td - cx->latency_ticks - C2_OVERHEAD;
> + pr->power.bm_check_timestamp += ticks_to_jiffies(td);
> break;
>
> case ACPI_STATE_C3:
> @@ -312,7 +324,9 @@
> /* Re-enable interrupts */
> local_irq_enable();
> /* Compute time (ticks) that we were actually asleep */
> - sleep_ticks = ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD;
> + td = ticks_elapsed(t1, t2);
> + sleep_ticks = td - cx->latency_ticks - C3_OVERHEAD;
> + pr->power.bm_check_timestamp += ticks_to_jiffies(td);
> break;
>
> default:
Hmm, I can give it a shot the next days ...
You could also test whether it was bm activity here that caused the end of sleep (it should be in most cases):
acpi_get_register(ACPI_BITREG_BUS_MASTER_RLD, &bm_wakeup, ACPI_MTX_DO_NOT_LOCK);
if (bm_wakeup){
printk(KERN_INFO "Woke up from C3 from bus master activity after %d ticks\n", td);
acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1, ACPI_MTX_DO_NOT_LOCK);
/* also reset bm_sts bit ?!? */
pr->power.bm_activity++;
}
else{
printk(KERN_INFO "Did not wake up from C3 from bus master activity\n");
}
pr->power.bm_check_timestamp += ticks_to_jiffies(td);
Hmm I wonder what the difference is after waking up and checking for bm_rld or bm_sts bit ...
Thomas
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-19 14:56 ` [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures Thomas Renninger
2005-04-19 15:27 ` Dominik Brodowski
@ 2005-04-19 21:09 ` Pavel Machek
2005-04-20 20:01 ` Tony Lindgren
1 sibling, 1 reply; 34+ messages in thread
From: Pavel Machek @ 2005-04-19 21:09 UTC (permalink / raw)
To: Thomas Renninger
Cc: Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, ML ACPI-devel, Bodo Bauer,
Andi Kleen
Hi!
> The machine is a Pentium M 2.00 GHz, supporting C0-C4 processor power states.
> The machine run at 2.00 GHz all the time.
..
> _passing bm_history=0xFFFFFFFF (default) to processor module:_
>
> Average current the last 470 seconds: *1986mA* (also measured better
> values ~1800, does battery level play a role?!?)
Probably yes. If voltage changes, 2000mA means different ammount of power.
> (cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FFFFFFFF)
>
>
> _passing bm_history=0xFF to processor module:_
>
> Average current the last 190 seconds: *1757mA*
> (cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FF)
> (Usage count could be bogus, as some invokations could not succeed
> if bm has currently been active).
Ok.
> idle_ms == 100, bm_promote_bs == 30
> Average current the last 80 seconds: *1466mA*
> (cmp.
> ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_100_bm_30)
Very nice indeed. That seems like ~5W saved, right? That might give
you one more hour of battery life....
Pavel
--
Boycott Kodak -- for their patent abuse against Java.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-19 21:03 ` Thomas Renninger
@ 2005-04-20 11:44 ` Dominik Brodowski
2005-04-20 11:57 ` Pavel Machek
2005-04-20 12:24 ` Thomas Renninger
0 siblings, 2 replies; 34+ messages in thread
From: Dominik Brodowski @ 2005-04-20 11:44 UTC (permalink / raw)
To: Thomas Renninger
Cc: Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Pavel Machek, Arjan van de Ven,
Martin Schwidefsky, Andrea Arcangeli, George Anzinger,
Thomas Gleixner, john stultz, Zwane Mwaikambo, Lee Revell,
ML ACPI-devel, Bodo Bauer, Andi Kleen
On Tue, Apr 19, 2005 at 11:03:30PM +0200, Thomas Renninger wrote:
> > "All" we need to do is to update the "diff". Without dynamic ticks, if the
> > idle loop didn't get called each jiffy, it was a big hint that there was so
> > much activity in between, and if there is activity, there is most likely
> > also bus master activity, or at least more work to do, so interrupt activity
> > is likely. Therefore we assume there was bm_activity even if there was none.
> >
> If I understand this right you want at least wait 32 (or whatever value) ms if there was bm activity,
> before it is allowed to trigger C3/C4?
That's the theory of operation of the current algorithm. I think that we
should do that small change to the current algorithm which allows us to keep
C3/C4 working with dyn-idle first, and then think of a very small abstraction
layer to test different idle algroithms, and -- possibly -- use different
ones for different usages.
> I think the problem is (at least I made the experience with this particular
> machine) that bm activity comes very often and regularly (each 30-150ms?).
>
> I think the approach to directly adjust the latency to a deeper sleep state if the
> average bus master and OS activity is low is very efficient.
>
> Because I don't consider whether there was bm_activity the last ms, I only
> consider the average, it seems to happen that I try to trigger
> C3/C4 when there is just something copied and some bm active ?!?
I don't think that this is perfect behaviour: if the system is idle, and
there is _currently_ bus master activity, the CPU should be put into C1 or
C2 type sleep. If you select C3 and actually enter it, you're risking
DMA issues, AFAICS.
> The patch is useless if these failures end up in system freezes on
> other machines...
I know that my patch is useless in its current form, but I wanted to share
it as a different way of doing things.
> The problem with the old approach is, that after (doesn't matter C1-Cx)
> sleep and dyn_idle_tick, the chance to wake up because of bm activity is
> very likely.
> You enter idle() again -> there was bm_activity -> C2. Wake up after e.g.
> 50ms, because of bm_activity again (bm_sts bit set) -> stay in C2, wake up
> after 40ms -> bm activity... You only have the chance to get into deeper
> states if the sleeps are interrupted by an interrupt, not bm activity.
That's a side-effect, indeed. However: if there _is_ bus master activity, we
must not enter C3, AFAICS.
Dominik
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-20 11:44 ` Dominik Brodowski
@ 2005-04-20 11:57 ` Pavel Machek
2005-04-20 12:01 ` Dominik Brodowski
2005-04-20 12:24 ` Thomas Renninger
1 sibling, 1 reply; 34+ messages in thread
From: Pavel Machek @ 2005-04-20 11:57 UTC (permalink / raw)
To: Dominik Brodowski, Thomas Renninger, Tony Lindgren,
Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, ML ACPI-devel, Bodo Bauer, Andi Kleen
Hi!
> > Because I don't consider whether there was bm_activity the last ms, I only
> > consider the average, it seems to happen that I try to trigger
> > C3/C4 when there is just something copied and some bm active ?!?
>
> I don't think that this is perfect behaviour: if the system is idle, and
> there is _currently_ bus master activity, the CPU should be put into C1 or
> C2 type sleep. If you select C3 and actually enter it, you're risking
> DMA issues, AFAICS.
What kinds of DMA issues? Waiting 32msec or so is only heuristic; it
can go wrong any time. It would be really bad if it corrupted data or
something like that.
Pavel
--
Boycott Kodak -- for their patent abuse against Java.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-20 11:57 ` Pavel Machek
@ 2005-04-20 12:01 ` Dominik Brodowski
2005-04-20 12:08 ` Pavel Machek
0 siblings, 1 reply; 34+ messages in thread
From: Dominik Brodowski @ 2005-04-20 12:01 UTC (permalink / raw)
To: Pavel Machek
Cc: Thomas Renninger, Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, ML ACPI-devel, Bodo Bauer,
Andi Kleen
On Wed, Apr 20, 2005 at 01:57:39PM +0200, Pavel Machek wrote:
> Hi!
>
> > > Because I don't consider whether there was bm_activity the last ms, I only
> > > consider the average, it seems to happen that I try to trigger
> > > C3/C4 when there is just something copied and some bm active ?!?
> >
> > I don't think that this is perfect behaviour: if the system is idle, and
> > there is _currently_ bus master activity, the CPU should be put into C1 or
> > C2 type sleep. If you select C3 and actually enter it, you're risking
> > DMA issues, AFAICS.
>
> What kinds of DMA issues? Waiting 32msec or so is only heuristic; it
> can go wrong any time. It would be really bad if it corrupted data or
> something like that.
loop()
a) bus mastering activity is going on at the very moment
b) the CPU is entering C3
c) the CPU is woken out of C3 because of bus mastering activity
the repeated delay between b) and c) might be problematic, as can be seen
by the comment in processor_idle.c:
* TBD: A better policy might be to fallback to the demotion
* state (use it for this quantum only) istead of
* demoting -- and rely on duration as our sole demotion
* qualification. This may, however, introduce DMA
* issues (e.g. floppy DMA transfer overrun/underrun).
*/
I'm not so worried about floppy DMA but about the ipw2x00 issues here.
Dominik
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-20 12:01 ` Dominik Brodowski
@ 2005-04-20 12:08 ` Pavel Machek
2005-04-20 12:13 ` Dominik Brodowski
0 siblings, 1 reply; 34+ messages in thread
From: Pavel Machek @ 2005-04-20 12:08 UTC (permalink / raw)
To: Dominik Brodowski, Thomas Renninger, Tony Lindgren,
Frank Sorenson, linux-kernel, Benjamin Herrenschmidt,
Arjan van de Ven, Martin Schwidefsky, Andrea Arcangeli,
George Anzinger, Thomas Gleixner, john stultz, Zwane Mwaikambo,
Lee Revell, ML ACPI-devel, Bodo Bauer, Andi Kleen
Hi!
> > > > Because I don't consider whether there was bm_activity the last ms, I only
> > > > consider the average, it seems to happen that I try to trigger
> > > > C3/C4 when there is just something copied and some bm active ?!?
> > >
> > > I don't think that this is perfect behaviour: if the system is idle, and
> > > there is _currently_ bus master activity, the CPU should be put into C1 or
> > > C2 type sleep. If you select C3 and actually enter it, you're risking
> > > DMA issues, AFAICS.
> >
> > What kinds of DMA issues? Waiting 32msec or so is only heuristic; it
> > can go wrong any time. It would be really bad if it corrupted data or
> > something like that.
>
> loop()
> a) bus mastering activity is going on at the very moment
> b) the CPU is entering C3
> c) the CPU is woken out of C3 because of bus mastering activity
>
> the repeated delay between b) and c) might be problematic, as can be seen
> by the comment in processor_idle.c:
>
> * TBD: A better policy might be to fallback to the demotion
> * state (use it for this quantum only) istead of
> * demoting -- and rely on duration as our sole demotion
> * qualification. This may, however, introduce DMA
> * issues (e.g. floppy DMA transfer overrun/underrun).
> */
>
> I'm not so worried about floppy DMA but about the ipw2x00 issues here.
Like "ipw2x00 looses packets" if this happens too often?
Pavel
--
Boycott Kodak -- for their patent abuse against Java.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-20 12:08 ` Pavel Machek
@ 2005-04-20 12:13 ` Dominik Brodowski
0 siblings, 0 replies; 34+ messages in thread
From: Dominik Brodowski @ 2005-04-20 12:13 UTC (permalink / raw)
To: Pavel Machek
Cc: Thomas Renninger, Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, ML ACPI-devel, Bodo Bauer,
Andi Kleen
Hi,
On Wed, Apr 20, 2005 at 02:08:46PM +0200, Pavel Machek wrote:
> Like "ipw2x00 looses packets" if this happens too often?
See "PCI latency error if C3 enabled" on http://ipw2100.sf.net -- it causes
network instability, frequent firmware restarts.
Dominik
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-20 11:44 ` Dominik Brodowski
2005-04-20 11:57 ` Pavel Machek
@ 2005-04-20 12:24 ` Thomas Renninger
1 sibling, 0 replies; 34+ messages in thread
From: Thomas Renninger @ 2005-04-20 12:24 UTC (permalink / raw)
To: Dominik Brodowski
Cc: Tony Lindgren, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Pavel Machek, Arjan van de Ven,
Martin Schwidefsky, Andrea Arcangeli, George Anzinger,
Thomas Gleixner, john stultz, Zwane Mwaikambo, Lee Revell,
ML ACPI-devel, Bodo Bauer, Andi Kleen
Dominik Brodowski wrote:
> On Tue, Apr 19, 2005 at 11:03:30PM +0200, Thomas Renninger wrote:
>>>"All" we need to do is to update the "diff". Without dynamic ticks, if the
>>>idle loop didn't get called each jiffy, it was a big hint that there was so
>>>much activity in between, and if there is activity, there is most likely
>>>also bus master activity, or at least more work to do, so interrupt activity
>>>is likely. Therefore we assume there was bm_activity even if there was none.
>>>
>>If I understand this right you want at least wait 32 (or whatever value) ms if there was bm activity,
>>before it is allowed to trigger C3/C4?
>
> That's the theory of operation of the current algorithm. I think that we
> should do that small change to the current algorithm which allows us to keep
> C3/C4 working with dyn-idle first, and then think of a very small abstraction
> layer to test different idle algroithms, and -- possibly -- use different
> ones for different usages.
>
>>I think the problem is (at least I made the experience with this particular
>>machine) that bm activity comes very often and regularly (each 30-150ms?).
>>
>>I think the approach to directly adjust the latency to a deeper sleep state if the
>>average bus master and OS activity is low is very efficient.
>>
>>Because I don't consider whether there was bm_activity the last ms, I only
>>consider the average, it seems to happen that I try to trigger
>>C3/C4 when there is just something copied and some bm active ?!?
>
> I don't think that this is perfect behaviour: if the system is idle, and
> there is _currently_ bus master activity, the CPU should be put into C1 or
> C2 type sleep. If you select C3 and actually enter it, you're risking
> DMA issues, AFAICS.
>
On my system triggering C3/C4 is just ignored (sleep_ticks < 0).
These ignorings (C3/C4 failures) seem to directly depend on how much bm_activity
there actually is.
With the current method (wait at least 30 ms if there was bm activity before
triggering C3/C4) these failures never happened.
As mentioned using bm_promotion_ms you can lower the failures, but never reach zero.
If these failures lead to system freezes on other systems, my next sentence is valid
(I meant my patch).
>>The patch is useless if these failures end up in system freezes on
>>other machines...
>
> I know that my patch is useless in its current form, but I wanted to share
> it as a different way of doing things.
>
>>The problem with the old approach is, that after (doesn't matter C1-Cx)
>>sleep and dyn_idle_tick, the chance to wake up because of bm activity is
>>very likely.
>>You enter idle() again -> there was bm_activity -> C2. Wake up after e.g.
>>50ms, because of bm_activity again (bm_sts bit set) -> stay in C2, wake up
>>after 40ms -> bm activity... You only have the chance to get into deeper
>>states if the sleeps are interrupted by an interrupt, not bm activity.
>
> That's a side-effect, indeed. However: if there _is_ bus master activity, we
> must not enter C3, AFAICS.
>
What about a mixed approach: only reprogram timer if you want to go to deeper
sleeping states (C3-Cx) when bm activity comes in place?
It's the only way you can say: the last xy ms there was no bm activity (use bm_history),
now it's safe to sleep and also be efficient: don't sleep forever in C1/C2 -> bm_sts bit
will probably be set afterwards and you need to wait another xy ms in C1/C2
-> endless loop ...
Like that the timer is only disabled where it is really useful, on C3-Cx machines
(or are there other cases?).
Thomas
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-19 21:09 ` Pavel Machek
@ 2005-04-20 20:01 ` Tony Lindgren
2005-04-21 7:54 ` Thomas Renninger
0 siblings, 1 reply; 34+ messages in thread
From: Tony Lindgren @ 2005-04-20 20:01 UTC (permalink / raw)
To: Pavel Machek
Cc: Thomas Renninger, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, ML ACPI-devel, Bodo Bauer,
Andi Kleen
* Pavel Machek <pavel@suse.cz> [050419 14:10]:
> Hi!
>
> > The machine is a Pentium M 2.00 GHz, supporting C0-C4 processor power states.
> > The machine run at 2.00 GHz all the time.
> ..
> > _passing bm_history=0xFFFFFFFF (default) to processor module:_
> >
> > Average current the last 470 seconds: *1986mA* (also measured better
> > values ~1800, does battery level play a role?!?)
>
> Probably yes. If voltage changes, 2000mA means different ammount of power.
Thomas, thanks for doing all the stats and patches to squeeze some
real power savings out of this! :)
We should display both average mA and average Watts with pmstats.
BTW, I've posted Thomas' version of pmstats as pmstats-0.2.gz to
muru.com also.
> > (cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FFFFFFFF)
> >
> >
> > _passing bm_history=0xFF to processor module:_
> >
> > Average current the last 190 seconds: *1757mA*
> > (cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FF)
> > (Usage count could be bogus, as some invokations could not succeed
> > if bm has currently been active).
>
> Ok.
>
> > idle_ms == 100, bm_promote_bs == 30
> > Average current the last 80 seconds: *1466mA*
> > (cmp.
> > ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_100_bm_30)
>
> Very nice indeed. That seems like ~5W saved, right? That might give
> you one more hour of battery life....
Depending on your battery capacity. But looking at the average Watts
on the first 8 lines of the two stats above:
1000_HZ_bm_history_FFFFFFFF:
(21.43 + 23.32 + 23.32 + 21.71 + 21.71 + 23.84 + 23.84 + 22.62) / 8
= 22.724W
tony_dyn_tick_processor_idle_100_bm_30:
(16.07 + 16.07 + 16.00 + 16.00 + 16.08 + 16.08 + 16.29 + 16.29) / 8
= 16.11W
And then comparing these two:
22.72 / 16.11 = 1.4103
So according to my calculations this should provide about 1.4 times
longer battery life compared to what you were getting earlier...
That is assuming system is mostly idle, of course.
Tony
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures
2005-04-20 20:01 ` Tony Lindgren
@ 2005-04-21 7:54 ` Thomas Renninger
0 siblings, 0 replies; 34+ messages in thread
From: Thomas Renninger @ 2005-04-21 7:54 UTC (permalink / raw)
To: Tony Lindgren
Cc: Pavel Machek, Frank Sorenson, linux-kernel,
Benjamin Herrenschmidt, Arjan van de Ven, Martin Schwidefsky,
Andrea Arcangeli, George Anzinger, Thomas Gleixner, john stultz,
Zwane Mwaikambo, Lee Revell, ML ACPI-devel, Bodo Bauer,
Andi Kleen
Tony Lindgren wrote:
> * Pavel Machek <pavel@suse.cz> [050419 14:10]:
>>Hi!
>>
>>>The machine is a Pentium M 2.00 GHz, supporting C0-C4 processor power states.
>>>The machine run at 2.00 GHz all the time.
>>..
>>>_passing bm_history=0xFFFFFFFF (default) to processor module:_
>>>
>>>Average current the last 470 seconds: *1986mA* (also measured better
>>>values ~1800, does battery level play a role?!?)
>>Probably yes. If voltage changes, 2000mA means different ammount of power.
>
> Thomas, thanks for doing all the stats and patches to squeeze some
> real power savings out of this! :)
>
> We should display both average mA and average Watts with pmstats.
> BTW, I've posted Thomas' version of pmstats as pmstats-0.2.gz to
> muru.com also.
>
>>>(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FFFFFFFF)
>>>
>>>
>>>_passing bm_history=0xFF to processor module:_
>>>
>>>Average current the last 190 seconds: *1757mA*
>>>(cmp. ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/1000_HZ_bm_history_FF)
>>>(Usage count could be bogus, as some invokations could not succeed
>>>if bm has currently been active).
>>Ok.
>>
>>>idle_ms == 100, bm_promote_bs == 30
>>>Average current the last 80 seconds: *1466mA*
>>>(cmp.
>>>ftp://ftp.suse.com/pub/people/trenn/dyn_tick_c_states/measures_C4_machine/tony_dyn_tick_processor_idle_100_bm_30)
>>Very nice indeed. That seems like ~5W saved, right? That might give
>>you one more hour of battery life....
>
> Depending on your battery capacity. But looking at the average Watts
> on the first 8 lines of the two stats above:
>
> 1000_HZ_bm_history_FFFFFFFF:
> (21.43 + 23.32 + 23.32 + 21.71 + 21.71 + 23.84 + 23.84 + 22.62) / 8
> = 22.724W
>
> tony_dyn_tick_processor_idle_100_bm_30:
> (16.07 + 16.07 + 16.00 + 16.00 + 16.08 + 16.08 + 16.29 + 16.29) / 8
> = 16.11W
>
> And then comparing these two:
> 22.72 / 16.11 = 1.4103
>
> So according to my calculations this should provide about 1.4 times
> longer battery life compared to what you were getting earlier...
> That is assuming system is mostly idle, of course.
>
Be aware that speedstep was off (2.0 GHz). When CPU frequency is controlled
you won't have that much enhancement anymore ...
Thomas
^ permalink raw reply [flat|nested] 34+ messages in thread
end of thread, other threads:[~2005-04-21 8:33 UTC | newest]
Thread overview: 34+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-06 8:30 [PATCH] Dynamic Tick version 050406-1 Tony Lindgren
2005-04-06 21:16 ` Frank Sorenson
2005-04-07 8:21 ` Tony Lindgren
2005-04-07 9:26 ` Alexander Nyberg
2005-04-08 6:22 ` Tony Lindgren
2005-04-07 21:35 ` Frank Sorenson
2005-04-07 22:20 ` Frank Sorenson
2005-04-08 6:25 ` Tony Lindgren
2005-04-08 7:50 ` [PATCH] Updated: Dynamic Tick version 050408-1 Tony Lindgren
2005-04-08 8:49 ` Frank Sorenson
2005-04-08 9:17 ` Tony Lindgren
2005-04-08 21:42 ` Frank Sorenson
2005-04-09 8:09 ` Tony Lindgren
2005-04-08 11:33 ` Thomas Renninger
2005-04-08 11:55 ` Tony Lindgren
2005-04-08 12:58 ` Thomas Renninger
2005-04-09 8:22 ` Tony Lindgren
2005-04-19 14:56 ` [PATCH] Updated: Dynamic Tick version 050408-1 - C-state measures Thomas Renninger
2005-04-19 15:27 ` Dominik Brodowski
2005-04-19 21:03 ` Thomas Renninger
2005-04-20 11:44 ` Dominik Brodowski
2005-04-20 11:57 ` Pavel Machek
2005-04-20 12:01 ` Dominik Brodowski
2005-04-20 12:08 ` Pavel Machek
2005-04-20 12:13 ` Dominik Brodowski
2005-04-20 12:24 ` Thomas Renninger
2005-04-19 21:09 ` Pavel Machek
2005-04-20 20:01 ` Tony Lindgren
2005-04-21 7:54 ` Thomas Renninger
2005-04-08 10:28 ` [PATCH] Updated: Dynamic Tick version 050408-1 Pavel Machek
2005-04-08 10:54 ` Tony Lindgren
2005-04-08 12:24 ` Pavel Machek
2005-04-09 9:56 ` Pavel Machek
2005-04-14 19:41 ` Tony Lindgren
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox