All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johan Hedberg <johan.hedberg@gmail.com>
To: Marcel Holtmann <marcel@holtmann.org>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCH 02/12 v3] Bluetooth: Add basic start/complete HCI transaction functions
Date: Mon, 18 Feb 2013 09:43:29 +0200	[thread overview]
Message-ID: <20130218074329.GA17232@x220> (raw)
In-Reply-To: <1361053056.1583.4.camel@aeonflux>

Hi Marcel,

On Sat, Feb 16, 2013, Marcel Holtmann wrote:
> > +int hci_start_transaction(struct hci_dev *hdev)
> > +{
> > +	struct hci_transaction *transaction;
> > +	int err;
> > +
> > +	hci_transaction_lock(hdev);
> > +
> > +	/* We can't start a new transaction if there's another one in
> > +	 * progress of being built.
> > +	 */
> > +	if (hdev->build_transaction) {
> > +		err = -EBUSY;
> > +		goto unlock;
> > +	}
> 
> I do not get this part. Why not use a common mutex on
> hci_start_transaction and have it close with hci_complete_transaction.
> 
> This sounds more like a double protection.
> 
> > +
> > +	transaction = kzalloc(sizeof(*transaction), GFP_KERNEL);
> > +	if (!transaction) {
> > +		err = -ENOMEM;
> > +		goto unlock;
> > +	}
> > +
> > +	skb_queue_head_init(&transaction->cmd_q);
> > +
> > +	hdev->build_transaction = transaction;
> > +
> 
> I am bit confused with this build_transaction concept. So we are
> expecting to build transaction inside the same function. Meaning that
> start and complete functions will be called in the same context.
> 
> Maybe some concept of DECLARE_TRANSACTION declaring a local variable and
> then start and complete transaction would be better.

Both of the above two issues are related to the desire to not have to
introduce a new function next to hci_send_cmd() (that would take this
local variable "context") and to be able to keep all current
hci_send_cmd() calls as they are.

In my initial iteration of the patch set I did have the kind of locking
you describe, but keeping the requirement for hci_send_cmd() like I
stated means that you'll then either end up having a potential race
or a deadlock inside the function since sometimes you're entering with
the transaction lock held (when using begin/finish transaction) and
sometimes without the lock held (all existing calls to hci_send_cmd().

So what we're dealing with here is trading less complexity in all our
hci_send_cmd() callers (not having to pass around this extra context)
for slightly more complexity inside the hci_send_cmd() function, which I
maintain is less complexity than removing it would introduce elsewhere,
basically this:

       hci_transaction_lock(hdev);

        /* If this is part of a multi-command transaction (i.e.
         * hci_start_transaction() has been called) just add the skb to
         * the end of the transaction being built.
         */
        if (hdev->build_transaction) {
                skb_queue_tail(&hdev->build_transaction->cmd_q, skb);
                goto unlock;
        }

        /* If we're in the middle of a hci_request the req lock will be
         * held and our only choice is to append to the request
         * transaction.
         */
        if (hdev->req_status && hdev->current_transaction) {
                skb_queue_tail(&hdev->current_transaction->cmd_q, skb);
                goto unlock;
        }

        /* This is neither a multi-command transaction nor a hci_request
         * situation, but simply hci_send_cmd being called without any
         * existing context. Create a simple one-command transaction out
         * of the skb
         */
        err = __transaction_from_skb(hdev, skb);
        if (err < 0)
                kfree_skb(skb);

unlock:
        hci_transaction_unlock(hdev);


> On that topic using begin_transaction and finish_transaction sounds a
> bit more appealing. Or even run_transaction instead of finish.

begin/run sounds fine to me.

Johan

  reply	other threads:[~2013-02-18  7:43 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-15  9:51 [PATCH 00/12 v3] Bluetooth: Asynchronous HCI transaction API Johan Hedberg
2013-02-15  9:51 ` [PATCH 01/12 v3] Bluetooth: Add initial hooks for HCI transaction support Johan Hedberg
2013-02-15  9:51 ` [PATCH 02/12 v3] Bluetooth: Add basic start/complete HCI transaction functions Johan Hedberg
2013-02-16 22:17   ` Marcel Holtmann
2013-02-18  7:43     ` Johan Hedberg [this message]
2013-02-18 12:47       ` Marcel Holtmann
2013-02-15  9:51 ` [PATCH 03/12 v3] Bluetooth: Add hci_transaction_cmd_complete function Johan Hedberg
2013-02-16 22:19   ` Marcel Holtmann
2013-02-18  7:46     ` Johan Hedberg
2013-02-15  9:51 ` [PATCH 04/12 v3] Bluetooth: Add hci_transaction_from_skb function Johan Hedberg
2013-02-15  9:51 ` [PATCH 05/12 v3] Bluetooth: Switch from hdev->cmd_q to using transactions Johan Hedberg
2013-02-16 22:22   ` Marcel Holtmann
2013-02-18  7:48     ` Johan Hedberg
2013-02-15  9:51 ` [PATCH 06/12 v3] Bluetooth: Remove unused hdev->cmd_q HCI command queue Johan Hedberg
2013-02-15  9:51 ` [PATCH 07/12 v3] Bluetooth: Fix mgmt powered indication by using a HCI transaction Johan Hedberg
2013-02-19 19:36   ` Andre Guedes
2013-02-15  9:51 ` [PATCH 08/12 v3] Bluetooth: Enable HCI transaction support cmd_status 0 Johan Hedberg
2013-02-15  9:51 ` [PATCH 09/12 v3] Bluetooth: Add HCI init sequence support for HCI transactions Johan Hedberg
2013-02-15  9:51 ` [PATCH 10/12 v3] Bluetooth: Convert hci_request to use " Johan Hedberg
2013-02-15  9:51 ` [PATCH 11/12 v3] Bluetooth: Remove unused hdev->init_last_cmd Johan Hedberg
2013-02-15  9:52 ` [PATCH 12/12 v3] Bluetooth: Remove empty HCI event handlers Johan Hedberg

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=20130218074329.GA17232@x220 \
    --to=johan.hedberg@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=marcel@holtmann.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 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.