From: jeffy <jeffy.chen@rock-chips.com>
To: Oliver Neukum <oliver@neukum.org>, Marcel Holtmann <marcel@holtmann.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
xiyou.wangcong@gmail.com, Brian Norris <briannorris@chromium.org>,
Douglas Anderson <dianders@chromium.org>,
Johan Hedberg <johan.hedberg@gmail.com>,
"Gustavo F. Padovan" <gustavo@padovan.org>
Subject: Re: [RFC PATCH] Bluetooth: btusb: Fix memory leak in play_deferred
Date: Wed, 12 Jul 2017 10:27:04 +0800 [thread overview]
Message-ID: <596588F8.5070402@rock-chips.com> (raw)
In-Reply-To: <1499168300.17946.3.camel@neukum.org>
Hi Oliver,
Thanx for your comments, and sorry for reply late.
On 07/04/2017 07:38 PM, Oliver Neukum wrote:
> Am Freitag, den 23.06.2017, 11:46 +0800 schrieb jeffy:
>>
>>>> ---
>>>>
>>>> drivers/bluetooth/btusb.c | 3 ++-
>>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
>>>> index 278e811..b469f9b 100644
>>>> --- a/drivers/bluetooth/btusb.c
>>>> +++ b/drivers/bluetooth/btusb.c
>>>> @@ -3254,11 +3254,12 @@ static int btusb_suspend(struct usb_interface *intf, pm_message_t message)
>>>>
>>>> static void play_deferred(struct btusb_data *data)
>>>> {
>>>> + struct hci_dev *hdev = data->hdev;
>>>> struct urb *urb;
>>>> int err;
>>>>
>>>> while ((urb = usb_get_from_anchor(&data->deferred))) {
>>>> - err = usb_submit_urb(urb, GFP_ATOMIC);
>>>> + err = submit_tx_urb(hdev, urb);
>
> If you do that you have to change submit_tx_urb() to be called under a
> spinlock.
sorry, why we need that? since submit_tx_urb is basically
usb_anchor_urb/usb_submit_urb/usb_free_urb
>
>>>> if (err < 0)
>>>> break;
>>>
>>> so why not just fix the memory leak here and instead call submit_tx_urb. I am not sure that is actually the right approach. Why anchor this URB now to the TX anchor now? Is that actually safe?
>>>
>> the current flow is:
>> submit_or_queue_tx_urb
>> if (!suspending)
>> submit_tx_urb
>> else
>> put into deferred anchor
>> wake btusb
>>
>> retry the deferred urbs in deferred anchor(using usb_submit_urb)
>> after resumed
>>
>> so i think there are 2 problems here:
>> 1/ error handling, compare submit_tx_urb to usb_submit_urb, it freed
>> urb->setup_packet when failed to submit
>
> In theory yes. If we ever put control URBs on the deferred anchor.
>
>> 2/ memory leak:
>> in usb_submit_urb, we ref that urb
>> in __usb_hcd_giveback_urb, we unanchor it, and then unref it.
>>
>> so i think the usb_submit_urb expected the urb not just be referenced,
>> but also anchored?
>
> It expects that in the sense that it reacts to anchorings, but they are
> not required.
>
>> or referenced, but the caller would unref it himself
>> later?
>
> The caller is responsible for its own references.
hmm, maybe unref it in the complete callback(btusb_tx_complete?), and if
we do so, we may need to detect which urb came from here...
>
>> and for tx_anchor, we put urb in it, and kill them all during suspending
>> to prevent transfer. so i guess it would be safe to put deferred urb in
>> to it after resume too?
>> but i don't know much about usb/btusb, so i could be wrong all about that :)
>
> IIRC the reason for directly submitting them was the spinlock.
sorry, i'm not clear about this, could you help to explain more? do you
mean txlock?
the current play_deferred is called under txlock locked, and
submit_tx_urb not:
spin_lock_irq(&data->txlock);
play_deferred(data);
clear_bit(BTUSB_SUSPENDING, &data->flags);
spin_unlock_irq(&data->txlock);
spin_unlock_irqrestore(&data->txlock, flags);
if (!suspending)
return submit_tx_urb(hdev, urb);
>
> Regards
> Oliver
>
>
>
>
next prev parent reply other threads:[~2017-07-12 2:27 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-22 10:10 [RFC PATCH] Bluetooth: btusb: Fix memory leak in play_deferred Jeffy Chen
2017-06-22 10:21 ` Marcel Holtmann
2017-06-23 3:46 ` jeffy
[not found] ` <1499168300.17946.3.camel@neukum.org>
2017-07-12 2:27 ` jeffy [this message]
2017-07-17 15:26 ` Oliver Neukum
2017-07-18 2:16 ` jeffy
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=596588F8.5070402@rock-chips.com \
--to=jeffy.chen@rock-chips.com \
--cc=briannorris@chromium.org \
--cc=dianders@chromium.org \
--cc=gustavo@padovan.org \
--cc=johan.hedberg@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=marcel@holtmann.org \
--cc=oliver@neukum.org \
--cc=xiyou.wangcong@gmail.com \
/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.