linux/drivers/edac
Jarkko Lavinen 09a81269c7 i82875p_edac: fix module remove
Fix module removal bugs of i82875p_edac.  Also i82975x_edac code seems to
have the same module removal bugs as in i82875p_edac.

The problems were:

1. In module removal i82875p_remove_one() is never called.

   Variable i82875p_registered is newer changed from 1, which
   guarantees i82875p_remove_one() is not called (and even if it were
   called, it would be called in wrong order).

   As a result, the edac_mc workque is not stopped and keeps probing.
   If kernel debugging options are not enabled, user may not notice
   anything going wrong.

   if debugging options are enabled and I do "rmmod i82875p_edac", I
   get:

      edac debug: edac_pci_workq_function() checking
      BUG: unable to handle kernel paging request at f882d16f
      ...
      call trace:
       [<f8834df3>] ? edac_mc_workq_function+0x55/0x7e [edac_core]
       [<c0233974>] ? run_workqueue+0xd7/0x1a5
       [<c023392f>] ? run_workqueue+0x92/0x1a5
       [<f8834d9e>] ? edac_mc_workq_function+0x0/0x7e [edac_core]
       [<c0233af9>] ? worker_thread+0xb7/0xc3
       [<c0236a7b>] ? autoremove_wake_function+0x0/0x33
       [<c0233a42>] ? worker_thread+0x0/0xc3
       [<c0236809>] ? kthread+0x3b/0x61
       [<c02367ce>] ? kthread+0x0/0x61
       [<c0204587>] ? kernel_thread_helper+0x7/0x10

   Fix for this is to get rid of needles variable i82875p_registered
   altogether and run i82875p_remove_one() *before*
   pci_unregister_driver().

2. edac_mc_del_mc() uses mci after freeing mci

   edac_mc_del_mc() calls calls edac_remove_sysfs_mci_device().  The
   kobject refcount of mci drops to 0 and mci is freed.  After this
   mci is accessed via debug print and i82875p_remove_one() still
   uses mci->pvt and tries to free mci again with edac_mc_free().

   The fix for this is add kobject_get(&mci->edac_mci_kobj) after
   edac_mc_alloc(). Then the mci is still available after returning
   from edac_mc_del_mc() with refcount 1, and mci->pvt is still
   available. When i82875p_remove_one() finally calls edac_mc_free(),
   this will cause kobject_put() and mci is released properly.

Signed-off-by: Jarkko Lavinen <jlavi@iki.fi>
Cc: Doug Thompson <norsk5@yahoo.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-12-01 19:55:25 -08:00
..
amd76x_edac.c
cell_edac.c edac: fix enabling of polling cell module 2008-10-30 11:38:46 -07:00
e7xxx_edac.c
e752x_edac.c
edac_core.h
edac_device_sysfs.c
edac_device.c
edac_mc_sysfs.c
edac_mc.c
edac_module.c
edac_module.h
edac_pci_sysfs.c
edac_pci.c
edac_stub.c
i3000_edac.c
i5000_edac.c i5000-edac: hold reference to mci kobject 2008-11-12 17:17:16 -08:00
i5100_edac.c
i82443bxgx_edac.c
i82860_edac.c
i82875p_edac.c i82875p_edac: fix module remove 2008-12-01 19:55:25 -08:00
i82975x_edac.c
Kconfig edac x38: new MC driver module 2008-10-30 11:38:45 -07:00
Makefile edac x38: new MC driver module 2008-10-30 11:38:45 -07:00
mpc85xx_edac.c edac mpc85xx: add support for mpc8572 2008-10-16 11:21:48 -07:00
mpc85xx_edac.h
mv64x60_edac.c
mv64x60_edac.h
pasemi_edac.c
r82600_edac.c
x38_edac.c edac x38: new MC driver module 2008-10-30 11:38:45 -07:00