From: Sau Dan Lee <danlee@informatik.uni-freiburg.de>
To: linux-kernel@vger.kernel.org
Cc: Vojtech Pavlik <vojtech@suse.cz>, Tuukka Toivonen <tuukkat@ee.oulu.fi>
Subject: [PATCH] Bug Fix: 2.6.5 broken module dependencies: i8042 and atkbd?
Date: 07 May 2004 10:30:39 +0200 [thread overview]
Message-ID: <xb71xlwtz9s.fsf@savona.informatik.uni-freiburg.de> (raw)
In-Reply-To: xb7ad0pu40e.fsf@savona.informatik.uni-freiburg.de
Dan> I've successfully and repeated hanged vanilla 2.6.5 kernel.
Dan> Here is how I do it:
Dan> 1) Configure and compile kernel (on Intel x86) so that
Dan> 'serio', 'i8042', 'atkbd' are all modules. i.e.
Dan> CONFIG_SERIO_I8042=m CONFIG_SERIO=m CONFIG_KEYBOARD_ATKBD=m
Dan> 2) Boot the compiled kernel.
Dan> 3) Log in from network.
Dan> 4) modprobe the following modules in order: serio, i8042, atkbd
Dan> 5) Now, keyboard works, as expected. 6) rmmod i8042 ===>
Dan> hangs. CAPSLOCK doesn't respond (of course, i8042 is
Dan> rmoved), machine doesn't respond to ping (why?), although my
Dan> PCMCIA network card still blinks and the hardware indicate of
Dan> PCMCIA activity also blinks. But (un)plugging the PCMCIA
Dan> card gives no response.
Dan> The same is observed in 2.6.6-rc3.
I've found and fixed the bug.
It has nothing to do with module dependencies. Rather, it's a bug
with improper shutdown of a timer.
Cause: When the i8042 module is unloaded, the i8042_exit() shuts down
it timer by calling del_timer_sync(). However, after that
call, there can still be interrupts from the i8042 chip (due to
keyboard or mouse activities). Such interrupts invoke the
interrupt handler i8042_interrupt(), which would call
mod_timer() to reschedule a new timer event. But i8042_exit()
won't want for this new timer event. It may exit before the
event arrives. The module is unloaded as i8042_exit() exits,
but this can happen before the new timer event comes. As a
result, when the timer expires, the kernel tries to call
i8042_timer_func(), which has been unloaded! This results in a
complete freeze.
The Fix: is to make sure interrupts from the i8042 chip are disabled
before calling del_timer_sync() to clean up the timer. In
i8042_exit(), this is as easy as swapping the order of the
calls to del_timer_sync() and i8042_controller_cleanup().
The Patch:
--- i8042.c 2004/05/06 13:24:46 1.1
+++ i8042.c 2004/05/06 15:17:50 1.2
@@ -990,24 +990,28 @@
unregister_reboot_notifier(&i8042_notifier);
if (i8042_pm_dev)
pm_unregister(i8042_pm_dev);
if (i8042_sysdev_initialized) {
sysdev_unregister(&device_i8042);
sysdev_class_unregister(&kbc_sysclass);
}
- del_timer_sync(&i8042_timer);
-
i8042_controller_cleanup();
+ /* we must delete the timer AFTER the i8042 chip is cleaned up,
+ so as to prevent any more interrupts to invoke i8042_interrupt()
+ which then schedules newer timer events.
+ */
+ del_timer_sync(&i8042_timer);
+
if (i8042_kbd_values.exists)
serio_unregister_port(&i8042_kbd_port);
if (i8042_aux_values.exists)
serio_unregister_port(&i8042_aux_port);
for (i = 0; i < 4; i++)
if (i8042_mux_values[i].exists)
serio_unregister_port(i8042_mux_port + i);
--
Sau Dan LEE 李守敦(Big5) ~{@nJX6X~}(HZ)
E-mail: danlee@informatik.uni-freiburg.de
Home page: http://www.informatik.uni-freiburg.de/~danlee
next prev parent reply other threads:[~2004-05-07 8:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-04-29 14:36 Bug Report: 2.6.5 broken module dependencies: i8042 and atkbd? Sau Dan Lee
2004-05-03 8:21 ` [PATCH] (fix:oops with rmmod i8042) (was:Bug Report: 2.6.5 broken module dependencies: i8042 and atkbd?) Tuukka Toivonen
2004-05-03 11:46 ` [PATCH] modused: mark some modules as in use (Re: [PATCH] (fix:oops with rmmod i8042)) Sau Dan Lee
2004-05-07 8:30 ` Sau Dan Lee [this message]
2004-05-10 12:12 ` [PATCH] Bug Fix: 2.6.{5,6}: i8042 module unload bug Sau Dan Lee
2004-05-24 7:56 ` [PATCH] Bug Fix: 2.6.{5,6,7-rc1}: " Sau Dan Lee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xb71xlwtz9s.fsf@savona.informatik.uni-freiburg.de \
--to=danlee@informatik.uni-freiburg.de \
--cc=linux-kernel@vger.kernel.org \
--cc=tuukkat@ee.oulu.fi \
--cc=vojtech@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.