I've found one possible cause for the "schedule() in interrupt" Oops
reported here, and as it's in the isdn code it may well be the culprit.
The routine isdn_get_allcfg() in isdn_common.c is broken; it does a
cli() and then a copy_to_user(). (See lines 1147 and 1152.) If the
user buffer is paged out, this will certainly break the critical section
the program thinks it's in, and result in a call to schedule().
FWIW, drivers/char/serial.c is also broken; on line 1576 it calls
copy_from_user() after a cli().
I'll review the drivers code for other broken critical section problems.
-Bill