* EEE PC hangs when booting off battery [not found] ` <49EF0ABD.2080801@tuffmail.co.uk> @ 2009-04-26 11:34 ` Alan Jenkins 2009-04-28 9:19 ` [PATCH] [RFC] " Alan Jenkins 0 siblings, 1 reply; 9+ messages in thread From: Alan Jenkins @ 2009-04-26 11:34 UTC (permalink / raw) To: linux-wireless@vger.kernel.org Cc: Arjan van de Ven, linux acpi, linux-kernel, Kernel Testers List, Venkatesh Pallipadi, Bjorn Helgaas Alan Jenkins wrote: > Alan Jenkins wrote: > >> Bjorn Helgaas wrote: >> >> >>> On Tuesday 14 April 2009 09:17:28 am Arjan van de Ven wrote: >>> >>> >>> >>>> On Tue, 14 Apr 2009 08:59:01 -0600 >>>> Bjorn Helgaas <bjorn.helgaas@hp.com> wrote: >>>> >>>> >>>> >>>> >>>>> I can't help with the real problem of why the asynchronous battery >>>>> init causes the hang. >>>>> >>>>> >>>>> >>>> that got fixed already for the module case. >>>> >>>> >>>> >>> But apparently still broken for the builtin case? I think Alan is >>> running pretty new bits -- he said "latest git" on April 11. >>> >>> >>> >> It's now fixed, in 2.6.30-rc2. My battery is modular btw. I suspect >> >> 5d38258ec026921a7b266f4047ebeaa75db358e5 "ACPI battery: fix async boot >> oops" [removal of __init] >> >> was not sufficient to fix my problem, but it was solved by the "real" fix, >> >> d6de2c80e9d758d2e36c21699117db6178c0f517 "async: Fix module loading >> async-work regression" [module loading waits on async work] >> >> >> I would argue there's still a question over why the asynchronous battery >> init (_with_ the oops fix) should cause a hang in the idle routine. But >> since the regression is fixed, it's not exactly an urgent question. >> >> > > Ugh. Recently I tried building the battery driver into the kernel, to > benefit from the async work. Later, I tried booting from the battery > and it hung again. > > This time, the kernel did not even respond to SysRq. I tried > nmi_watchdog=1 and waiting 2 minutes, but the watchdog didn't trigger > either. As before, it doesn't happen with acpi=off. > > I checked that this still happened in todays rc3, and it doesn't happen > if I revert > > 0f66af530116e9f4dd97f328d91718b56a6fc5a4 "ACPI: battery: asynchronous init" > > It looks like my hang is caused by linkwatch_event() deadlocking on rtnl_lock(). I can't see any direct connection to asynchronous battery init, so perhaps that is just revealing a bug by changing the timing. It appears I wasn't patient enough for hung task detection. If I leave it long enough, I see: <scrolled off top of screen> ? kobject_uevent_env ? kobject_uevent_env __mutex_lock_slowpath mutex_lock rtnl_lock linkwatch_event worker_thread ? linkwatch_event ? autoremove_wake_function ? worker_thread kthread kernel_thread_helper INFO: task modprobe:485 blocked for more than 120 seconds Call trace: ? __atomic_notifier_call_chain schedule schedule_timeout ? notify_update ? do_con_write ? __wake_up wait_for_common ? default_wake_function wait_for_completion flush_cpu_workqueue ? wq_barrier_func flush_workqueue flush_scheduled_work tty_ldisc_release ? tty_fasyc tty_release_dev ? free_pgtables tty_release __fput filp_close sys_close syscall_call ? __send_remote_softirq ? usecs_to_jiffies I then seem to get another repetition of the second calltrace, followed by a new one INFO: task swapper:1 blocked for more than 120 seconds Call trace: schedule schedule_timeout ? __wake_up_common ? wake_up wait_for_common wait_for_completion call_usermodehelper_exec __request_module crypto_larval_lookup ? extract_entropy crypto_alg_mod_lookup crypto_alloc_base ieee80211_wep_init ieee80211_register_hw ? ath5k_hw_set_bss ath5k+pci_probe local_pci_probe pci_device_probe driver_probe_device __driver_attach bus_for_each_dev driver_attach ? __driver_attach buad_add_driver driver_register ? ktime_get_ts __pci_register_driver init_ath5k_pci _stext ? init_ath5k_pci ? proc_create_data ? register_ieq_proc kernel_init ? kernel_init kernel_thread_helper The hang happens at this point: [ 0.967588] scsi 1:0:0:0: Direct-Access ATA SILICONMOTION SM n/a PQ: 0 ANSI: 5 [ 0.968049] calling 4_sd_probe_async+0x0/0x225 @ 323 [ 0.968313] initcall 3_async_port_probe+0x0/0x95 returned 0 after 343051 usecs <mark> (see below). [ 0.968786] sd 1:0:0:0: [sda] 7815024 512-byte hardware sectors: (4.00 GB/3.72 GiB) [ 0.968964] sd 1:0:0:0: [sda] Write Protect is off [ 0.969062] sd 1:0:0:0: [sda] Mode Sense: 00 3a 00 00 [ 0.969132] sd 1:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 0.969543] sda: sda1 sda2 [ 0.970965] sd 1:0:0:0: [sda] Attached SCSI disk [ 0.971073] initcall 4_sd_probe_async+0x0/0x225 returned 0 after 2849 usecs On a successful boot, the next lines are [ 0.971188] async_continuing @ 1 after 2483 usec [ 0.971305] Freeing unused kernel memory: 256k freed [ 1.071724] calling ata_generic_init+0x0/0x19 [ata_generic] @ 574 [ 1.073798] initcall ata_generic_init+0x0/0x19 [ata_generic] returned 0 after 144 usecs [ 1.183372] Clocksource tsc unstable (delta = -128600689 ns) [ 2.035932] EXT4-fs: delayed allocation enabled Also, on a successful boot, I see these additional lines at the point <mark> above. [ 0.968461] async_continuing @ 1 after 76663 usec [ 0.968556] async_waiting @ 1 In fact, when the hang happens I can see no "async_waiting @ 1" on my 50-line screen. Which makes sense if the kernel init process is hung in init_athk_pci(). Thanks Alan ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-26 11:34 ` EEE PC hangs when booting off battery Alan Jenkins @ 2009-04-28 9:19 ` Alan Jenkins 2009-04-28 9:58 ` Johannes Berg 0 siblings, 1 reply; 9+ messages in thread From: Alan Jenkins @ 2009-04-28 9:19 UTC (permalink / raw) To: linux-wireless@vger.kernel.org Cc: Arjan van de Ven, linux-kernel, Kernel Testers List I found a regression where my EEE hangs at boot time, if the battery is present. I'm confident it's a regression because it disappears if I revert Arjan's asynchronous battery initialisation. However, the evidence points to a deadlock in the wireless stack which has simply been uncovered by timing changes. If I leave the system long enough, I get a series of hung task warnings. They suggest the following deadlock: - ieee80211_wep_init(), which is called with rtnl_lock() held, is blocked in request_module() [waiting for modprobe to load a crypto module]. - modprobe is blocked in a call to flush_workqueue(), caused by closing a TTY. - worker_thread is blocked because the workqueue item linkwatch_event() is blocked on rtnl_lock. I've hacked up a test patch to move wep_init() outside of rtnl_lock, and it solved the problem. My one caveat is that it would probably be cleaner to move it after rtnl_unlock(), instead of before rtnl_lock(). I just wasn't 100% sure if that would be safe. Here's the patch: ---8<--- diff --git a/net/mac80211/main.c b/net/mac80211/main.c index fbcbed6..fffa7f9 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -909,6 +909,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) if (result < 0) goto fail_sta_info; + result = ieee80211_wep_init(local); + if (result < 0) { + printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", + wiphy_name(local->hw.wiphy), result); + goto fail_wep; + } + rtnl_lock(); result = dev_alloc_name(local->mdev, local->mdev->name); if (result < 0) @@ -930,14 +937,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) goto fail_rate; } - result = ieee80211_wep_init(local); - - if (result < 0) { - printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", - wiphy_name(local->hw.wiphy), result); - goto fail_wep; - } - /* add one default STA interface if supported */ if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION)) { result = ieee80211_if_add(local, "wlan%d", NULL, @@ -967,13 +966,12 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) return 0; -fail_wep: - rate_control_deinitialize(local); fail_rate: unregister_netdevice(local->mdev); local->mdev = NULL; fail_dev: rtnl_unlock(); +fail_wep: sta_info_stop(local); fail_sta_info: debugfs_hw_del(local); ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-28 9:19 ` [PATCH] [RFC] " Alan Jenkins @ 2009-04-28 9:58 ` Johannes Berg 2009-04-28 10:27 ` Alan Jenkins 0 siblings, 1 reply; 9+ messages in thread From: Johannes Berg @ 2009-04-28 9:58 UTC (permalink / raw) To: Alan Jenkins Cc: linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List [-- Attachment #1: Type: text/plain, Size: 1400 bytes --] It seems the only reason lockdep doesn't warn is the detour to userspace (modprobe) and the waiting for a userspace task (waiting isn't lockdep annotated and I don't think it can be) It seems you cannot load a module while under _any_ lock, ever, since userspace might turn around and do something that requires that lock? I think we should probably add a warning to the code that waits for the userspace task: debug_check_no_locks_held(current); Or not? Some purely internal locks _might_ be ok... but how could you verify that? > - ieee80211_wep_init(), which is called with rtnl_lock() held, is > blocked in request_module() [waiting for modprobe to load a crypto module]. Right. > - modprobe is blocked in a call to flush_workqueue(), caused by closing > a TTY. Can you point out where? I can't find that. > - worker_thread is blocked because the workqueue item linkwatch_event() > is blocked on rtnl_lock. This I know about. > I've hacked up a test patch to move wep_init() outside of rtnl_lock, and > it solved the problem. My one caveat is that it would probably be > cleaner to move it after rtnl_unlock(), instead of before rtnl_lock(). > I just wasn't 100% sure if that would be safe. Here's the patch: That doesn't seem relevant, this just does some initialisation. However, you definitely missed adding a call to wep_free(). johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-28 9:58 ` Johannes Berg @ 2009-04-28 10:27 ` Alan Jenkins 2009-04-28 10:35 ` Johannes Berg 2009-04-29 11:14 ` Alan Jenkins 0 siblings, 2 replies; 9+ messages in thread From: Alan Jenkins @ 2009-04-28 10:27 UTC (permalink / raw) To: Johannes Berg Cc: linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List Johannes Berg wrote: > It seems the only reason lockdep doesn't warn is the detour to userspace > (modprobe) and the waiting for a userspace task (waiting isn't lockdep > annotated and I don't think it can be) > > It seems you cannot load a module while under _any_ lock, ever, since > userspace might turn around and do something that requires that lock? I > think we should probably add a warning to the code that waits for the > userspace task: > > debug_check_no_locks_held(current); > > Or not? Some purely internal locks _might_ be ok... but how could you > verify that? > > >> - ieee80211_wep_init(), which is called with rtnl_lock() held, is >> blocked in request_module() [waiting for modprobe to load a crypto module]. >> > > Right. > > >> - modprobe is blocked in a call to flush_workqueue(), caused by closing >> a TTY. >> > > Can you point out where? I can't find that. > I posted the calltraces earlier at <http://marc.info/?l=linux-wireless&m=124074566523506&w=2>. wait_for_completion flush_cpu_workqueue ? wq_barrier_func flush_workqueue flush_scheduled_work tty_ldisc_release ? tty_fasyc tty_release_dev ? free_pgtables tty_release __fput filp_close sys_close syscall_call >> - worker_thread is blocked because the workqueue item linkwatch_event() >> is blocked on rtnl_lock. >> > > This I know about. > > >> I've hacked up a test patch to move wep_init() outside of rtnl_lock, and >> it solved the problem. My one caveat is that it would probably be >> cleaner to move it after rtnl_unlock(), instead of before rtnl_lock(). >> I just wasn't 100% sure if that would be safe. Here's the patch: >> > > That doesn't seem relevant, this just does some initialisation. However, > you definitely missed adding a call to wep_free(). > Hah, I should have realized something was wrong when I noticed I was removing more lines that I added. The crypto init does cause the module load: wait_for_completion call_usermodehelper_exec __request_module crypto_larval_lookup ? extract_entropy crypto_alg_mod_lookup crypto_alloc_base ieee80211_wep_init ieee80211_register_hw ? ath5k_hw_set_bss ath5k+pci_probe local_pci_probe pci_device_probe driver_probe_device __driver_attach bus_for_each_dev driver_attach ? __driver_attach buad_add_driver driver_register ? ktime_get_ts __pci_register_driver init_ath5k_pci _stext ? init_ath5k_pci ? proc_create_data ? register_ieq_proc kernel_init Thanks Alan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-28 10:27 ` Alan Jenkins @ 2009-04-28 10:35 ` Johannes Berg 2009-04-29 11:14 ` Alan Jenkins 1 sibling, 0 replies; 9+ messages in thread From: Johannes Berg @ 2009-04-28 10:35 UTC (permalink / raw) To: Alan Jenkins Cc: linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List [-- Attachment #1: Type: text/plain, Size: 411 bytes --] On Tue, 2009-04-28 at 11:27 +0100, Alan Jenkins wrote: > > Can you point out where? I can't find that. > > I posted the calltraces earlier at > <http://marc.info/?l=linux-wireless&m=124074566523506&w=2>. > > wait_for_completion > flush_cpu_workqueue > ? wq_barrier_func > flush_workqueue > flush_scheduled_work > tty_ldisc_release Ah, I was just grepping for the wrong thing :) johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-28 10:27 ` Alan Jenkins 2009-04-28 10:35 ` Johannes Berg @ 2009-04-29 11:14 ` Alan Jenkins 2009-04-29 11:20 ` Johannes Berg 2009-05-15 21:48 ` Rafael J. Wysocki 1 sibling, 2 replies; 9+ messages in thread From: Alan Jenkins @ 2009-04-29 11:14 UTC (permalink / raw) To: John Linville Cc: Johannes Berg, linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List Alan Jenkins wrote: > Johannes Berg wrote: > >> That doesn't seem relevant, this just does some initialisation. However, >> you definitely missed adding a call to wep_free(). >> >> > > Hah, I should have realized something was wrong when I noticed I was > removing more lines that I added. > > The crypto init does cause the module load: > > wait_for_completion > call_usermodehelper_exec > __request_module > crypto_larval_lookup > ? extract_entropy > crypto_alg_mod_lookup > crypto_alloc_base > ieee80211_wep_init > ieee80211_register_hw > Here's a corrected patch complete with changelog. If there are no other problems with it, can you please apply this for 2.6.30 to keep my EeePC regression-free? Thanks Alan ------> >From c5e9dc036247e70956d1a28e8850c3810385dda0 Mon Sep 17 00:00:00 2001 From: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Date: Wed, 29 Apr 2009 11:41:24 +0100 Subject: [PATCH] mac80211: fix modprobe deadlock by not calling wep_init under rtnl_lock - ieee80211_wep_init(), which is called with rtnl_lock held, blocks in request_module() [waiting for modprobe to load a crypto module]. - modprobe blocks in a call to flush_workqueue(), when it closes a TTY [presumably when it exits]. - The workqueue item linkwatch_event() blocks on rtnl_lock. There's no reason for wep_init() to be called with rtnl_lock held, so just move it outside the critical section. Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> --- net/mac80211/main.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-) diff --git a/net/mac80211/main.c b/net/mac80211/main.c index fbcbed6..00968c2 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -909,6 +909,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) if (result < 0) goto fail_sta_info; + result = ieee80211_wep_init(local); + if (result < 0) { + printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", + wiphy_name(local->hw.wiphy), result); + goto fail_wep; + } + rtnl_lock(); result = dev_alloc_name(local->mdev, local->mdev->name); if (result < 0) @@ -930,14 +937,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) goto fail_rate; } - result = ieee80211_wep_init(local); - - if (result < 0) { - printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", - wiphy_name(local->hw.wiphy), result); - goto fail_wep; - } - /* add one default STA interface if supported */ if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION)) { result = ieee80211_if_add(local, "wlan%d", NULL, @@ -967,13 +966,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) return 0; -fail_wep: - rate_control_deinitialize(local); fail_rate: unregister_netdevice(local->mdev); local->mdev = NULL; fail_dev: rtnl_unlock(); + ieee80211_wep_free(local); +fail_wep: sta_info_stop(local); fail_sta_info: debugfs_hw_del(local); -- 1.5.4.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-29 11:14 ` Alan Jenkins @ 2009-04-29 11:20 ` Johannes Berg 2009-05-15 21:48 ` Rafael J. Wysocki 1 sibling, 0 replies; 9+ messages in thread From: Johannes Berg @ 2009-04-29 11:20 UTC (permalink / raw) To: Alan Jenkins Cc: John Linville, linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List [-- Attachment #1: Type: text/plain, Size: 2517 bytes --] On Wed, 2009-04-29 at 12:14 +0100, Alan Jenkins wrote: > From c5e9dc036247e70956d1a28e8850c3810385dda0 Mon Sep 17 00:00:00 2001 > From: Alan Jenkins <alan-jenkins@tuffmail.co.uk> > Date: Wed, 29 Apr 2009 11:41:24 +0100 > Subject: [PATCH] mac80211: fix modprobe deadlock by not calling wep_init under rtnl_lock > > - ieee80211_wep_init(), which is called with rtnl_lock held, blocks in > request_module() [waiting for modprobe to load a crypto module]. > > - modprobe blocks in a call to flush_workqueue(), when it closes a TTY > [presumably when it exits]. > > - The workqueue item linkwatch_event() blocks on rtnl_lock. > > There's no reason for wep_init() to be called with rtnl_lock held, so > just move it outside the critical section. Looks correct to me. > Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Reviewed-by: Johannes Berg <johannes@sipsolutions.net> > --- > net/mac80211/main.c | 19 +++++++++---------- > 1 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/net/mac80211/main.c b/net/mac80211/main.c > index fbcbed6..00968c2 100644 > --- a/net/mac80211/main.c > +++ b/net/mac80211/main.c > @@ -909,6 +909,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > if (result < 0) > goto fail_sta_info; > > + result = ieee80211_wep_init(local); > + if (result < 0) { > + printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", > + wiphy_name(local->hw.wiphy), result); > + goto fail_wep; > + } > + > rtnl_lock(); > result = dev_alloc_name(local->mdev, local->mdev->name); > if (result < 0) > @@ -930,14 +937,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > goto fail_rate; > } > > - result = ieee80211_wep_init(local); > - > - if (result < 0) { > - printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", > - wiphy_name(local->hw.wiphy), result); > - goto fail_wep; > - } > - > /* add one default STA interface if supported */ > if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION)) { > result = ieee80211_if_add(local, "wlan%d", NULL, > @@ -967,13 +966,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > > return 0; > > -fail_wep: > - rate_control_deinitialize(local); > fail_rate: > unregister_netdevice(local->mdev); > local->mdev = NULL; > fail_dev: > rtnl_unlock(); > + ieee80211_wep_free(local); > +fail_wep: > sta_info_stop(local); > fail_sta_info: > debugfs_hw_del(local); [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-04-29 11:14 ` Alan Jenkins 2009-04-29 11:20 ` Johannes Berg @ 2009-05-15 21:48 ` Rafael J. Wysocki 2009-05-16 8:39 ` Alan Jenkins 1 sibling, 1 reply; 9+ messages in thread From: Rafael J. Wysocki @ 2009-05-15 21:48 UTC (permalink / raw) To: Alan Jenkins Cc: John Linville, Johannes Berg, linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List On Wednesday 29 April 2009, Alan Jenkins wrote: > Alan Jenkins wrote: > > Johannes Berg wrote: > > > >> That doesn't seem relevant, this just does some initialisation. However, > >> you definitely missed adding a call to wep_free(). > >> > >> > > > > Hah, I should have realized something was wrong when I noticed I was > > removing more lines that I added. > > > > The crypto init does cause the module load: > > > > wait_for_completion > > call_usermodehelper_exec > > __request_module > > crypto_larval_lookup > > ? extract_entropy > > crypto_alg_mod_lookup > > crypto_alloc_base > > ieee80211_wep_init > > ieee80211_register_hw > > > > Here's a corrected patch complete with changelog. If there are no other > problems with it, can you please apply this for 2.6.30 to keep my EeePC > regression-free? > > Thanks > Alan > > ------> > From c5e9dc036247e70956d1a28e8850c3810385dda0 Mon Sep 17 00:00:00 2001 > From: Alan Jenkins <alan-jenkins@tuffmail.co.uk> > Date: Wed, 29 Apr 2009 11:41:24 +0100 > Subject: [PATCH] mac80211: fix modprobe deadlock by not calling wep_init under rtnl_lock > > - ieee80211_wep_init(), which is called with rtnl_lock held, blocks in > request_module() [waiting for modprobe to load a crypto module]. > > - modprobe blocks in a call to flush_workqueue(), when it closes a TTY > [presumably when it exits]. > > - The workqueue item linkwatch_event() blocks on rtnl_lock. > > There's no reason for wep_init() to be called with rtnl_lock held, so > just move it outside the critical section. Has it been merged already or is it queued up for merging? Rafael > Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> > --- > net/mac80211/main.c | 19 +++++++++---------- > 1 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/net/mac80211/main.c b/net/mac80211/main.c > index fbcbed6..00968c2 100644 > --- a/net/mac80211/main.c > +++ b/net/mac80211/main.c > @@ -909,6 +909,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > if (result < 0) > goto fail_sta_info; > > + result = ieee80211_wep_init(local); > + if (result < 0) { > + printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", > + wiphy_name(local->hw.wiphy), result); > + goto fail_wep; > + } > + > rtnl_lock(); > result = dev_alloc_name(local->mdev, local->mdev->name); > if (result < 0) > @@ -930,14 +937,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > goto fail_rate; > } > > - result = ieee80211_wep_init(local); > - > - if (result < 0) { > - printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n", > - wiphy_name(local->hw.wiphy), result); > - goto fail_wep; > - } > - > /* add one default STA interface if supported */ > if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION)) { > result = ieee80211_if_add(local, "wlan%d", NULL, > @@ -967,13 +966,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > > return 0; > > -fail_wep: > - rate_control_deinitialize(local); > fail_rate: > unregister_netdevice(local->mdev); > local->mdev = NULL; > fail_dev: > rtnl_unlock(); > + ieee80211_wep_free(local); > +fail_wep: > sta_info_stop(local); > fail_sta_info: > debugfs_hw_del(local); -- Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? --- Brian Kernighan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] [RFC] EEE PC hangs when booting off battery 2009-05-15 21:48 ` Rafael J. Wysocki @ 2009-05-16 8:39 ` Alan Jenkins 0 siblings, 0 replies; 9+ messages in thread From: Alan Jenkins @ 2009-05-16 8:39 UTC (permalink / raw) To: Rafael J. Wysocki Cc: John Linville, Johannes Berg, linux-wireless@vger.kernel.org, Arjan van de Ven, linux-kernel, Kernel Testers List Rafael J. Wysocki wrote: > On Wednesday 29 April 2009, Alan Jenkins wrote: > >> Alan Jenkins wrote: >> >>> Johannes Berg wrote: >>> >>> >>>> That doesn't seem relevant, this just does some initialisation. However, >>>> you definitely missed adding a call to wep_free(). >>>> >>>> >>>> >>> Hah, I should have realized something was wrong when I noticed I was >>> removing more lines that I added. >>> >>> The crypto init does cause the module load: >>> >>> wait_for_completion >>> call_usermodehelper_exec >>> __request_module >>> crypto_larval_lookup >>> ? extract_entropy >>> crypto_alg_mod_lookup >>> crypto_alloc_base >>> ieee80211_wep_init >>> ieee80211_register_hw >>> >>> >> Here's a corrected patch complete with changelog. If there are no other >> problems with it, can you please apply this for 2.6.30 to keep my EeePC >> regression-free? >> >> Thanks >> Alan >> >> ------> >> From c5e9dc036247e70956d1a28e8850c3810385dda0 Mon Sep 17 00:00:00 2001 >> From: Alan Jenkins <alan-jenkins@tuffmail.co.uk> >> Date: Wed, 29 Apr 2009 11:41:24 +0100 >> Subject: [PATCH] mac80211: fix modprobe deadlock by not calling wep_init under rtnl_lock >> >> - ieee80211_wep_init(), which is called with rtnl_lock held, blocks in >> request_module() [waiting for modprobe to load a crypto module]. >> >> - modprobe blocks in a call to flush_workqueue(), when it closes a TTY >> [presumably when it exits]. >> >> - The workqueue item linkwatch_event() blocks on rtnl_lock. >> >> There's no reason for wep_init() to be called with rtnl_lock held, so >> just move it outside the critical section. >> > > Has it been merged already or is it queued up for merging? > > Rafael > It looks like it's been merged as v2.6.30-rc6~2^2~40^2~1. Thanks for checking up Alan ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-05-16 8:39 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <49E065CF.6040408@tuffmail.co.uk>
[not found] ` <200904140859.02188.bjorn.helgaas@hp.com>
[not found] ` <20090414081728.10de978a@infradead.org>
[not found] ` <200904140948.37633.bjorn.helgaas@hp.com>
[not found] ` <49E5F01B.2060201@tuffmail.co.uk>
[not found] ` <49EF0ABD.2080801@tuffmail.co.uk>
2009-04-26 11:34 ` EEE PC hangs when booting off battery Alan Jenkins
2009-04-28 9:19 ` [PATCH] [RFC] " Alan Jenkins
2009-04-28 9:58 ` Johannes Berg
2009-04-28 10:27 ` Alan Jenkins
2009-04-28 10:35 ` Johannes Berg
2009-04-29 11:14 ` Alan Jenkins
2009-04-29 11:20 ` Johannes Berg
2009-05-15 21:48 ` Rafael J. Wysocki
2009-05-16 8:39 ` Alan Jenkins
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).