destroy_workqueue() doesn't always work when removing device
Holger Schurig
hs4233 at mail.mn-solutions.de
Tue Apr 29 11:55:47 EDT 2008
I can reproduce a problem where I do the following:
# pccardctl insert
# ifconfig eth1 up
Now I make the worker thread busy by issuing a command --- and
while the commands is halfways executing, I physically remove
the device. Any command would work here, but an scan is quite
long, so it's easy to hit the error:
# iwlist eth1 scan
(remove the device quickly)
Now this happens:
libertas cmd: DNLD_CMD: command 0x0006, seq 8, size 63
libertas leave: lbs_execute_next_command()
libertas thread: 1: currenttxskb 00000000, dnld_sent 2
libertas thread: sleeping, connect_status 1, psmode 0, psstate 0
pccard: card ejected from slot 0
libertas enter: lbs_stop_card()
libertas enter: lbs_eth_stop()
libertas leave: lbs_eth_stop()
libertas enter: lbs_get_stats()
libertas enter: lbs_get_stats(
libertas leave: lbs_stop_card()
libertas enter: lbs_remove_card()
libertas enter: lbs_remove_rtap()
libertas leave: lbs_remove_rtap()
... and nothing else. I put some printk's into lbs_remove_card()
and found that the thing hangs while calling
destroy_workqueue(priv->work_thread);
Can this be the case because the thread is still sleeping?
More information about the libertas-dev
mailing list