All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Andi Kleen <ak@suse.de>
Cc: patches@x86-64.org, linux-kernel@vger.kernel.org,
	Daniel Walker <dwalker@mvista.com>
Subject: Re: [PATCH] [15/58] i386: Rewrite sched_clock
Date: Thu, 19 Jul 2007 23:11:05 -0400	[thread overview]
Message-ID: <20070720031105.GA8237@Krystal> (raw)
In-Reply-To: <1184863904.6458.17.camel@dhcp193.mvista.com>

* Daniel Walker (dwalker@mvista.com) wrote:
> On Thu, 2007-07-19 at 11:54 +0200, Andi Kleen wrote:
> > Move it into an own file for easy sharing.
> > Do everything per CPU. This avoids problems with TSCs that
> > tick at different frequencies per CPU.
> > Resync properly on cpufreq changes. CPU frequency is instable
> > around cpu frequency changing, so fall back during a backing
> > clock during this period.
> > Hopefully TSC will work now on all systems except when there isn't a
> > physical TSC. 
> > 
> > And
> > 
> > +From: Jeremy Fitzhardinge <jeremy@goop.org>
> > Three cleanups there:
> >  - change "instable" -> "unstable"
> >  - it's better to use get_cpu_var for getting this cpu's variables
> >  - change cycles_2_ns to do the full computation rather than just the
> >    tsc->ns scaling.  It's a simpler interface, and it makes the function
....
> > +/*
> > + * Scheduler clock - returns current time in nanosec units.
> > + * All data is local to the CPU.
> > + * The values are approximately[1] monotonic local to a CPU, but not
> > + * between CPUs.   There might be also an occasionally random error,
> > + * but not too bad. Between CPUs the values can be non monotonic.
> > + *
> > + * [1] no attempt to stop CPU instruction reordering, which can hit
> > + * in a 100 instruction window or so.
> > + *
> > + * The clock can be in two states: stable and unstable.
> > + * When it is stable we use the TSC per CPU.
> > + * When it is unstable we use jiffies as fallback.
> > + * stable->unstable->stable transitions can happen regularly
> > + * during CPU frequency changes.
> > + * There is special code to avoid having the clock jump backwards
> > + * when we switch from TSC to jiffies, which needs to keep some state
> > + * per CPU. This state is protected against parallel state changes
> > + * with interrupts off.
> The comment still says something about interrupts off, but that was
> removed it looks like.
> 

I noticed the same thing about interrupts off when going through the
code. Andi, since you are already playing with per cpu variables, you
could leverage asm/local.h there by declaring last_val as local_t and
use either local_cmpxchg or local_add_return (depending on your needs)
to get both better performances than cli/sti _and_ be really atomic.

See this thread for performance tests:
http://www.ussg.iu.edu/hypermail/linux/kernel/0707.1/0832.html

Mathieu

> > + */
> > +unsigned long long tsc_sched_clock(void)
> > +{
> > +	unsigned long long r;
> > +	struct sc_data *sc = &get_cpu_var(sc_data);
> > +
> > +	if (unlikely(sc->unstable)) {
> > +		r = (jiffies_64 - sc->sync_base) * (1000000000 / HZ);
> > +		r += sc->ns_base;
> 
> Looking further down you aren't using this unstable path when the tsc is
> just outright unstable (i.e. some Cyrix systems IIRC)? An improvement
> over the original code would be to catch the systems that change
> frequencies without cpufreq (like the ones that gave Thomas so much
> trouble).
> 
> > +		/*
> > +		 * last_val is used to avoid non monotonity on a
> > +		 * stable->unstable transition. Make sure the time
> > +		 * never goes to before the last value returned by the
> > +		 * TSC clock.
> > +		 */
> > +		while (r <= sc->last_val) {
> > +			rmb();
> > +			r = sc->last_val + 1;
> > +			rmb();
> > +		}
> > +		sc->last_val = r;
> > +	} else {
> > +		rdtscll(r);
> > +		r = __cycles_2_ns(sc, r);
> > +		sc->last_val = r;
> > +	}
> > +
> > +	put_cpu_var(sc_data);
> > +
> > +	return r;
> > +}
> > +
> > +/* We need to define a real function for sched_clock, to override the
> > +   weak default version */
> > +#ifdef CONFIG_PARAVIRT
> > +unsigned long long sched_clock(void)
> > +{
> > +	return paravirt_sched_clock();
> > +}
> > +#else
> > +unsigned long long sched_clock(void)
> > +	__attribute__((alias("tsc_sched_clock")));
> > +#endif
> > +
> > +static int no_sc_for_printk;
> > +
> > +/*
> > + * printk clock: when it is known the sc results are very non monotonic
> > + * fall back to jiffies for printk. Other sched_clock users are supposed
> > + * to handle this.
> > + */
> > +unsigned long long printk_clock(void)
> > +{
> > +	if (unlikely(no_sc_for_printk))
> > +		return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
> > +	return tsc_sched_clock();
> > +}
> > +
> > +static void resolve_freq(struct cpufreq_freqs *freq)
> > +{
> > +	if (!freq->new) {
> > +		freq->new = cpufreq_get(freq->cpu);
> > +		if (!freq->new)
> > +			freq->new = tsc_khz;
> > +	}
> > +}
> > +
> > +/* Resync with new CPU frequency. Must run on to be synced CPU */
> > +static void resync_freq(void *arg)
> > +{
> > +	struct cpufreq_freqs *freq = (void *)arg;
> > +	struct sc_data *sc = &__get_cpu_var(sc_data);
> > +
> > +	sc->sync_base = jiffies;
> > +	if (!cpu_has_tsc) {
> > +		sc->unstable = 1;
> > +		return;
> > +	}
> > +	resolve_freq(freq);
> > +
> > +	/*
> > +	 * Handle nesting, but when we're zero multiple calls in a row
> > +	 * are ok too and not a bug. This can happen during startup
> > +	 * when the different callbacks race with each other.
> > +	 */
> > +	if (sc->unstable > 0)
> > +		sc->unstable--;
> > +	if (sc->unstable)
> > +		return;
> > +
> > +	/* Minor race window here, but should not add significant errors. */
> > +	sc->ns_base = ktime_to_ns(ktime_get());
> > +	rdtscll(sc->sync_base);
> > +	sc->cyc2ns_scale = (1000000 << CYC2NS_SCALE_FACTOR) / freq->new;
> > +}
> > +
> > +static void resync_freq_on_cpu(void *arg)
> > +{
> > +	struct cpufreq_freqs f = { .new = 0 };
> > +
> > +	f.cpu = get_cpu();
> > +	resync_freq(&f);
> > +	put_cpu();
> > +}
> > +
> > +static int sc_freq_event(struct notifier_block *nb, unsigned long event,
> > +			 void *data)
> > +{
> > +	struct cpufreq_freqs *freq = data;
> > +	struct sc_data *sc = &per_cpu(sc_data, freq->cpu);
> > +
> > +	if (cpu_has(&cpu_data[freq->cpu], X86_FEATURE_CONSTANT_TSC))
> > +		return NOTIFY_DONE;
> > +	if (freq->old == freq->new)
> > +		return NOTIFY_DONE;
> > +
> > +	switch (event) {
> > +	case CPUFREQ_SUSPENDCHANGE:
> > +		/* Mark TSC unstable during suspend/resume */
> > +	case CPUFREQ_PRECHANGE:
> > +		/*
> > +		 * Mark TSC as unstable until cpu frequency change is
> > +		 * done because we don't know when exactly it will
> > +		 * change.  unstable in used as a counter to guard
> > +		 * against races between the cpu frequency notifiers
> > +		 * and normal resyncs
> > +		 */
> > +		sc->unstable++;
> > +		/* FALL THROUGH */
> > +	case CPUFREQ_RESUMECHANGE:
> > +	case CPUFREQ_POSTCHANGE:
> > +		/*
> > +		 * Frequency change or resume is done -- update everything and
> > +		 * mark TSC as stable again.
> > +		 */
> > +		on_cpu_single(freq->cpu, resync_freq, freq);
> > +		break;
> > +	}
> > +	return NOTIFY_DONE;
> > +}
> > +
> > +static struct notifier_block sc_freq_notifier = {
> > +	.notifier_call = sc_freq_event
> > +};
> > +
> > +static int __cpuinit
> > +sc_cpu_event(struct notifier_block *self, unsigned long event, void *hcpu)
> > +{
> > +	long cpu = (long)hcpu;
> > +	if (event == CPU_ONLINE) {
> > +		struct cpufreq_freqs f = { .cpu = cpu, .new = 0 };
> > +
> > +		on_cpu_single(cpu, resync_freq, &f);
> > +	}
> > +	return NOTIFY_DONE;
> > +}
> > +
> > +static __init int init_sched_clock(void)
> > +{
> > +	if (unsynchronized_tsc())
> > +		no_sc_for_printk = 1;
> > +
> > +	/*
> > +	 * On a race between the various events the initialization
> > +	 * might be done multiple times, but code is tolerant to
> > +	 * this .
> > +	 */
> > +	cpufreq_register_notifier(&sc_freq_notifier,
> > +				CPUFREQ_TRANSITION_NOTIFIER);
> > +	hotcpu_notifier(sc_cpu_event, 0);
> > +	on_each_cpu(resync_freq_on_cpu, NULL, 0, 0);
> > +	return 0;
> > +}
> > +core_initcall(init_sched_clock);
> > Index: linux/arch/i386/kernel/tsc.c
> > ===================================================================
> > --- linux.orig/arch/i386/kernel/tsc.c
> > +++ linux/arch/i386/kernel/tsc.c
> > @@ -63,74 +63,6 @@ static inline int check_tsc_unstable(voi
> >  	return tsc_unstable;
> >  }
> >  
> > -/* Accellerators for sched_clock()
> > - * convert from cycles(64bits) => nanoseconds (64bits)
> > - *  basic equation:
> > - *		ns = cycles / (freq / ns_per_sec)
> > - *		ns = cycles * (ns_per_sec / freq)
> > - *		ns = cycles * (10^9 / (cpu_khz * 10^3))
> > - *		ns = cycles * (10^6 / cpu_khz)
> > - *
> > - *	Then we use scaling math (suggested by george@mvista.com) to get:
> > - *		ns = cycles * (10^6 * SC / cpu_khz) / SC
> > - *		ns = cycles * cyc2ns_scale / SC
> > - *
> > - *	And since SC is a constant power of two, we can convert the div
> > - *  into a shift.
> > - *
> > - *  We can use khz divisor instead of mhz to keep a better percision, since
> > - *  cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits.
> > - *  (mathieu.desnoyers@polymtl.ca)
> > - *
> > - *			-johnstul@us.ibm.com "math is hard, lets go shopping!"
> > - */
> > -unsigned long cyc2ns_scale __read_mostly;
> > -
> > -#define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
> > -
> > -static inline void set_cyc2ns_scale(unsigned long cpu_khz)
> > -{
> > -	cyc2ns_scale = (1000000 << CYC2NS_SCALE_FACTOR)/cpu_khz;
> > -}
> > -
> > -/*
> > - * Scheduler clock - returns current time in nanosec units.
> > - */
> > -unsigned long long native_sched_clock(void)
> > -{
> > -	unsigned long long this_offset;
> > -
> > -	/*
> > -	 * Fall back to jiffies if there's no TSC available:
> > -	 * ( But note that we still use it if the TSC is marked
> > -	 *   unstable. We do this because unlike Time Of Day,
> > -	 *   the scheduler clock tolerates small errors and it's
> > -	 *   very important for it to be as fast as the platform
> > -	 *   can achive it. )
> > -	 */
> > -	if (unlikely(!tsc_enabled && !tsc_unstable))
> > -		/* No locking but a rare wrong value is not a big deal: */
> > -		return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
> > -
> > -	/* read the Time Stamp Counter: */
> > -	rdtscll(this_offset);
> > -
> > -	/* return the value in ns */
> > -	return cycles_2_ns(this_offset);
> > -}
> > -
> > -/* We need to define a real function for sched_clock, to override the
> > -   weak default version */
> > -#ifdef CONFIG_PARAVIRT
> > -unsigned long long sched_clock(void)
> > -{
> > -	return paravirt_sched_clock();
> > -}
> > -#else
> > -unsigned long long sched_clock(void)
> > -	__attribute__((alias("native_sched_clock")));
> > -#endif
> > -
> >  unsigned long native_calculate_cpu_khz(void)
> >  {
> >  	unsigned long long start, end;
> > @@ -238,11 +170,6 @@ time_cpufreq_notifier(struct notifier_bl
> >  						ref_freq, freq->new);
> >  			if (!(freq->flags & CPUFREQ_CONST_LOOPS)) {
> >  				tsc_khz = cpu_khz;
> > -				set_cyc2ns_scale(cpu_khz);
> > -				/*
> > -				 * TSC based sched_clock turns
> > -				 * to junk w/ cpufreq
> > -				 */
> >  				mark_tsc_unstable("cpufreq changes");
> >  			}
> >  		}
> > @@ -380,7 +307,6 @@ void __init tsc_init(void)
> >  				(unsigned long)cpu_khz / 1000,
> >  				(unsigned long)cpu_khz % 1000);
> >  
> > -	set_cyc2ns_scale(cpu_khz);
> >  	use_tsc_delay();
> >  
> >  	/* Check and install the TSC clocksource */
> > Index: linux/arch/i386/kernel/Makefile
> > ===================================================================
> > --- linux.orig/arch/i386/kernel/Makefile
> > +++ linux/arch/i386/kernel/Makefile
> > @@ -7,7 +7,8 @@ extra-y := head.o init_task.o vmlinux.ld
> >  obj-y	:= process.o signal.o entry.o traps.o irq.o \
> >  		ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
> >  		pci-dma.o i386_ksyms.o i387.o bootflag.o e820.o\
> > -		quirks.o i8237.o topology.o alternative.o i8253.o tsc.o
> > +		quirks.o i8237.o topology.o alternative.o i8253.o tsc.o \
> > +		sched-clock.o
> >  
> >  obj-$(CONFIG_STACKTRACE)	+= stacktrace.o
> >  obj-y				+= cpu/
> > Index: linux/include/asm-i386/timer.h
> > ===================================================================
> > --- linux.orig/include/asm-i386/timer.h
> > +++ linux/include/asm-i386/timer.h
> > @@ -6,7 +6,6 @@
> >  #define TICK_SIZE (tick_nsec / 1000)
> >  
> >  void setup_pit_timer(void);
> > -unsigned long long native_sched_clock(void);
> >  unsigned long native_calculate_cpu_khz(void);
> >  
> >  extern int timer_ack;
> > @@ -18,35 +17,6 @@ extern int recalibrate_cpu_khz(void);
> >  #define calculate_cpu_khz() native_calculate_cpu_khz()
> >  #endif
> >  
> > -/* Accellerators for sched_clock()
> > - * convert from cycles(64bits) => nanoseconds (64bits)
> > - *  basic equation:
> > - *		ns = cycles / (freq / ns_per_sec)
> > - *		ns = cycles * (ns_per_sec / freq)
> > - *		ns = cycles * (10^9 / (cpu_khz * 10^3))
> > - *		ns = cycles * (10^6 / cpu_khz)
> > - *
> > - *	Then we use scaling math (suggested by george@mvista.com) to get:
> > - *		ns = cycles * (10^6 * SC / cpu_khz) / SC
> > - *		ns = cycles * cyc2ns_scale / SC
> > - *
> > - *	And since SC is a constant power of two, we can convert the div
> > - *  into a shift.
> > - *
> > - *  We can use khz divisor instead of mhz to keep a better percision, since
> > - *  cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits.
> > - *  (mathieu.desnoyers@polymtl.ca)
> > - *
> > - *			-johnstul@us.ibm.com "math is hard, lets go shopping!"
> > - */
> > -extern unsigned long cyc2ns_scale __read_mostly;
> > -
> > -#define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
> > -
> > -static inline unsigned long long cycles_2_ns(unsigned long long cyc)
> > -{
> > -	return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
> > -}
> > -
> > +u64 cycles_2_ns(u64 cyc);
> >  
> >  #endif
> > Index: linux/include/asm-i386/tsc.h
> > ===================================================================
> > --- linux.orig/include/asm-i386/tsc.h
> > +++ linux/include/asm-i386/tsc.h
> > @@ -63,6 +63,7 @@ extern void tsc_init(void);
> >  extern void mark_tsc_unstable(char *reason);
> >  extern int unsynchronized_tsc(void);
> >  extern void init_tsc_clocksource(void);
> > +extern unsigned long long tsc_sched_clock(void);
> >  
> >  /*
> >   * Boot-time check whether the TSCs are synchronized across
> > -
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 

-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

  parent reply	other threads:[~2007-07-20  3:11 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-19  9:54 [PATCH] [0/58] First batch of x86 patches for .23 Andi Kleen
2007-07-19  9:54 ` [PATCH] [1/58] x86: Always flush pages in change_page_attr Andi Kleen
2007-08-06 10:15   ` [patches] " Jan Beulich
2007-08-06 10:36     ` Andi Kleen
2007-08-06 10:49       ` Jan Beulich
2007-07-19  9:54 ` [PATCH] [2/58] x86_64: Tell gcc to only align stack to 8 bytes Andi Kleen
2007-07-19 11:50   ` Serge Belyshev
2007-07-19 12:06     ` Andi Kleen
2007-07-19 14:42   ` Chuck Ebbert
2007-07-19  9:54 ` [PATCH] [3/58] x86_64: asm/ptrace.h needs linux/compiler.h Andi Kleen
2007-07-19  9:54 ` [PATCH] [4/58] x86_64: Don't rely on a unique IO-APIC ID Andi Kleen
2007-07-19  9:54 ` [PATCH] [5/58] x86_64: Report the pending irq if available in smp_affinity Andi Kleen
2007-07-19 10:23   ` Ingo Molnar
2007-07-19  9:54 ` [PATCH] [6/58] x86_64: Use LOCAL_DISTANCE and REMOTE_DISTANCE in x86_64 ACPI code Andi Kleen
2007-07-19  9:54 ` [PATCH] [7/58] x86_64: various cleanups in NUMA scan node Andi Kleen
2007-07-19 17:15   ` Yinghai Lu
2007-07-19 17:21     ` Andi Kleen
2007-07-19 17:38       ` Yinghai Lu
2007-07-19 20:00         ` Andi Kleen
2007-07-19 21:01     ` David Rientjes
2007-07-19  9:54 ` [PATCH] [8/58] x86_64: Use string instruction memcpy/memset on AMD Fam10 Andi Kleen
2007-07-19 16:43   ` Jan Engelhardt
2007-07-19 17:00     ` Yinghai Lu
2007-07-19  9:54 ` [PATCH] [9/58] x86_64: Always use builtin memcpy on gcc 4.3 Andi Kleen
2007-07-21 23:16   ` Oleg Verych
2007-07-21 23:27     ` Andi Kleen
2007-07-22  0:29     ` Denis Vlasenko
2007-07-19  9:54 ` [PATCH] [10/58] i386: Move all simple string operations out of line Andi Kleen
2007-07-19  9:54 ` [PATCH] [11/58] x86: Support __attribute__((__cold__)) in gcc 4.3 Andi Kleen
2007-07-19  9:54 ` [PATCH] [12/58] x86_64: Add vDSO for x86-64 with gettimeofday/clock_gettime/getcpu Andi Kleen
2007-08-21 16:25   ` Daniel Walker
2007-08-21 18:45     ` Andi Kleen
2007-08-21 18:40       ` Andrew Morton
2007-07-19  9:54 ` [PATCH] [13/58] x86: Separate checking of unsynchronized and unstable TSC Andi Kleen
2007-07-19  9:54 ` [PATCH] [14/58] x86_64: Add on_cpu_single Andi Kleen
2007-07-19 11:09   ` Satyam Sharma
2007-07-19 12:07     ` Andi Kleen
2007-07-19  9:54 ` [PATCH] [15/58] i386: Rewrite sched_clock Andi Kleen
2007-07-19 16:51   ` Daniel Walker
2007-07-19 17:13     ` Andi Kleen
2007-07-19 17:15       ` Daniel Walker
2007-07-19 17:22         ` Andi Kleen
2007-07-19 17:31           ` Daniel Walker
2007-07-19 17:38             ` Andi Kleen
2007-07-19 17:43               ` Daniel Walker
2007-07-19 18:00                 ` Andi Kleen
2007-07-19 18:00                   ` Daniel Walker
2007-07-20  3:11     ` Mathieu Desnoyers [this message]
2007-07-20  3:47       ` Mathieu Desnoyers
2007-07-20  4:18         ` [PATCH] [15/58] i386: Rewrite sched_clock (cmpxchg8b) Mathieu Desnoyers
2007-07-20  5:07           ` Nick Piggin
2007-07-20  5:47             ` Mathieu Desnoyers
2007-07-20  8:27       ` [PATCH] [15/58] i386: Rewrite sched_clock Andi Kleen
2007-07-20 14:12         ` Mathieu Desnoyers
2007-07-20 14:39           ` Mathieu Desnoyers
2007-07-20 15:14           ` Andi Kleen
2007-07-20 15:22             ` Mathieu Desnoyers
2007-07-20 16:49             ` [PATCH] 80386 and 80486 cmpxchg64 and cmpxchg64_local fallback Mathieu Desnoyers
2007-07-19  9:55 ` [PATCH] [16/58] x86_64: Use new shared sched_clock in x86-64 too Andi Kleen
2007-07-19  9:55 ` [PATCH] [17/58] i386: Add L3 cache support to AMD CPUID4 emulation Andi Kleen
2007-07-20 17:00   ` [patches] " Andreas Herrmann
2007-07-20 17:15   ` Andreas Herrmann
2007-07-19  9:55 ` [PATCH] [18/58] x86_64: remove extra extern declaring about dmi_ioremap Andi Kleen
2007-07-19  9:55 ` [PATCH] [19/58] x86_64: Don't use softirq save locks in smp_call_function Andi Kleen
2007-07-19 12:16   ` Satyam Sharma
2007-07-19 12:19     ` Andi Kleen
2007-07-19  9:55 ` [PATCH] [20/58] x86: Always probe the NMI watchdog Andi Kleen
2007-07-19 10:24   ` Björn Steinbrink
2007-07-19 10:42     ` Andi Kleen
2007-07-19  9:55 ` [PATCH] [21/58] i386: Reserve the right performance counter for the Intel PerfMon " Andi Kleen
2007-07-19 10:21   ` Björn Steinbrink
2007-07-19 10:45     ` Andi Kleen
2007-07-19  9:55 ` [PATCH] [22/58] x86_64: hpet tsc calibration fix broken smi detection logic Andi Kleen
2007-07-19  9:55 ` [PATCH] [23/58] i386: remove pit_interrupt_hook Andi Kleen
2007-07-19  9:55 ` [PATCH] [24/58] x86_64: Untangle asm/hpet.h from asm/timex.h Andi Kleen
2007-07-19  9:55 ` [PATCH] [25/58] x86_64: use generic cmos update Andi Kleen
2007-07-19  9:55 ` [PATCH] [26/58] x86_64: Use generic xtime init Andi Kleen
2007-07-19  9:55 ` [PATCH] [27/58] x86_64: Remove dead code and other janitor work in tsc.c Andi Kleen
2007-07-19  9:55 ` [PATCH] [28/58] x86_64: Fix APIC typo Andi Kleen
2007-07-19  9:55 ` [PATCH] [29/58] x86_64: fiuxp pt_reqs leftovers Andi Kleen
2007-07-19  9:55 ` [PATCH] [30/58] x86: share hpet.h with i386 Andi Kleen
2007-07-19  9:55 ` [PATCH] [31/58] x86_64: apic.c coding style janitor work Andi Kleen
2007-07-19  9:55 ` [PATCH] [32/58] x86_64: time.c white space wreckage cleanup Andi Kleen
2007-07-19  9:55 ` [PATCH] [33/58] x86_64: Avoid too many remote cpu references due to /proc/stat Andi Kleen
2007-07-19 10:21   ` Christoph Hellwig
2007-07-19 10:41     ` Andi Kleen
2007-07-19 10:55       ` Adrian Bunk
2007-07-19  9:55 ` [PATCH] [34/58] x86_64: ia32entry adjustments Andi Kleen
2007-07-19 14:46   ` Jeff Garzik
2007-08-06 10:43     ` Jan Beulich
2007-07-19  9:55 ` [PATCH] [35/58] i386: allow debuggers to access the vsyscall page with compat vDSO Andi Kleen
2007-07-19  9:55 ` [PATCH] [36/58] x86_64: minor exception trace variables cleanup Andi Kleen
2007-07-19  9:55 ` [PATCH] [37/58] x86_64: remove unused variable maxcpus Andi Kleen
2007-07-19  9:55 ` [PATCH] [38/58] i386: smp-alt-once option is only useful with HOTPLUG_CPU Andi Kleen
2007-07-19  9:55 ` [PATCH] [39/58] i386: minor nx handling adjustment Andi Kleen
2007-07-19  9:55 ` [PATCH] [40/58] i386: remapped_pgdat_init() static Andi Kleen
2007-07-19  9:55 ` [PATCH] [41/58] i386: arch/i386/kernel/i8253.c should #include <asm/timer.h> Andi Kleen
2007-07-19  9:55 ` [PATCH] [42/58] i386: timer_irq_works() static again Andi Kleen
2007-07-19  9:55 ` [PATCH] [43/58] x86_64: Quicklist support for x86_64 Andi Kleen
2007-07-19  9:55 ` [PATCH] [44/58] x86_64: extract helper function from e820_register_active_regions Andi Kleen
2007-07-19  9:55 ` [PATCH] [45/58] x86_64: fake pxm-to-node mapping for fake numa Andi Kleen
2007-07-19  9:55 ` [PATCH] [46/58] x86_64: fake apicid_to_node " Andi Kleen
2007-07-19  9:55 ` [PATCH] [47/58] i386: insert unclaimed MMCONFIG resources Andi Kleen
2007-07-19  9:55 ` [PATCH] [48/58] x86_64: O_EXCL on /dev/mcelog Andi Kleen
2007-07-19  9:55 ` [PATCH] [49/58] x86_64: support poll() " Andi Kleen
2007-07-19  9:55 ` [PATCH] [50/58] x86_64: mcelog tolerant level cleanup Andi Kleen
2007-07-19  9:55 ` [PATCH] [51/58] i386: fix machine rebooting Andi Kleen
2007-07-19  9:55 ` [PATCH] [52/58] i386: fix section mismatch warnings in mtrr Andi Kleen
2007-07-19  9:55 ` [PATCH] [53/58] x86: PM_TRACE support Andi Kleen
2007-07-19  9:55 ` [PATCH] [54/58] x86: Make Alt-SysRq-p display the debug register contents Andi Kleen
2007-07-19  9:55 ` [PATCH] [55/58] i386: add reference to the arguments Andi Kleen
2007-07-19  9:55 ` [PATCH] [56/58] x86: round_jiffies() for i386 and x86-64 non-critical/corrected MCE polling Andi Kleen
2007-07-19  9:55 ` [PATCH] [57/58] x86_64: check remote IRR bit before migrating level triggered irq Andi Kleen
2007-07-19  9:55 ` [PATCH] [58/58] x86: remove support for the Rise CPU Andi Kleen
2007-07-19 10:45   ` Alan Cox
2007-07-19 10:48     ` Adrian Bunk
2007-07-19 11:13       ` Alan Cox
2007-07-19 12:03         ` Andi Kleen
2007-07-19 14:56           ` Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070720031105.GA8237@Krystal \
    --to=mathieu.desnoyers@polymtl.ca \
    --cc=ak@suse.de \
    --cc=dwalker@mvista.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=patches@x86-64.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.