public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
From: Mat Martineau <mathewm@codeaurora.org>
To: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
Cc: linux-bluetooth@vger.kernel.org, pkrystad@codeaurora.org,
	marcel@holtmann.org
Subject: Re: [PATCHv1 01/17] Bluetooth: A2MP: Create A2MP channel
Date: Fri, 25 May 2012 10:18:20 -0700 (PDT)	[thread overview]
Message-ID: <alpine.DEB.2.02.1205250918520.2070@mathewm-linux> (raw)
In-Reply-To: <20120525080904.GF3089@aemeltch-MOBL1>


Andrei -

On Fri, 25 May 2012, Andrei Emeltchenko wrote:

> Hi Mat,
>
> On Thu, May 24, 2012 at 08:59:57AM -0700, Mat Martineau wrote:
>> On Thu, 24 May 2012, Andrei Emeltchenko wrote:
>>> On Wed, May 23, 2012 at 08:44:22AM -0700, Mat Martineau wrote:
>>>>>>> +static struct l2cap_chan *a2mp_chan_open(struct l2cap_conn *conn)
>>>>>>> +{
>>>>>>> +	struct l2cap_chan *chan;
>>>>>>> +
>>>>>>> +	chan = l2cap_chan_create();
>>>>>>> +	if (!chan)
>>>>>>> +		return NULL;
>>>>>>> +
>>>>>>> +	BT_DBG("chan %p", chan);
>>>>>>> +
>>>>>>> +	hci_conn_hold(conn->hcon);
>>>>>>
>>>>>> Holding the hcon will keep the ACL open after all of the other L2CAP
>>>>>> channels have closed (unless I missed some code later in the patch
>>>>>> series).  The A2MP fixed channel should not keep the ACL open.  If
>>>>>> the connection is not held here, then there shouldn't be a put in
>>>>>> l2cap_chan_del for the A2MP channel either.
>>>>>
>>>>> l2cap_chan_del makes hci_conn_put, also for a2mp channel. The behavior is
>>>>> the same for fixed and normal channels.
>>>>
>>>> And when does l2cap_chan_del get called for a fixed channel?  The
>>>> fixed channel must not do an hci_conn_hold so the ACL is allowed to
>>>> close when all dynamic L2CAP channels have closed.
>>>
>>> The current approach is to have amp_mgr for hci_conn. It will be freed
>>> when in hci_conn_del together with other l2cap channels in
>>> hci_chan_list_flush and then we make amp_mgr_put() and destroy mgr.
>>>
>>> The idea is to make a2mp chan similar to other chans and other chans do
>>> hci_conn_hold and hci_conn_put. Otherwise I would need to add extra checks
>>> before hci_conn_put which is ugly.
>>>
>>> I've tested this with PTS and no memory leaks found so far.
>>
>> The risk is not memory leaks - if the other device closes the ACL,
>> then the A2MP channel will be cleaned up.  But if you had two BlueZ
>> devices with A2MP connected to each other, the ACL would never close
>> as long as the devices remained powered and in range!  Nothing would
>> trigger the flush as long as the hci_conn is held.
>
> Does it indicate that we have problem with rather freeing amp_mgr?

It looks like the amp_mgr will be freed if the channel is closed. 
There's nothing that will close the channel except for:

* Remote device disconnects the ACL
* Remote device goes out of range
* Local BR/EDR controller is powered down or reset

>> I think the checks for hci_conn_put are necessary, even if they are
>> ugly.
>
> I think that if I have hci_conn_hold when creating channel and
> hci_conn_put when closing channel that does not differ from the case when
> I do not have hci_conn_put/hold.

If there was something that closed the A2MP channel, there would be no 
difference.  But nothing closes the A2MP channel.

> So you are probably referring to the case when hci_conn needs to be closed
> but cannot because it has hci_conn_hold in a2mp channel?

Yes.

> This also means that we still have L2CAP channel (a2mp) hanging.
> This seems right to me if I did not miss something.

Since A2MP is a fixed channel, it is not opened and closed like 
typical L2CAP channels.  Consider this scenario:

1. Remote device decides to connect
2. ACL is created
3. Remote device sends A2MP discover
4. A2MP channel is set up, AMP manager is created, hci_conn_hold for 
A2MP channel
5. Remote device connects L2CAP channel over BR/EDR.  hci_conn_hold 
for the data channel
6. A2MP communication to set up physical link
7. L2CAP channel move to AMP controller
8. Data sent over AMP.
9. L2CAP channel disconnected, hci_conn_put for the data channel
10. Device stays in range.  hci_conn reference count is not 0, so ACL 
is not closed.

If you reach step 10 and both sides are BlueZ, the ACL stays active 
and BT is using extra power.

If you did not do the hci_conn_hold in step 4, the ACL would be 
disconnected 2 seconds after step 9, allowing the BR/EDR baseband to 
go in to a low power state.

--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum

  reply	other threads:[~2012-05-25 17:18 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-18 14:25 [PATCHv1 00/17] Bluetooth A2MP implementation Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 01/17] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-22 17:45   ` Mat Martineau
2012-05-23  7:49     ` Andrei Emeltchenko
2012-05-23 15:44       ` Mat Martineau
2012-05-24  7:51         ` Andrei Emeltchenko
2012-05-24 15:59           ` Mat Martineau
2012-05-25  8:09             ` Andrei Emeltchenko
2012-05-25 17:18               ` Mat Martineau [this message]
2012-05-28  7:24                 ` Andrei Emeltchenko
2012-05-28 13:59                   ` Andrei Emeltchenko
2012-05-29 16:23                     ` Mat Martineau
2012-05-30 13:29                       ` Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 02/17] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 03/17] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 04/17] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 05/17] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 06/17] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 07/17] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 08/17] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 09/17] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 10/17] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 11/17] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 12/17] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 13/17] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 14/17] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 15/17] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 16/17] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-21 22:28   ` Mat Martineau
2012-05-22  8:12     ` Andrei Emeltchenko
2012-05-22 17:35       ` Mat Martineau
2012-05-18 14:25 ` [PATCHv1 17/17] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-21 22:45   ` Mat Martineau
2012-05-22  7:37     ` Andrei Emeltchenko
2012-05-22 17:38       ` Mat Martineau
2012-05-18 20:57 ` [PATCHv1 00/17] Bluetooth A2MP implementation Gustavo Padovan
2012-05-23 15:37 ` [PATCHv2 00/19] " Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 01/19] Bluetooth: Add unlink to L2CAP channel ops Andrei Emeltchenko
2012-05-23 23:13     ` Mat Martineau
2012-05-23 15:37   ` [PATCHv2 02/19] Bluetooth: Add ready " Andrei Emeltchenko
2012-05-23 23:16     ` Mat Martineau
2012-05-24  7:59       ` Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 03/19] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 04/19] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 05/19] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 06/19] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 07/19] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 08/19] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 09/19] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 10/19] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 11/19] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 12/19] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 13/19] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 14/19] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 15/19] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 16/19] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 17/19] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 18/19] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 19/19] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-23 23:30     ` Mat Martineau
2012-05-24 11:43       ` Andrei Emeltchenko
2012-05-24 11:38 ` [PATCHv3 00/18] Bluetooth A2MP implementation Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 01/18] Bluetooth: Add ready to L2CAP channel ops Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 02/18] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 03/18] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 04/18] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 05/18] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-25 12:20     ` Gustavo Padovan
2012-05-25 13:08       ` Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 06/18] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 07/18] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 08/18] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 09/18] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 10/18] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-25 12:19     ` Gustavo Padovan
2012-05-25 13:11       ` Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 11/18] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-25 12:29     ` Gustavo Padovan
2012-05-24 11:38   ` [PATCHv3 12/18] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 13/18] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 14/18] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 15/18] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 16/18] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 17/18] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 18/18] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-29 10:59 ` [PATCHv4 00/17] Bluetooth A2MP implementation Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 01/17] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 02/17] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 03/17] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 04/17] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 05/17] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 06/17] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 07/17] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 08/17] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 09/17] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 10/17] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 11/17] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 12/17] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 13/17] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 14/17] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 15/17] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 16/17] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 17/17] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-29 15:52     ` Gustavo Padovan

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=alpine.DEB.2.02.1205250918520.2070@mathewm-linux \
    --to=mathewm@codeaurora.org \
    --cc=Andrei.Emeltchenko.news@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=marcel@holtmann.org \
    --cc=pkrystad@codeaurora.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox