As there's nothing we can do about the vm86 uaccess-with-interrupts-off warning, add some stuff to suppress it. 25-akpm/arch/i386/kernel/vm86.c | 2 ++ 25-akpm/include/linux/kernel.h | 4 ++++ 25-akpm/kernel/sched.c | 38 ++++++++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 10 deletions(-) diff -puN arch/i386/kernel/vm86.c~might_sleep-suppression arch/i386/kernel/vm86.c --- 25/arch/i386/kernel/vm86.c~might_sleep-suppression Mon Oct 27 13:23:32 2003 +++ 25-akpm/arch/i386/kernel/vm86.c Mon Oct 27 13:24:26 2003 @@ -106,10 +106,12 @@ struct pt_regs * save_v86_state(struct k do_exit(SIGSEGV); } set_flags(regs->eflags, VEFLAGS, VIF_MASK | current->thread.v86mask); + might_sleep_disable(); /* Userspace may have disabled IRQs */ tmp = copy_to_user(¤t->thread.vm86_info->regs,regs, VM86_REGS_SIZE1); tmp += copy_to_user(¤t->thread.vm86_info->regs.VM86_REGS_PART2, ®s->VM86_REGS_PART2, VM86_REGS_SIZE2); tmp += put_user(current->thread.screen_bitmap,¤t->thread.vm86_info->screen_bitmap); + might_sleep_enable(); if (tmp) { printk("vm86: could not access userspace vm86_info\n"); do_exit(SIGSEGV); diff -puN include/linux/kernel.h~might_sleep-suppression include/linux/kernel.h --- 25/include/linux/kernel.h~might_sleep-suppression Mon Oct 27 13:23:32 2003 +++ 25-akpm/include/linux/kernel.h Mon Oct 27 13:25:22 2003 @@ -49,9 +49,13 @@ struct completion; void __might_sleep(char *file, int line); #define might_sleep() __might_sleep(__FILE__, __LINE__) #define might_sleep_if(cond) do { if (unlikely(cond)) might_sleep(); } while (0) +void might_sleep_disable(void); +void might_sleep_enable(void); #else #define might_sleep() do {} while(0) #define might_sleep_if(cond) do {} while (0) +#define might_sleep_disable() do {} while (0) +#define might_sleep_enable() do {} while (0) #endif extern struct notifier_block *panic_notifier_list; diff -puN kernel/sched.c~might_sleep-suppression kernel/sched.c --- 25/kernel/sched.c~might_sleep-suppression Mon Oct 27 13:23:32 2003 +++ 25-akpm/kernel/sched.c Mon Oct 27 13:31:39 2003 @@ -2847,21 +2847,39 @@ void __init sched_init(void) } #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP +static atomic_t might_sleep_flag = ATOMIC_INIT(0); + +void might_sleep_disable(void) +{ + atomic_inc(&might_sleep_flag); +} + +void might_sleep_enable(void) +{ + atomic_dec(&might_sleep_flag); +} + void __might_sleep(char *file, int line) { #if defined(in_atomic) static unsigned long prev_jiffy; /* ratelimiting */ - if ((in_atomic() || irqs_disabled()) && system_running) { - if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) - return; - prev_jiffy = jiffies; - printk(KERN_ERR "Debug: sleeping function called from invalid" - " context at %s:%d\n", file, line); - printk("in_atomic():%d, irqs_disabled():%d\n", - in_atomic(), irqs_disabled()); - dump_stack(); - } + if (!in_atomic() && !irqs_disabled()) + return; + if (!system_running) + return; + if (atomic_read(&might_sleep_flag)) + return; + + if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) + return; + + prev_jiffy = jiffies; + printk(KERN_ERR "Debug: sleeping function called from invalid" + " context at %s:%d\n", file, line); + printk("in_atomic():%d, irqs_disabled():%d\n", + in_atomic(), irqs_disabled()); + dump_stack(); #endif } EXPORT_SYMBOL(__might_sleep); _