From: Johan Hovold <johan@kernel.org>
To: Octavian Purdila <octavian.purdila@intel.com>
Cc: Johan Hovold <johan@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Linus Walleij <linus.walleij@linaro.org>,
Alexandre Courbot <gnurou@gmail.com>,
wsa@the-dreams.de, Samuel Ortiz <sameo@linux.intel.com>,
Lee Jones <lee.jones@linaro.org>, Arnd Bergmann <arnd@arndb.de>,
Daniel Baluta <daniel.baluta@intel.com>,
Laurentiu Palcu <laurentiu.palcu@intel.com>,
linux-usb@vger.kernel.org, lkml <linux-kernel@vger.kernel.org>,
"linux-gpio@vger.kernel.org" <linux-gpio@vger.kernel.org>,
linux-i2c@vger.kernel.org
Subject: Re: [PATCH v5 1/4] mfd: add support for Diolan DLN-2 devices
Date: Wed, 24 Sep 2014 15:54:44 +0200 [thread overview]
Message-ID: <20140924135444.GD16198@localhost> (raw)
In-Reply-To: <CAE1zotLu7pN9pC_C+iRwSpMh2iPW5E1CL4RiycLK-jV_FZEfOQ@mail.gmail.com>
On Wed, Sep 24, 2014 at 04:36:22PM +0300, Octavian Purdila wrote:
> On Wed, Sep 24, 2014 at 1:48 PM, Johan Hovold <johan@kernel.org> wrote:
> > On Fri, Sep 19, 2014 at 11:22:42PM +0300, Octavian Purdila wrote:
>
> <snip>
>
> >> + * dln2_dev.mod_rx_slots and then the echo header field to index the
> >> + * slots field and find the receive context for a particular
> >> + * request.
> >> + */
> >> +struct dln2_mod_rx_slots {
> >> + /* RX slots bitmap */
> >> + unsigned long bmap;
> >> +
> >> + /* used to wait for a free RX slot */
> >> + wait_queue_head_t wq;
> >> +
> >> + /* used to wait for an RX operation to complete */
> >> + struct dln2_rx_context slots[DLN2_MAX_RX_SLOTS];
> >> +
> >> + /* device has been disconnected */
> >> + bool disconnected;
> >
> > This belongs in the dln2_dev struct.
> >
> > I think you're overcomplicating the disconnect handling by intertwining
> > it with your slots.
> >
> > Add a lock, an active-transfer counter, a disconnected flag, and a wait
> > queue to struct dln2_dev.
> >
>
> I agree that disconnected is better suited in dln2_dev.
>
> However, I don't think that we need the active-transfer counter and a
> new wait queue. We can simply use the existing waiting queues and the
> implicit alloc_rx_slot()/free_rx_slot() calls to see if we are still
> waiting for I/O.
Just because you can reuse them doesn't mean it's a good idea. By
separating a generic disconnect solution from your custom slot
implementation we get something that is way easier to verify for
correctness and that could also be reused in other drivers.
> <snip>
>
> >> +
> >> +static int _dln2_transfer(struct dln2_dev *dln2, u16 handle, u16 cmd,
> >> + const void *obuf, unsigned obuf_len,
> >> + void *ibuf, unsigned *ibuf_len)
> >> +{
> >> + int ret = 0;
> >> + u16 result;
> >> + int rx_slot;
> >> + unsigned long flags;
> >> + struct dln2_response *rsp;
> >> + struct dln2_rx_context *rxc;
> >> + struct device *dev;
> >> + const int timeout = DLN2_USB_TIMEOUT * HZ / 1000;
> >> + struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle];
> >> +
> >
> > Check the disconnected flag before incrementing the transfer count
> > (while holding the device lock) here. Then decrement counter before
> > returning and wake up an waiters if disconnected below.
> >
> > That is sufficient to implement wait-until-io-has-completed. Anything
> > else you do below and in the helper functions is only to speed things
> > up at disconnect (and can be done without locking the device).
> >
> >> + rx_slot = alloc_rx_slot(rxs);
> >> + if (rx_slot < 0)
> >> + return rx_slot;
> >> +
> >> + dev = &dln2->interface->dev;
> >> +
> >> + ret = dln2_send_wait(dln2, handle, cmd, rx_slot, obuf, obuf_len);
> >> + if (ret < 0) {
> >> + free_rx_slot(dln2, rxs, rx_slot);
> >
> > goto out_free_rx_slot
> >
> >> + dev_err(dev, "USB write failed: %d", ret);
> >> + return ret;
> >> + }
> >> +
> >> + rxc = &rxs->slots[rx_slot];
> >> +
> >> + ret = wait_for_completion_interruptible_timeout(&rxc->done, timeout);
> >> + if (ret <= 0) {
> >> + if (!ret)
> >> + ret = -ETIMEDOUT;
> >> + goto out_free_rx_slot;
> >> + }
> >> +
> >> + spin_lock_irqsave(&rxs->lock, flags);
> >> +
> >> + if (!rxc->urb) {
> >
> > Just check the disconnected flag directly here. Locking not needed (see
> > below).
> >
>
> I think we need the check here for the case when we cancel the
> completion and no response has been received yet. In that case rx->urb
> will be NULL (even if we remove the rx->urb = NULL statement in
> dln2_stop).
But the disconnect flag will also be set and makes it more obvious what
is going on.
[...]
> >> +static void dln2_disconnect(struct usb_interface *interface)
> >> +{
> >> + struct dln2_dev *dln2 = usb_get_intfdata(interface);
> >> +
> >
> > First set the disconnected flag directly here to prevent any new
> > transfers from starting.
> >
> >> + dln2_stop(dln2);
> >
> > Then do all the completions (to speed things up somewhat).
> >
> > Then wait for the transfer counter to reach 0.
> >
> >> + mfd_remove_devices(&interface->dev);
> >> + dln2_free(dln2);
> >> +}
> >> +
>
> As I mentioned above, I don't think we need the transfer counter, we
> can rely on the slots bitmap. Yes, a counter is simpler but it also
> requires adding a new waiting queue and a new lock.
That's really not a big deal. See above.
Johan
next prev parent reply other threads:[~2014-09-24 13:54 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-19 20:22 [PATCH v5 0/4] mfd: add support for Diolan DLN-2 Octavian Purdila
[not found] ` <1411158165-25794-1-git-send-email-octavian.purdila-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-09-19 20:22 ` [PATCH v5 1/4] mfd: add support for Diolan DLN-2 devices Octavian Purdila
[not found] ` <1411158165-25794-2-git-send-email-octavian.purdila-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-09-24 10:48 ` Johan Hovold
2014-09-24 13:36 ` Octavian Purdila
2014-09-24 13:54 ` Johan Hovold [this message]
2014-09-24 14:54 ` Octavian Purdila
2014-09-24 15:07 ` Johan Hovold
2014-09-24 15:22 ` Octavian Purdila
2014-09-25 10:25 ` Octavian Purdila
2014-09-25 10:30 ` Johan Hovold
2014-09-25 10:41 ` Octavian Purdila
2014-09-25 10:43 ` Johan Hovold
2014-09-19 20:22 ` [PATCH v5 4/4] gpio: add support for the Diolan DLN-2 USB GPIO driver Octavian Purdila
2014-09-20 2:48 ` Arnd Bergmann
[not found] ` <201409200448.48180.arnd-r2nGTMty4D4@public.gmane.org>
2014-09-20 6:32 ` Octavian Purdila
2014-09-24 12:39 ` Johan Hovold
2014-09-19 20:22 ` [PATCH v5 2/4] i2c: add support for Diolan DLN-2 USB-I2C adapter Octavian Purdila
2014-09-24 10:58 ` Johan Hovold
2014-09-19 20:22 ` [PATCH v5 3/4] gpiolib: add irq_not_threaded flag to gpio_chip Octavian Purdila
2014-09-24 8:54 ` Linus Walleij
2014-09-24 11:01 ` Johan Hovold
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=20140924135444.GD16198@localhost \
--to=johan@kernel.org \
--cc=arnd@arndb.de \
--cc=daniel.baluta@intel.com \
--cc=gnurou@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=laurentiu.palcu@intel.com \
--cc=lee.jones@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=octavian.purdila@intel.com \
--cc=sameo@linux.intel.com \
--cc=wsa@the-dreams.de \
/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;
as well as URLs for NNTP newsgroup(s).