lkml.org 
[lkml]   [2004]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: [patch] bug in cpuid & msr on nosmp machine
From
Date
On Thu, 2004-05-20 at 18:51, Andrew Morton wrote:
> How about this?

Complicated *and* doesn't solve the original problem.

How about this?

Name: Fix i386/x86_64 cpuid/msr BUG() on Impossible CPUs
Status: Trivial

Matthieu Castet <castet.matthieu@free.fr> pointed out that testing
cpu_online(cpu) on a UP system goes BUG().

That's because you're never supposed to ask cpu_online() about a CPU
which is >= NR_CPUS. msr and cpuid devices use the minor to indicate
the CPU number. Oops.

Fix is to explicitly test cpu < NR_CPUS. Using cpu_online() is OK;
although the CPU might go down before you actually read the file, that
will simply cause junk to be returned.

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7878-linux-2.6.6-bk6/arch/i386/kernel/cpuid.c .7878-linux-2.6.6-bk6.updated/arch/i386/kernel/cpuid.c
--- .7878-linux-2.6.6-bk6/arch/i386/kernel/cpuid.c 2004-05-20 10:35:22.000000000 +1000
+++ .7878-linux-2.6.6-bk6.updated/arch/i386/kernel/cpuid.c 2004-05-20 19:26:47.000000000 +1000
@@ -132,10 +132,10 @@ static ssize_t cpuid_read(struct file *f

static int cpuid_open(struct inode *inode, struct file *file)
{
- int cpu = iminor(file->f_dentry->d_inode);
+ unsigned int cpu = iminor(file->f_dentry->d_inode);
struct cpuinfo_x86 *c = &(cpu_data)[cpu];

- if (!cpu_online(cpu))
+ if (cpu >= NR_CPUS || !cpu_online(cpu))
return -ENXIO; /* No such CPU */
if (c->cpuid_level < 0)
return -EIO; /* CPUID not supported */
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7878-linux-2.6.6-bk6/arch/i386/kernel/msr.c .7878-linux-2.6.6-bk6.updated/arch/i386/kernel/msr.c
--- .7878-linux-2.6.6-bk6/arch/i386/kernel/msr.c 2004-02-18 23:54:12.000000000 +1100
+++ .7878-linux-2.6.6-bk6.updated/arch/i386/kernel/msr.c 2004-05-20 19:27:01.000000000 +1000
@@ -238,10 +238,10 @@ static ssize_t msr_write(struct file * f

static int msr_open(struct inode *inode, struct file *file)
{
- int cpu = iminor(file->f_dentry->d_inode);
+ unsigned int cpu = iminor(file->f_dentry->d_inode);
struct cpuinfo_x86 *c = &(cpu_data)[cpu];

- if (!cpu_online(cpu))
+ if (cpu >= NR_CPUS || !cpu_online(cpu))
return -ENXIO; /* No such CPU */
if ( !cpu_has(c, X86_FEATURE_MSR) )
return -EIO; /* MSR not supported */
--
Anyone who quotes me in their signature is an idiot -- Rusty Russell

-
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/

\
 
 \ /
  Last update: 2005-03-22 14:03    [W:0.063 / U:0.196 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site