2021-01-17 21:48:19

by Lorenzo Bianconi

[permalink] [raw]
Subject: [PATCH wireless-drivers] mt7601u: fix kernel crash unplugging the device

Fix the following kernel crash unplugging the usb dongle

Hardware name: Hewlett-Packard 500-539ng/2B2C, BIOS 80.06 04/01/2015
Workqueue: usb_hub_wq hub_event
RIP: 0010:skb_trim+0x2c/0x30
RSP: 0000:ffffb4c88005bba8 EFLAGS: 00010206
RAX: 000000004ad483ee RBX: ffff9a236625dee0 RCX: 000000000000662f
RDX: 000000000000000c RSI: 0000000000000000 RDI: ffff9a2343179300
RBP: ffff9a2343179300 R08: 0000000000000001 R09: 0000000000000000
R10: ffff9a23748f7840 R11: 0000000000000001 R12: ffff9a236625e4d4
R13: ffff9a236625dee0 R14: 0000000000001080 R15: 0000000000000008
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007fd410a34ef8 CR3: 00000001416ee001 CR4: 00000000001706f0
Call Trace:
mt7601u_tx_status+0x3e/0xa0 [mt7601u]
mt7601u_dma_cleanup+0xca/0x110 [mt7601u]
mt7601u_cleanup+0x22/0x30 [mt7601u]
mt7601u_disconnect+0x22/0x60 [mt7601u]
usb_unbind_interface+0x8a/0x270
? kernfs_find_ns+0x35/0xd0
__device_release_driver+0x17a/0x230
device_release_driver+0x24/0x30
bus_remove_device+0xdb/0x140
device_del+0x18b/0x430
? kobject_put+0x98/0x1d0
usb_disable_device+0xc6/0x1f0
usb_disconnect.cold+0x7e/0x20a
hub_event+0xbf3/0x1870
process_one_work+0x1b6/0x350
worker_thread+0x53/0x3e0
? process_one_work+0x350/0x350
kthread+0x11b/0x140
? __kthread_bind_mask+0x60/0x60
ret_from_fork+0x22/0x30

Fixes: 23377c200b2eb ("mt7601u: fix possible memory leak when the device is disconnected")
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
drivers/net/wireless/mediatek/mt7601u/dma.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt7601u/dma.c b/drivers/net/wireless/mediatek/mt7601u/dma.c
index 47710da5b2a5..af7d1ecb777c 100644
--- a/drivers/net/wireless/mediatek/mt7601u/dma.c
+++ b/drivers/net/wireless/mediatek/mt7601u/dma.c
@@ -309,7 +309,6 @@ static int mt7601u_dma_submit_tx(struct mt7601u_dev *dev,
}

e = &q->e[q->end];
- e->skb = skb;
usb_fill_bulk_urb(e->urb, usb_dev, snd_pipe, skb->data, skb->len,
mt7601u_complete_tx, q);
ret = usb_submit_urb(e->urb, GFP_ATOMIC);
@@ -327,6 +326,7 @@ static int mt7601u_dma_submit_tx(struct mt7601u_dev *dev,

q->end = (q->end + 1) % q->entries;
q->used++;
+ e->skb = skb;

if (q->used >= q->entries)
ieee80211_stop_queue(dev->hw, skb_get_queue_mapping(skb));
--
2.29.2


2021-01-18 18:18:06

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH wireless-drivers] mt7601u: fix kernel crash unplugging the device

On Sun, 17 Jan 2021 22:46:01 +0100 Lorenzo Bianconi wrote:
> Fix the following kernel crash unplugging the usb dongle
>
> [...]
>
> Fixes: 23377c200b2eb ("mt7601u: fix possible memory leak when the device is disconnected")
> Signed-off-by: Lorenzo Bianconi <[email protected]>

A few words of explanation beyond the stack trace without line info
would perhaps make the review quicker..

Acked-by: Jakub Kicinski <[email protected]>

2021-01-19 05:36:50

by Lorenzo Bianconi

[permalink] [raw]
Subject: Re: [PATCH wireless-drivers] mt7601u: fix kernel crash unplugging the device

> On Sun, 17 Jan 2021 22:46:01 +0100 Lorenzo Bianconi wrote:
> > Fix the following kernel crash unplugging the usb dongle
> >
> > [...]
> >
> > Fixes: 23377c200b2eb ("mt7601u: fix possible memory leak when the device is disconnected")
> > Signed-off-by: Lorenzo Bianconi <[email protected]>
>
> A few words of explanation beyond the stack trace without line info
> would perhaps make the review quicker..
>

Hi Jakub,

right, sorry for that. I will add some more info here so Kalle can add
it to the commit log merging the patch.

"
The following crash log can occur unplugging the usb dongle since,
after the urb poison in mt7601u_free_tx_queue(), usb_submit_urb() will
always fail resulting in a skb kfree while the skb has been already
queued.
Fix the issue enqueuing the skb only if usb_submit_urb() succeed.
"

@Kalle: is it ok or do you prefer to resubmit? (sorry for the noise)

Regards,
Lorenzo




>
> Acked-by: Jakub Kicinski <[email protected]>
>

2021-01-19 08:08:48

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH wireless-drivers] mt7601u: fix kernel crash unplugging the device

Lorenzo Bianconi <[email protected]> writes:

>> On Sun, 17 Jan 2021 22:46:01 +0100 Lorenzo Bianconi wrote:
>> > Fix the following kernel crash unplugging the usb dongle
>> >
>> > [...]
>> >
>> > Fixes: 23377c200b2eb ("mt7601u: fix possible memory leak when the device is disconnected")
>> > Signed-off-by: Lorenzo Bianconi <[email protected]>
>>
>> A few words of explanation beyond the stack trace without line info
>> would perhaps make the review quicker..
>>
>
> Hi Jakub,
>
> right, sorry for that. I will add some more info here so Kalle can add
> it to the commit log merging the patch.
>
> "
> The following crash log can occur unplugging the usb dongle since,
> after the urb poison in mt7601u_free_tx_queue(), usb_submit_urb() will
> always fail resulting in a skb kfree while the skb has been already
> queued.
> Fix the issue enqueuing the skb only if usb_submit_urb() succeed.
> "
>
> @Kalle: is it ok or do you prefer to resubmit? (sorry for the noise)

This is ok, no need to resend. I have an edit command in my patchwork
script :)

--
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

2021-01-26 03:02:08

by Kalle Valo

[permalink] [raw]
Subject: Re: [wireless-drivers] mt7601u: fix kernel crash unplugging the device

Lorenzo Bianconi <[email protected]> wrote:

> The following crash log can occur unplugging the usb dongle since,
> after the urb poison in mt7601u_free_tx_queue(), usb_submit_urb() will
> always fail resulting in a skb kfree while the skb has been already
> queued.
>
> Fix the issue enqueuing the skb only if usb_submit_urb() succeed.
>
> Hardware name: Hewlett-Packard 500-539ng/2B2C, BIOS 80.06 04/01/2015
> Workqueue: usb_hub_wq hub_event
> RIP: 0010:skb_trim+0x2c/0x30
> RSP: 0000:ffffb4c88005bba8 EFLAGS: 00010206
> RAX: 000000004ad483ee RBX: ffff9a236625dee0 RCX: 000000000000662f
> RDX: 000000000000000c RSI: 0000000000000000 RDI: ffff9a2343179300
> RBP: ffff9a2343179300 R08: 0000000000000001 R09: 0000000000000000
> R10: ffff9a23748f7840 R11: 0000000000000001 R12: ffff9a236625e4d4
> R13: ffff9a236625dee0 R14: 0000000000001080 R15: 0000000000000008
> CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 00007fd410a34ef8 CR3: 00000001416ee001 CR4: 00000000001706f0
> Call Trace:
> mt7601u_tx_status+0x3e/0xa0 [mt7601u]
> mt7601u_dma_cleanup+0xca/0x110 [mt7601u]
> mt7601u_cleanup+0x22/0x30 [mt7601u]
> mt7601u_disconnect+0x22/0x60 [mt7601u]
> usb_unbind_interface+0x8a/0x270
> ? kernfs_find_ns+0x35/0xd0
> __device_release_driver+0x17a/0x230
> device_release_driver+0x24/0x30
> bus_remove_device+0xdb/0x140
> device_del+0x18b/0x430
> ? kobject_put+0x98/0x1d0
> usb_disable_device+0xc6/0x1f0
> usb_disconnect.cold+0x7e/0x20a
> hub_event+0xbf3/0x1870
> process_one_work+0x1b6/0x350
> worker_thread+0x53/0x3e0
> ? process_one_work+0x350/0x350
> kthread+0x11b/0x140
> ? __kthread_bind_mask+0x60/0x60
> ret_from_fork+0x22/0x30
>
> Fixes: 23377c200b2eb ("mt7601u: fix possible memory leak when the device is disconnected")
> Signed-off-by: Lorenzo Bianconi <[email protected]>
> Acked-by: Jakub Kicinski <[email protected]>

Patch applied to wireless-drivers.git, thanks.

0acb20a5438c mt7601u: fix kernel crash unplugging the device

--
https://patchwork.kernel.org/project/linux-wireless/patch/3b85219f669a63a8ced1f43686de05915a580489.1610919247.git.lorenzo@kernel.org/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches