From: Helmut Schaa <helmut.schaa@googlemail.com>
To: TJ <ubuntu@tjworld.net>
Cc: Reinette Chatre <reinette.chatre@intel.com>,
linux-wireless@vger.kernel.org
Subject: Re: iwl3945: Don't queue rfkill_poll work when module is exiting
Date: Tue, 24 Mar 2009 18:51:11 +0100 [thread overview]
Message-ID: <200903241851.11949.helmut.schaa@gmail.com> (raw)
In-Reply-To: <1237909459.5365.16.camel@hephaestion>
Am Dienstag, 24. M=E4rz 2009 schrieb TJ:
> Tim Gardner suggested I forward this as a possible stable-release
> update. I found the problem in our current Ubuntu Jaunty tree - iwlwi=
fi
> version 1.2.26k. What follows is a copy of the patch for Jaunty
> (2.6.28).
The patch that introduced the rfkill polling did not hit mainline yet. =
It
should pop up in 2.6.30, hence this patch is not needed for any stable
series.
I wasn't able to reproduce the issue by unloading iwl3945 here. Any hin=
ts
on how to reproduce this issue?
Thanks,
Helmut
> ----------
> Bug: #345710
>=20
> When the wireless interface is active and the iwl3945 module is unloa=
ded the
> call to ieee80211_unregister_hw() would call iwl3945_mac_stop() which=
would
> restart the delayed workqueue for rfkill_poll. That workqueue had alr=
eady been
> cancelled so when the next work item was run (2 seconds later) the sy=
stem would
> suffer a hard lock-up because the module had been unloaded by then.
>=20
> This patch implements STATUS_EXIT_PENDING checks in places where the =
rfkill_poll
> work is scheduled, and moves the final workqueue cancellation to occu=
r after the
> call to ieee80211_unregister_hw().
>=20
> Bug discovered, experienced and fix tested on my PC.
>=20
> Signed-off-by: TJ <ubuntu@tjworld.net>
> ---
> drivers/net/wireless/iwlwifi/iwl3945-base.c | 16 +++++++++++++---
> 1 files changed, 13 insertions(+), 3 deletions(-)
>=20
> diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/ne=
t/wireless/iwlwifi/iwl3945-base.c
> index bb92db2..acaf038 100644
> --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
> +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
> @@ -6062,7 +6062,9 @@ static void iwl3945_rfkill_poll(struct work_str=
uct *data)
> if (test_bit(STATUS_RF_KILL_HW, &status) !=3D test_bit(STATUS_RF_KI=
LL_HW, &priv->status))
> queue_work(priv->workqueue, &priv->rf_kill);
> =20
> - queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
> + /* only queue if module isn't exiting */
> + if (! test_bit(STATUS_EXIT_PENDING, &priv->status))
> + queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
> round_jiffies_relative(2 * HZ));
> =20
> }
> @@ -6588,7 +6590,10 @@ static void iwl3945_mac_stop(struct ieee80211_=
hw *hw)
> flush_workqueue(priv->workqueue);
> =20
> /* start polling the killswitch state again */
> - queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
> +
> + /* only queue if module isn't exiting */
> + if (! test_bit(STATUS_EXIT_PENDING, &priv->status))
> + queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
> round_jiffies_relative(2 * HZ));
> =20
> IWL_DEBUG_MAC80211("leave\n");
> @@ -8166,7 +8171,6 @@ static void __devexit iwl3945_pci_remove(struct=
pci_dev *pdev)
> sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
> =20
> iwl3945_rfkill_unregister(priv);
> - cancel_delayed_work(&priv->rfkill_poll);
> iwl3945_dealloc_ucode_pci(priv);
> =20
> if (priv->rxq.bd)
> @@ -8182,6 +8186,12 @@ static void __devexit iwl3945_pci_remove(struc=
t pci_dev *pdev)
> /*netif_stop_queue(dev); */
> flush_workqueue(priv->workqueue);
> =20
> + /* ieee80211_unregister_hw calls iwl3945_mac_stop which used to res=
tart the rfkill
> + polling. Although that now checks STATUS_EXIT_PENDING do cancel =
and wait for any
> + pending work to complete */
> + cancel_delayed_work(&priv->rfkill_poll);
> + cancel_work_sync(&priv->rfkill_poll);
> +
> /* ieee80211_unregister_hw calls iwl3945_mac_stop, which flushes
> * priv->workqueue... so we can't take down the workqueue
> * until now... */
--
To unsubscribe from this list: send the line "unsubscribe linux-wireles=
s" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-03-24 17:51 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-24 15:44 iwl3945: Don't queue rfkill_poll work when module is exiting TJ
2009-03-24 17:51 ` Helmut Schaa [this message]
2009-03-24 21:22 ` TJ
2009-03-25 3:41 ` Huaxu Wan
2009-03-25 4:31 ` TJ
2009-03-26 19:39 ` reinette chatre
2009-04-02 22:36 ` reinette chatre
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=200903241851.11949.helmut.schaa@gmail.com \
--to=helmut.schaa@googlemail.com \
--cc=linux-wireless@vger.kernel.org \
--cc=reinette.chatre@intel.com \
--cc=ubuntu@tjworld.net \
/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.