mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 20:56:23 +00:00
x86: cdev lock_kernel() pushdown
Push the cdev lock_kernel() call down into the x86 msr and cpuid drivers. Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
1fa984b583
commit
5119e92efc
2 changed files with 28 additions and 11 deletions
|
@ -33,6 +33,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
#include <linux/major.h>
|
#include <linux/major.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
|
@ -107,15 +108,23 @@ static ssize_t cpuid_read(struct file *file, char __user *buf,
|
||||||
|
|
||||||
static int cpuid_open(struct inode *inode, struct file *file)
|
static int cpuid_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
unsigned int cpu = iminor(file->f_path.dentry->d_inode);
|
unsigned int cpu;
|
||||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
struct cpuinfo_x86 *c;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
lock_kernel();
|
||||||
|
|
||||||
if (cpu >= NR_CPUS || !cpu_online(cpu))
|
cpu = iminor(file->f_path.dentry->d_inode);
|
||||||
return -ENXIO; /* No such CPU */
|
if (cpu >= NR_CPUS || !cpu_online(cpu)) {
|
||||||
|
ret = -ENXIO; /* No such CPU */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
c = &cpu_data(cpu);
|
||||||
if (c->cpuid_level < 0)
|
if (c->cpuid_level < 0)
|
||||||
return -EIO; /* CPUID not supported */
|
ret = -EIO; /* CPUID not supported */
|
||||||
|
out:
|
||||||
return 0;
|
unlock_kernel();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -117,12 +117,20 @@ static int msr_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
unsigned int cpu = iminor(file->f_path.dentry->d_inode);
|
unsigned int cpu = iminor(file->f_path.dentry->d_inode);
|
||||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (cpu >= NR_CPUS || !cpu_online(cpu))
|
lock_kernel();
|
||||||
return -ENXIO; /* No such CPU */
|
cpu = iminor(file->f_path.dentry->d_inode);
|
||||||
|
|
||||||
|
if (cpu >= NR_CPUS || !cpu_online(cpu)) {
|
||||||
|
ret = -ENXIO; /* No such CPU */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
c = &cpu_data(cpu);
|
||||||
if (!cpu_has(c, X86_FEATURE_MSR))
|
if (!cpu_has(c, X86_FEATURE_MSR))
|
||||||
return -EIO; /* MSR not supported */
|
ret = -EIO; /* MSR not supported */
|
||||||
|
out:
|
||||||
|
unlock_kernel();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue