From: Jarod Wilson <jwilson@redhat.com>
To: Jonathan Corbet <corbet@lwn.net>
Cc: linux-kernel@vger.kernel.org, Janne Grunau <j@jannau.net>,
Christoph Bartelmus <lirc@bartelmus.de>
Subject: Re: [PATCH 08/18] lirc driver for the Soundgraph IMON IR Receivers
Date: Mon, 22 Sep 2008 17:47:56 -0400 [thread overview]
Message-ID: <200809221747.57170.jwilson@redhat.com> (raw)
In-Reply-To: <20080910150229.2b4f990d@bike.lwn.net>
On Wednesday 10 September 2008 17:02:29 Jonathan Corbet wrote:
> > +#define SUCCESS 0
> > +#define TRUE 1
> > +#define FALSE 0
>
> (See my grumble in previous reviews...:)
>
> > +#define LOCK_CONTEXT mutex_lock(&context->lock)
> > +#define UNLOCK_CONTEXT mutex_unlock(&context->lock)
>
> Here too.
All gone.
> > +/* to prevent races between open() and disconnect() */
> > +static DECLARE_MUTEX(disconnect_sem);
>
> This should be a real mutex, I think.
Done.
> > +/* lcd or vfd? */
> > +static int is_lcd;
>
> The driver can only do one or the other? You can't have both in the
> system? And somehow the user is supposed to configure it at load time to
> do the right thing?
Should be autodetected by default now, based on usb device ID, but can still
be overridden by a module para 'display_type'. Not sure exactly what would
happen if the user had more than one, but I don't know why they would in the
first place...
> > +static inline int send_packet(struct imon_context *context)
[...]
> > + /* fill request into kmalloc'ed space: */
> > + control_req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
>
> Why GFP_NOIO?
Original author probably thought it was necessary. Certainly doesn't look like
it is to me, I'll make that just GFP_KERNEL.
> > + } else {
> > + /* Wait for tranmission to complete(or abort) */
> > + UNLOCK_CONTEXT;
> > + wait_for_completion(&context->tx.finished);
> > + LOCK_CONTEXT;
>
> Should that be an interruptible (or killable) wait?
Don't see why it couldn't be. Done.
> > +static ssize_t show_associate_remote(struct device *d,
> > + struct device_attribute *attr,
> > + char *buf)
> > +{
> > + struct imon_context *context = dev_get_drvdata(d);
> > +
> > + if (!context)
> > + return -ENODEV;
> > +
> > + if (context->ir_isassociating) {
> > + strcpy(buf, "The device it associating press some button "
> > + "on the remote.\n");
> > + } else if (context->ir_isopen) {
> > + strcpy(buf, "Device is open and ready to associate.\n"
> > + "Echo something into this file to start "
> > + "the process.\n");
> > + } else {
> > + strcpy(buf, "Device is closed, you need to open it to "
> > + "associate the remote(you can use irw).\n");
> > + }
> > + return strlen(buf);
> > +}
>
> I *guess* that's one value per file, but it's still not quite the sysfs
> norm. How about one-word status codes which can be made more verbose by
> user space? (That's an API change, of course...)
Yuk. There really is no user space. But chances of someone stumbling upon
these directions in sysfs are pretty slim. Reducing to single-word, and
logging a url pointer to the lirc.org page on setting these up. Sound sane
enough?
> > +static ssize_t store_associate_remote(struct device *d,
> > + struct device_attribute *attr,
> > + const char *buf, size_t count)
> > +{
> > + struct imon_context *context;
> > +
> > + context = dev_get_drvdata(d);
> > +
> > + if (!context)
> > + return -ENODEV;
> > +
> > + if (!context->ir_isopen)
> > + return -EINVAL;
> > +
> > + if (context->ir_isopen) {
> > + context->ir_isassociating = TRUE;
> > + send_associate_24g(context);
> > + }
> > +
> > + return count;
> > +}
>
> No need to take the mutex here?
Added mutex here and in show_associate_remote() for good measure.
> > +/**
> > + * Called by lirc_dev when the application opens /dev/lirc
> > + */
> > +static int ir_open(void *data)
> > +{
> > + int retval = SUCCESS;
> > + struct imon_context *context;
> > +
> > + /* prevent races with disconnect */
> > + down(&disconnect_sem);
> > +
> > + context = (struct imon_context *) data;
> > +
> > + LOCK_CONTEXT;
> > +
> > + if (context->ir_isopen) {
> > + err("%s: IR port is already open", __func__);
> > + retval = -EBUSY;
> > + goto exit;
> > + }
>
> I wonder if the single-open semantics are really doing what the author
> intended? It is unsufficient to prevent concurrent calls elsewhere.
I think we're good to go with disconnect_sem being converted to an actual
mutex, no?
> > +exit:
> > + UNLOCK_CONTEXT;
> > +
> > + up(&disconnect_sem);
> > + return SUCCESS;
> > +}
>
> This discards "retval", which could hold an error status - the function
> returns "SUCCESS" even if ->ir_isopen is not set.
Gah. That's fugly. Fixed.
> > +static void imon_disconnect(struct usb_interface *interface)
[...]
> > + /* Abort ongoing write */
> > + if (atomic_read(&context->tx.busy)) {
> > + usb_kill_urb(context->tx_urb);
> > + wait_for_completion(&context->tx.finished);
> > + }
>
> What if this races with another thread waiting for the completion? It
> seems like it should be completed with complete_all(), but that wasn't the
> case.
Agreed. At this point, we're disconnecting, no point in waiting on anyone
else.
I've attempted to remedy everything, compile-tested and briefly run-time
tested the changes, and have pushed 'em all into my git tree. My shiny new
iMon Knob receiver and remote are reasonably happy still (less some lockdep
spew that I have to figure out what to do with still), but I have no vfd or
lcd to test with, unfortunately.
--
Jarod Wilson
jarod@redhat.com
next prev parent reply other threads:[~2008-09-22 21:48 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-09 4:05 [PATCH 0/18] linux infrared remote control drivers Jarod Wilson
2008-09-09 4:05 ` [PATCH 01/18] lirc core device driver infrastructure Jarod Wilson
2008-09-09 4:05 ` [PATCH 02/18] lirc serial port receiver/transmitter device driver Jarod Wilson
2008-09-09 4:05 ` [PATCH 03/18] lirc driver for 1st-gen Media Center Ed. USB IR transceivers Jarod Wilson
2008-09-09 4:05 ` [PATCH 04/18] lirc driver for 2nd-gen and later " Jarod Wilson
2008-09-09 4:05 ` [PATCH 05/18] lirc driver for i2c-based IR receivers Jarod Wilson
2008-09-09 4:05 ` [PATCH 06/18] lirc driver for the ATI USB RF remote receiver Jarod Wilson
2008-09-09 4:05 ` [PATCH 07/18] lirc driver for the CommandIR USB Transceiver Jarod Wilson
2008-09-09 4:05 ` [PATCH 08/18] lirc driver for the Soundgraph IMON IR Receivers Jarod Wilson
2008-09-09 4:05 ` [PATCH 09/18] lirc driver for the Streamzap PC Receiver Jarod Wilson
2008-09-09 4:05 ` [PATCH 10/18] lirc driver for Igor Cesko's USB IR receiver Jarod Wilson
2008-09-09 4:05 ` [PATCH 11/18] lirc driver for the Technotrend " Jarod Wilson
2008-09-09 4:05 ` [PATCH 12/18] lirc driver for the Sasem OnAir and Dign HV5 receivers Jarod Wilson
2008-09-09 4:05 ` [PATCH 13/18] lirc driver for ITE8709 CIR port receiver Jarod Wilson
2008-09-09 4:05 ` [PATCH 14/18] lirc driver for the ITE IT87xx CIR Port receivers Jarod Wilson
2008-09-09 4:06 ` [PATCH 15/18] lirc driver for the SIR IrDA port Jarod Wilson
2008-09-09 4:06 ` [PATCH 16/18] lirc driver for the IR interface on BT829-based hardware Jarod Wilson
2008-09-09 4:06 ` [PATCH 17/18] lirc driver for homebrew parallel port receivers Jarod Wilson
2008-09-09 4:06 ` [PATCH 18/18] lirc driver for the zilog/haupauge IR transceiver Jarod Wilson
2008-09-09 4:06 ` Jarod Wilson
2008-09-11 15:22 ` [PATCH 09/18] lirc driver for the Streamzap PC Receiver Jonathan Corbet
2008-09-10 21:02 ` [PATCH 08/18] lirc driver for the Soundgraph IMON IR Receivers Jonathan Corbet
2008-09-10 21:23 ` Janne Grunau
2008-09-11 3:22 ` Jarod Wilson
2008-09-22 21:47 ` Jarod Wilson [this message]
2008-09-24 20:21 ` Jarod Wilson
2008-09-10 17:09 ` [PATCH 07/18] lirc driver for the CommandIR USB Transceiver Jonathan Corbet
2008-09-11 18:24 ` Christoph Bartelmus
[not found] ` <1221159005.13683.34.camel@minimatt>
2008-09-11 19:03 ` Jarod Wilson
2008-09-11 19:14 ` Janne Grunau
2008-09-25 15:21 ` Jarod Wilson
2008-09-10 9:58 ` [PATCH 06/18] lirc driver for the ATI USB RF remote receiver Ville Syrjälä
2008-09-10 13:05 ` Jarod Wilson
2008-09-10 13:14 ` Christoph Hellwig
2008-09-10 13:37 ` Jon Smirl
2008-09-10 14:30 ` Dmitry Torokhov
2008-09-10 13:44 ` Janne Grunau
2008-09-10 14:13 ` Jarod Wilson
2008-09-10 14:19 ` Christoph Hellwig
2008-09-10 14:08 ` Ville Syrjälä
2008-09-10 14:37 ` Dmitry Torokhov
2008-09-09 4:13 ` [PATCH 05/18] lirc driver for i2c-based IR receivers Jarod Wilson
2008-09-10 15:42 ` Jonathan Corbet
2008-09-09 23:30 ` [PATCH 04/18] lirc driver for 2nd-gen and later Media Center Ed. USB IR transceivers Jonathan Corbet
2008-09-10 0:36 ` Janne Grunau
2008-09-11 9:21 ` Adrian Bunk
2008-09-09 19:21 ` [PATCH 03/18] lirc driver for 1st-gen " Jonathan Corbet
2008-09-09 23:59 ` Janne Grunau
2008-09-10 1:39 ` Jarod Wilson
2008-09-10 0:04 ` Janne Grunau
2008-09-09 16:14 ` [PATCH 02/18] lirc serial port receiver/transmitter device driver Jonathan Corbet
2008-09-09 19:51 ` Stefan Lippers-Hollmann
2008-09-09 19:56 ` Jarod Wilson
2008-09-10 17:40 ` Jarod Wilson
2008-09-09 7:40 ` [PATCH 01/18] lirc core device driver infrastructure Sebastian Siewior
2008-09-09 9:53 ` Janne Grunau
2008-09-09 12:33 ` Sebastian Siewior
2008-09-09 13:10 ` Janne Grunau
2008-09-11 16:41 ` Christoph Bartelmus
2008-09-09 11:13 ` Alan Cox
2008-09-09 13:27 ` Stefan Richter
2008-09-09 17:03 ` Jarod Wilson
2008-09-11 18:30 ` Christoph Bartelmus
2008-09-11 19:09 ` Jarod Wilson
2008-09-13 7:21 ` Christoph Bartelmus
2008-09-09 9:46 ` Andi Kleen
2008-09-09 11:35 ` Janne Grunau
2008-09-09 13:03 ` Andi Kleen
2008-09-09 13:20 ` Janne Grunau
2008-09-12 16:46 ` Greg KH
2008-09-09 13:01 ` Christoph Hellwig
2008-09-10 12:24 ` Janne Grunau
2008-09-10 12:29 ` Christoph Hellwig
2008-09-10 12:45 ` Janne Grunau
2008-09-11 18:03 ` Christoph Bartelmus
2008-09-11 19:18 ` Janne Grunau
2008-09-12 0:16 ` Janne Grunau
2008-09-12 8:33 ` Christoph Hellwig
2008-09-12 14:51 ` Jarod Wilson
2008-09-09 15:33 ` Jonathan Corbet
2008-09-12 0:12 ` Janne Grunau
2008-09-10 13:08 ` Dmitry Torokhov
2008-09-11 8:47 ` Gerd Hoffmann
2008-09-11 21:28 ` Maxim Levitsky
2008-09-13 7:20 ` Christoph Bartelmus
2008-09-12 4:44 ` Dmitry Torokhov
2008-09-09 4:36 ` [PATCH 0/18] linux infrared remote control drivers Chris Wedgwood
2008-09-09 7:06 ` Alexey Dobriyan
2008-09-09 8:32 ` Janne Grunau
2008-09-09 12:46 ` Christoph Hellwig
2008-09-09 15:23 ` Jarod Wilson
2008-09-09 18:27 ` Lennart Sorensen
2008-09-09 18:34 ` Jarod Wilson
2008-09-09 15:34 ` Jon Smirl
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=200809221747.57170.jwilson@redhat.com \
--to=jwilson@redhat.com \
--cc=corbet@lwn.net \
--cc=j@jannau.net \
--cc=linux-kernel@vger.kernel.org \
--cc=lirc@bartelmus.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