problems with 2.6.9 kernel

Keith Owens kaos at sgi.com
Wed Mar 2 22:25:44 PST 2005


On Thu, 17 Feb 2005 12:54:54 -0800, 
Adrian Caceres <adrian at atheros.com> wrote:
>1. I keep getting Debug linux kernel messages when I enter KDB.  I am 
>doing it over
>a serial driver:
>"Debug: sleeping function called from invalid context at ..."
>Most of the time I get to a kdb console but sometimes I hang on an 
>endless loop:
>The stack always seems to indicate the problem comes from 
>kdb_getarea_size():

Sorry for the delay in replying - not waving, drowning ...

You have CONFIG_DEBUG_SPINLOCK_SLEEP=y so the kdb use of __copy_to_user
is generating false positives.  When kdb uses that function, the
parameters are such that the call cannot sleep, but __copy_to_user does
not know that.  Replace it with __copy_to_user_inatomic.

Does this patch fix your problem?  Compiled but not tested.

Index: linux/include/asm-i386/kdb.h
===================================================================
--- linux.orig/include/asm-i386/kdb.h	2005-02-05 13:56:12.000000000 +1100
+++ linux/include/asm-i386/kdb.h	2005-03-03 17:14:04.000000000 +1100
@@ -68,7 +68,7 @@ __kdba_putarea_size(unsigned long to_xxx
 	}
 
 	set_fs(KERNEL_DS);
-	r = __copy_to_user((void *)to_xxx, from, size);
+	r = __copy_to_user_inatomic((void *)to_xxx, from, size);
 	set_fs(oldfs);
 	return r;
 }
@@ -88,19 +88,19 @@ __kdba_getarea_size(void *to, unsigned l
 	set_fs(KERNEL_DS);
 	switch (size) {
 	case 1:
-		r = __copy_to_user(to, (void *)from_xxx, 1);
+		r = __copy_to_user_inatomic(to, (void *)from_xxx, 1);
 		break;
 	case 2:
-		r = __copy_to_user(to, (void *)from_xxx, 2);
+		r = __copy_to_user_inatomic(to, (void *)from_xxx, 2);
 		break;
 	case 4:
-		r = __copy_to_user(to, (void *)from_xxx, 4);
+		r = __copy_to_user_inatomic(to, (void *)from_xxx, 4);
 		break;
 	case 8:
-		r = __copy_to_user(to, (void *)from_xxx, 8);
+		r = __copy_to_user_inatomic(to, (void *)from_xxx, 8);
 		break;
 	default:
-		r = __copy_to_user(to, (void *)from_xxx, size);
+		r = __copy_to_user_inatomic(to, (void *)from_xxx, size);
 		break;
 	}
 	set_fs(oldfs);


---------------------------
Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.


More information about the kdb mailing list