mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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


  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®