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(&current->thread.vm86_info->regs,regs, VM86_REGS_SIZE1);
 	tmp += copy_to_user(&current->thread.vm86_info->regs.VM86_REGS_PART2,
 		&regs->VM86_REGS_PART2, VM86_REGS_SIZE2);
 	tmp += put_user(current->thread.screen_bitmap,&current->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);

_