2008-02-26 07:11:24

by Yinghai Lu

[permalink] [raw]
Subject: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu

early_init_intel is introduced by

commit 2b16a2353814a513cdb5c5c739b76a19d7ea39ce
Author: Andi Kleen <[email protected]>
Date: Wed Jan 30 13:32:40 2008 +0100

x86: move X86_FEATURE_CONSTANT_TSC into early cpu feature detection

set CONSTANT_TSC for intel cpus

but it already set in init_intel

don't need to set that two times in early_init_intel() and init_intel. this patch remove one.

also fix error in early_init_intel and reference about x86_capality, because it
is array already.., prevent possible data corruption...

this should be applied for 2.6.25

Signed-off-by: Yinghai Lu <[email protected]>

diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c
index 62d3f14..210134c 100644
--- a/arch/x86/kernel/setup_64.c
+++ b/arch/x86/kernel/setup_64.c
@@ -1027,7 +1027,7 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
{
if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
(c->x86 == 0x6 && c->x86_model >= 0x0e))
- set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
+ set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
}

static void __cpuinit init_intel(struct cpuinfo_x86 *c)
@@ -1071,9 +1071,6 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)

if (c->x86 == 15)
c->x86_cache_alignment = c->x86_clflush_size * 2;
- if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
- (c->x86 == 0x6 && c->x86_model >= 0x0e))
- set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
if (c->x86 == 6)
set_cpu_cap(c, X86_FEATURE_REP_GOOD);
set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);


2008-02-26 07:15:29

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu


* Yinghai Lu <[email protected]> wrote:

> early_init_intel is introduced by
>
> commit 2b16a2353814a513cdb5c5c739b76a19d7ea39ce
> Author: Andi Kleen <[email protected]>
> Date: Wed Jan 30 13:32:40 2008 +0100
>
> x86: move X86_FEATURE_CONSTANT_TSC into early cpu feature detection
>
> set CONSTANT_TSC for intel cpus
>
> but it already set in init_intel
>
> don't need to set that two times in early_init_intel() and init_intel. this patch remove one.
>
> also fix error in early_init_intel and reference about x86_capality, because it
> is array already.., prevent possible data corruption...
>
> this should be applied for 2.6.25

thanks Yinghai, applied.

Ingo

2008-02-26 07:21:04

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu


* Yinghai Lu <[email protected]> wrote:

> also fix error in early_init_intel and reference about x86_capality,
> because it is array already.., prevent possible data corruption...

hm, why should there be data corruption:

> - set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
> + set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);

cpu_cpu_cap() is currently defined as:

#define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability)

which is the same. set_cpu_cap() is indeed the cleaner form to do this
so your patch is correct as a cleanup.

Ingo

2008-02-26 07:25:14

by Yinghai Lu

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu

On Mon, Feb 25, 2008 at 11:20 PM, Ingo Molnar <[email protected]> wrote:
>
> * Yinghai Lu <[email protected]> wrote:
>
>
> > also fix error in early_init_intel and reference about x86_capality,
> > because it is array already.., prevent possible data corruption...
>
> hm, why should there be data corruption:
>
>
> > - set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
> > + set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
>
> cpu_cpu_cap() is currently defined as:
>
> #define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability)
>
> which is the same. set_cpu_cap() is indeed the cleaner form to do this
> so your patch is correct as a cleanup.
set_cpu_cap is right
==
set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); ===> is wrong
should be
set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);

x86_capability is a array ...

so this could prevent some data corruption.

YH

2008-02-26 07:35:23

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu


* Yinghai Lu <[email protected]> wrote:

> > #define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability)
> >
> > which is the same. set_cpu_cap() is indeed the cleaner form to do this
> > so your patch is correct as a cleanup.
> set_cpu_cap is right
> ==
> set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); ===> is wrong
> should be
> set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
>
> x86_capability is a array ...
>
> so this could prevent some data corruption.

ah, right you are! The commit was done in a sloppy, incomplete way,
leaving around lots of direct c->x86_capability references and giving
room for this bug ...

Btw., there's one other place that has the same bug. I'll fix that up
too.

Ingo

2008-02-26 07:39:35

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu


* Ingo Molnar <[email protected]> wrote:

> > set_cpu_cap is right
> > ==
> > set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); ===> is wrong
> > should be
> > set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
> >
> > x86_capability is a array ...
> >
> > so this could prevent some data corruption.
>
> ah, right you are! [...]

actually, not: &c->x86_capability and c->x86_capability result in the
same address (it's an array, not a pointer), so there's no "data
corruption". If x86_capability were a pointer then you would be right -
so this is all worth cleaning up.

Ingo

2008-02-26 07:42:26

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu

Yinghai Lu wrote:
>> which is the same. set_cpu_cap() is indeed the cleaner form to do this
>> so your patch is correct as a cleanup.
> set_cpu_cap is right
> ==
> set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); ===> is wrong
> should be
> set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
>
> x86_capability is a array ...
>

For an array, the & is optional and has no effect.

So they mean the same thing.

-hpa

2008-02-26 09:48:11

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu


* H. Peter Anvin <[email protected]> wrote:

> Yinghai Lu wrote:
>>> which is the same. set_cpu_cap() is indeed the cleaner form to do this
>>> so your patch is correct as a cleanup.
>> set_cpu_cap is right
>> ==
>> set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); ===> is wrong
>> should be
>> set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
>>
>> x86_capability is a array ...
>
> For an array, the & is optional and has no effect.
>
> So they mean the same thing.

yeah. It's unnecessary entropy nevertheless and i've cleaned it all up
in x86.git.

Ingo

2008-02-26 17:29:39

by Yinghai Lu

[permalink] [raw]
Subject: Re: [PATCH] x86_64: remove wrong setting about CONSTANT_TSC for intel cpu

On Mon, Feb 25, 2008 at 11:33 PM, H. Peter Anvin <[email protected]> wrote:
> Yinghai Lu wrote:
> >> which is the same. set_cpu_cap() is indeed the cleaner form to do this
> >> so your patch is correct as a cleanup.
> > set_cpu_cap is right
> > ==
> > set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); ===> is wrong
> > should be
> > set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
> >
> > x86_capability is a array ...
> >
>
> For an array, the & is optional and has no effect.

good to know.

YH