lkml.org 
[lkml]   [2009]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[GIT pull] bkl core patches for 2.6.33
    Linus,

    Please pull the latest bkl-core-for-linus git tree from:

    git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git bkl-core-for-linus

    Thanks,

    tglx

    ------------------>
    Jonathan Corbet (2):
    pm_qos: remove BKL
    pm_qos: clean up racy global "name" variable

    Thomas Gleixner (2):
    sys: Remove BKL from sys_reboot
    bkl: pushdown BKL locking to do_sysctl()


    arch/ia64/ia32/sys_ia32.c | 2 --
    arch/mips/kernel/linux32.c | 2 --
    arch/parisc/kernel/sys_parisc32.c | 2 --
    arch/powerpc/kernel/sys_ppc32.c | 2 --
    arch/s390/kernel/compat_linux.c | 2 --
    arch/sparc/kernel/sys_sparc32.c | 2 --
    arch/x86/ia32/sys_ia32.c | 2 --
    kernel/pm_qos_params.c | 20 ++++++++------------
    kernel/sys.c | 14 +++++++-------
    kernel/sysctl.c | 6 ++++--
    10 files changed, 19 insertions(+), 35 deletions(-)

    diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
    index 625ed8f..c0ed49c 100644
    --- a/arch/ia64/ia32/sys_ia32.c
    +++ b/arch/ia64/ia32/sys_ia32.c
    @@ -1670,10 +1670,8 @@ sys32_sysctl (struct sysctl32 __user *args)
    return -EFAULT;

    set_fs(KERNEL_DS);
    - lock_kernel();
    ret = do_sysctl(namep, a32.nlen, oldvalp, (size_t __user *) &oldlen,
    newvalp, (size_t) a32.newlen);
    - unlock_kernel();
    set_fs(old_fs);

    if (oldvalp && put_user (oldlen, (int __user *) compat_ptr(a32.oldlenp)))
    diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c
    index 6242bc6..3744608 100644
    --- a/arch/mips/kernel/linux32.c
    +++ b/arch/mips/kernel/linux32.c
    @@ -302,10 +302,8 @@ SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
    oldlenp = (size_t __user *)addr;
    }

    - lock_kernel();
    error = do_sysctl((int __user *)A(tmp.name), tmp.nlen, (void __user *)A(tmp.oldval),
    oldlenp, (void __user *)A(tmp.newval), tmp.newlen);
    - unlock_kernel();
    if (oldlenp) {
    if (!error) {
    if (get_user(oldlen, (size_t __user *)addr) ||
    diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c
    index 561388b..0d3bff2 100644
    --- a/arch/parisc/kernel/sys_parisc32.c
    +++ b/arch/parisc/kernel/sys_parisc32.c
    @@ -137,11 +137,9 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
    oldlenp = (size_t *)addr;
    }

    - lock_kernel();
    error = do_sysctl((int __user *)(u64)tmp.name, tmp.nlen,
    (void __user *)(u64)tmp.oldval, oldlenp,
    (void __user *)(u64)tmp.newval, tmp.newlen);
    - unlock_kernel();
    if (oldlenp) {
    if (!error) {
    if (get_user(oldlen, (size_t *)addr)) {
    diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c
    index b97c2d6..934c0f9 100644
    --- a/arch/powerpc/kernel/sys_ppc32.c
    +++ b/arch/powerpc/kernel/sys_ppc32.c
    @@ -555,11 +555,9 @@ asmlinkage long compat_sys_sysctl(struct __sysctl_args32 __user *args)
    return -EFAULT;
    }

    - lock_kernel();
    error = do_sysctl(compat_ptr(tmp.name), tmp.nlen,
    compat_ptr(tmp.oldval), oldlenp,
    compat_ptr(tmp.newval), tmp.newlen);
    - unlock_kernel();
    if (oldlenp) {
    if (!error) {
    if (get_user(oldlen, oldlenp) ||
    diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
    index 0debcec..ef9c2c1 100644
    --- a/arch/s390/kernel/compat_linux.c
    +++ b/arch/s390/kernel/compat_linux.c
    @@ -562,10 +562,8 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
    oldlenp = (size_t __user *)addr;
    }

    - lock_kernel();
    error = do_sysctl(compat_ptr(tmp.name), tmp.nlen, compat_ptr(tmp.oldval),
    oldlenp, compat_ptr(tmp.newval), tmp.newlen);
    - unlock_kernel();
    if (oldlenp) {
    if (!error) {
    if (get_user(oldlen, (size_t __user *)addr) ||
    diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c
    index 04e28b2..6266ef0 100644
    --- a/arch/sparc/kernel/sys_sparc32.c
    +++ b/arch/sparc/kernel/sys_sparc32.c
    @@ -627,14 +627,12 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
    oldlenp = (size_t __user *)addr;
    }

    - lock_kernel();
    error = do_sysctl((int __user *)(unsigned long) tmp.name,
    tmp.nlen,
    (void __user *)(unsigned long) tmp.oldval,
    oldlenp,
    (void __user *)(unsigned long) tmp.newval,
    tmp.newlen);
    - unlock_kernel();
    if (oldlenp) {
    if (!error) {
    if (get_user(oldlen, (size_t __user *)addr) ||
    diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c
    index 9f55271..32a88e4 100644
    --- a/arch/x86/ia32/sys_ia32.c
    +++ b/arch/x86/ia32/sys_ia32.c
    @@ -477,10 +477,8 @@ asmlinkage long sys32_sysctl(struct sysctl_ia32 __user *args32)
    return -EFAULT;

    set_fs(KERNEL_DS);
    - lock_kernel();
    ret = do_sysctl(namep, a32.nlen, oldvalp, (size_t __user *)&oldlen,
    newvalp, (size_t) a32.newlen);
    - unlock_kernel();
    set_fs(old_fs);

    if (oldvalp && put_user(oldlen, (int __user *)compat_ptr(a32.oldlenp)))
    diff --git a/kernel/pm_qos_params.c b/kernel/pm_qos_params.c
    index dfdec52..3db49b9 100644
    --- a/kernel/pm_qos_params.c
    +++ b/kernel/pm_qos_params.c
    @@ -29,7 +29,6 @@

    #include <linux/pm_qos_params.h>
    #include <linux/sched.h>
    -#include <linux/smp_lock.h>
    #include <linux/spinlock.h>
    #include <linux/slab.h>
    #include <linux/time.h>
    @@ -344,37 +343,33 @@ int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier)
    }
    EXPORT_SYMBOL_GPL(pm_qos_remove_notifier);

    -#define PID_NAME_LEN sizeof("process_1234567890")
    -static char name[PID_NAME_LEN];
    +#define PID_NAME_LEN 32

    static int pm_qos_power_open(struct inode *inode, struct file *filp)
    {
    int ret;
    long pm_qos_class;
    + char name[PID_NAME_LEN];

    - lock_kernel();
    pm_qos_class = find_pm_qos_object_by_minor(iminor(inode));
    if (pm_qos_class >= 0) {
    filp->private_data = (void *)pm_qos_class;
    - sprintf(name, "process_%d", current->pid);
    + snprintf(name, PID_NAME_LEN, "process_%d", current->pid);
    ret = pm_qos_add_requirement(pm_qos_class, name,
    PM_QOS_DEFAULT_VALUE);
    - if (ret >= 0) {
    - unlock_kernel();
    + if (ret >= 0)
    return 0;
    - }
    }
    - unlock_kernel();
    -
    return -EPERM;
    }

    static int pm_qos_power_release(struct inode *inode, struct file *filp)
    {
    int pm_qos_class;
    + char name[PID_NAME_LEN];

    pm_qos_class = (long)filp->private_data;
    - sprintf(name, "process_%d", current->pid);
    + snprintf(name, PID_NAME_LEN, "process_%d", current->pid);
    pm_qos_remove_requirement(pm_qos_class, name);

    return 0;
    @@ -385,13 +380,14 @@ static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf,
    {
    s32 value;
    int pm_qos_class;
    + char name[PID_NAME_LEN];

    pm_qos_class = (long)filp->private_data;
    if (count != sizeof(s32))
    return -EINVAL;
    if (copy_from_user(&value, buf, sizeof(s32)))
    return -EFAULT;
    - sprintf(name, "process_%d", current->pid);
    + snprintf(name, PID_NAME_LEN, "process_%d", current->pid);
    pm_qos_update_requirement(pm_qos_class, name, value);

    return sizeof(s32);
    diff --git a/kernel/sys.c b/kernel/sys.c
    index 255475d..22ea955 100644
    --- a/kernel/sys.c
    +++ b/kernel/sys.c
    @@ -8,7 +8,6 @@
    #include <linux/mm.h>
    #include <linux/utsname.h>
    #include <linux/mman.h>
    -#include <linux/smp_lock.h>
    #include <linux/notifier.h>
    #include <linux/reboot.h>
    #include <linux/prctl.h>
    @@ -349,6 +348,9 @@ void kernel_power_off(void)
    machine_power_off();
    }
    EXPORT_SYMBOL_GPL(kernel_power_off);
    +
    +static DEFINE_MUTEX(reboot_mutex);
    +
    /*
    * Reboot system call: for obvious reasons only root may call it,
    * and even root needs to set up some magic numbers in the registers
    @@ -381,7 +383,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
    if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
    cmd = LINUX_REBOOT_CMD_HALT;

    - lock_kernel();
    + mutex_lock(&reboot_mutex);
    switch (cmd) {
    case LINUX_REBOOT_CMD_RESTART:
    kernel_restart(NULL);
    @@ -397,20 +399,18 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,

    case LINUX_REBOOT_CMD_HALT:
    kernel_halt();
    - unlock_kernel();
    do_exit(0);
    panic("cannot halt");

    case LINUX_REBOOT_CMD_POWER_OFF:
    kernel_power_off();
    - unlock_kernel();
    do_exit(0);
    break;

    case LINUX_REBOOT_CMD_RESTART2:
    if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
    - unlock_kernel();
    - return -EFAULT;
    + ret = -EFAULT;
    + break;
    }
    buffer[sizeof(buffer) - 1] = '\0';

    @@ -433,7 +433,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
    ret = -EINVAL;
    break;
    }
    - unlock_kernel();
    + mutex_unlock(&reboot_mutex);
    return ret;
    }

    diff --git a/kernel/sysctl.c b/kernel/sysctl.c
    index 0d949c5..72040e5 100644
    --- a/kernel/sysctl.c
    +++ b/kernel/sysctl.c
    @@ -1848,6 +1848,8 @@ int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *ol
    return -EFAULT;
    }

    + lock_kernel();
    +
    for (head = sysctl_head_next(NULL); head;
    head = sysctl_head_next(head)) {
    error = parse_table(name, nlen, oldval, oldlenp,
    @@ -1858,6 +1860,8 @@ int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *ol
    break;
    }
    }
    +
    + unlock_kernel();
    return error;
    }

    @@ -1873,10 +1877,8 @@ SYSCALL_DEFINE1(sysctl, struct __sysctl_args __user *, args)
    if (error)
    goto out;

    - lock_kernel();
    error = do_sysctl(tmp.name, tmp.nlen, tmp.oldval, tmp.oldlenp,
    tmp.newval, tmp.newlen);
    - unlock_kernel();
    out:
    return error;
    }

    \
     
     \ /
      Last update: 2009-12-06 19:01    [W:4.681 / U:0.396 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site