From: Sau Dan Lee <danlee@informatik.uni-freiburg.de>
To: linux-kernel@vger.kernel.org
Cc: Vojtech Pavlik <vojtech@suse.cz>
Subject: [PATCH] Bug Fix: 2.6.{5,6}: i8042 module unload bug
Date: 10 May 2004 14:12:54 +0200 [thread overview]
Message-ID: <xb77jvkscop.fsf@savona.informatik.uni-freiburg.de> (raw)
In-Reply-To: <xb71xlwtz9s.fsf@savona.informatik.uni-freiburg.de>
I've reported this bug 3 days ago. But since it is still not yet
fixed in the new 2.6.6, I'm reposting this.
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.
Dan> 6) rmmod i8042 ===> hangs. CAPSLOCK doesn't respond (of
Dan> course, i8042 is rmoved), machine doesn't respond to ping
Dan> (why?), although my PCMCIA network card still blinks and the
Dan> hardware indicate of PCMCIA activity also blinks. But
Dan> (un)plugging the PCMCIA card gives no response.
Dan> The same is observed in 2.6.6-rc3.
The same is also observed in 2.6.6.
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:
--- linux-2.6.6-vanilla/drivers/input/serio/i8042.c 2004/05/06 13:24:46 1.1
+++ linux-2.6.6/drivers/input/serio/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-10 12:14 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 ` [PATCH] Bug Fix: 2.6.5 broken module dependencies: i8042 and atkbd? Sau Dan Lee
2004-05-10 12:12 ` Sau Dan Lee [this message]
2004-05-24 7:56 ` [PATCH] Bug Fix: 2.6.{5,6,7-rc1}: i8042 module unload bug 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=xb77jvkscop.fsf@savona.informatik.uni-freiburg.de \
--to=danlee@informatik.uni-freiburg.de \
--cc=linux-kernel@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®