From: Kent Gibson <warthog618@gmail.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>,
Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH v2 05/18] gpiolib: cdev: support GPIO_GET_LINE_IOCTL and GPIOLINE_GET_VALUES_IOCTL
Date: Sun, 26 Jul 2020 09:12:44 +0800 [thread overview]
Message-ID: <20200726011244.GA6587@sol> (raw)
In-Reply-To: <CAHp75VcKtATPDKGAViWqjOJDqukDrgZ13aTU6rTJ1jEeB3vmVw@mail.gmail.com>
On Sat, Jul 25, 2020 at 11:51:54PM +0300, Andy Shevchenko wrote:
> On Sat, Jul 25, 2020 at 7:24 AM Kent Gibson <warthog618@gmail.com> wrote:
> >
> > Add support for requesting lines using the GPIO_GET_LINE_IOCTL, and
> > returning their current values using GPIOLINE_GET_VALUES_IOCTL.
>
> ...
>
> > +struct line {
> > + struct gpio_device *gdev;
> > + const char *label;
> > + u32 num_descs;
>
> > + /* descs must be last so it can be dynamically sized */
>
> I guess [] implies above comment and thus comment can be dropped.
>
> > + struct gpio_desc *descs[];
> > +};
>
> ...
>
> > +static bool padding_not_zeroed(__u32 *padding, int pad_size)
> > +{
> > + int i, sum = 0;
> > +
> > + for (i = 0; i < pad_size; i++)
> > + sum |= padding[i];
> > +
> > + return sum;
> > +}
>
> Reimplementation of memchr_inv() ?
>
I was hoping to find an existing function, surely checking a region is
zeroed is a common thing, right?, so this was a place holder as much
as anything. Not sure memchr_inv fits the bill, but I'll give it a
try...
> ...
>
> > +static u64 gpioline_config_flags(struct gpioline_config *lc, int line_idx)
> > +{
> > + int i;
> > +
> > + for (i = lc->num_attrs - 1; i >= 0; i--) {
>
> Much better to read is
>
> unsigned int i = lc->num_attrs;
>
> while (i--) {
> ...
> }
>
Really? I find that the post-decrement in the while makes determining the
bounds of the loop more confusing.
> > + if ((lc->attrs[i].attr.id == GPIOLINE_ATTR_ID_FLAGS) &&
>
> > + test_bit(line_idx, (unsigned long *)lc->attrs[i].mask))
>
> This casting is not good. What about BE 32-bit architecture?
>
I agree the casting is hideous, but I thought the outcome was correct
as it is manipulating addresses, not data.
You think the address of a 64-bit differs based on endian??
Happy to change it - but not sure what to.
> > + return lc->attrs[i].attr.flags;
> > + }
> > + return lc->flags;
> > +}
> > +
> > +static int gpioline_config_output_value(struct gpioline_config *lc,
> > + int line_idx)
> > +{
>
> Same comments as per above.
>
> > +}
>
> ...
>
> > +static long line_get_values(struct line *line, void __user *ip)
> > +{
> > + struct gpioline_values lv;
>
> > + unsigned long *vals = (unsigned long *)lv.bits;
>
> Casting u64 to unsigned long is not good.
>
Same comments as per above.
> > +}
>
> ...
>
> > +static void line_free(struct line *line)
> > +{
> > + int i;
> > +
> > + for (i = 0; i < line->num_descs; i++) {
>
> > + if (line->descs[i])
>
> Redundant?
>
Actually, no. The line_free is also used to clean up construction
failures, so the line may be partially constructed. num_descs is set
first, but the descs themselves may have failed to allocate.
And gpiod_free throws a warning if you pass a NULL, hence the extra check here.
> > + gpiod_free(line->descs[i]);
> > + }
> > + kfree(line->label);
> > + put_device(&line->gdev->dev);
> > + kfree(line);
> > +}
>
> ...
>
> > + /* Make sure this is terminated */
> > + linereq.consumer[sizeof(linereq.consumer)-1] = '\0';
> > + if (strlen(linereq.consumer)) {
> > + line->label = kstrdup(linereq.consumer, GFP_KERNEL);
>
> kstrndup() ?
>
That was a cut-and-paste from V1...
> > + if (!line->label) {
> > + ret = -ENOMEM;
> > + goto out_free_line;
> > + }
> > + }
>
... and changing it would result in this logic behaving differently.
You couldn't distinguish between consumer not being set, and
so label not being set, and kstrndup returning NULL due to no mem.
> ...
>
> > + struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset);
>
> I prefer to see this split, but it's minor.
>
> > + if (IS_ERR(desc)) {
> > + ret = PTR_ERR(desc);
> > + goto out_free_line;
> > + }
>
> ...
>
> > + dev_dbg(&gdev->dev, "registered chardev handle for line %d\n",
> > + offset);
>
> Perhaps tracepoint / event?
>
Again, a cut-and-paste from V1, and I have no experience with
tracepoints or events, so I have no opinion on that.
So, yeah - perhaps?
Cheers,
Kent.
next prev parent reply other threads:[~2020-07-26 1:12 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-25 4:19 [PATCH v2 00/18] gpio: cdev: add uAPI V2 Kent Gibson
2020-07-25 4:19 ` [PATCH v2 01/18] gpio: uapi: define GPIO_MAX_NAME_SIZE for array sizes Kent Gibson
2020-07-25 4:19 ` [PATCH v2 02/18] gpio: uapi: define uAPI v2 Kent Gibson
2020-08-04 17:42 ` Bartosz Golaszewski
2020-08-05 5:18 ` Kent Gibson
2020-08-05 17:47 ` Bartosz Golaszewski
2020-08-06 1:03 ` Kent Gibson
2020-08-06 1:15 ` Kent Gibson
2020-08-06 15:53 ` Bartosz Golaszewski
2020-07-25 4:19 ` [PATCH v2 03/18] gpiolib: make cdev a build option Kent Gibson
2020-07-25 20:29 ` Andy Shevchenko
2020-07-26 22:25 ` Linus Walleij
2020-07-27 1:46 ` Kent Gibson
2020-07-27 5:57 ` Kent Gibson
2020-07-27 8:15 ` Linus Walleij
2020-07-25 4:19 ` [PATCH v2 04/18] gpiolib: add build option for CDEV v1 ABI Kent Gibson
2020-07-25 4:19 ` [PATCH v2 05/18] gpiolib: cdev: support GPIO_GET_LINE_IOCTL and GPIOLINE_GET_VALUES_IOCTL Kent Gibson
2020-07-25 20:51 ` Andy Shevchenko
2020-07-26 1:12 ` Kent Gibson [this message]
2020-07-26 3:24 ` Kent Gibson
2020-07-29 2:28 ` Kent Gibson
2020-07-29 8:05 ` Andy Shevchenko
2020-07-29 10:01 ` Kent Gibson
2020-07-31 16:05 ` Bartosz Golaszewski
2020-08-02 3:31 ` Kent Gibson
2020-08-02 9:32 ` Kent Gibson
2020-08-03 19:59 ` Bartosz Golaszewski
2020-08-03 20:02 ` Bartosz Golaszewski
2020-08-03 23:01 ` Kent Gibson
2020-08-04 17:47 ` Bartosz Golaszewski
2020-08-05 3:06 ` Kent Gibson
2020-07-25 4:19 ` [PATCH v2 06/18] gpiolib: cdev: support GPIO_GET_LINEINFO_V2_IOCTL and GPIO_GET_LINEINFO_WATCH_V2_IOCTL Kent Gibson
2020-07-25 4:19 ` [PATCH v2 07/18] gpiolib: cdev: support edge detection for uAPI v2 Kent Gibson
2020-08-04 19:28 ` Bartosz Golaszewski
2020-07-25 4:19 ` [PATCH v2 08/18] gpiolib: cdev: support GPIOLINE_SET_CONFIG_IOCTL Kent Gibson
2020-07-25 4:19 ` [PATCH v2 09/18] gpiolib: cdev: support GPIOLINE_SET_VALUES_IOCTL Kent Gibson
2020-07-25 4:19 ` [PATCH v2 10/18] gpiolib: cdev: support setting debounce Kent Gibson
2020-07-25 4:19 ` [PATCH v2 11/18] gpio: uapi: document uAPI v1 as deprecated Kent Gibson
2020-08-04 19:43 ` Bartosz Golaszewski
2020-07-25 4:19 ` [PATCH v2 12/18] tools: gpio: port lsgpio to v2 uAPI Kent Gibson
2020-07-25 4:19 ` [PATCH v2 13/18] tools: gpio: port gpio-watch " Kent Gibson
2020-07-25 4:19 ` [PATCH v2 14/18] tools: gpio: rename nlines to num_lines Kent Gibson
2020-07-25 4:19 ` [PATCH v2 15/18] tools: gpio: port gpio-hammer to v2 uAPI Kent Gibson
2020-07-25 4:19 ` [PATCH v2 16/18] tools: gpio: port gpio-event-mon " Kent Gibson
2020-07-25 4:19 ` [PATCH v2 17/18] tools: gpio: add debounce support to gpio-event-mon Kent Gibson
2020-07-25 4:19 ` [PATCH v2 18/18] tools: gpio: add multi-line monitoring " Kent Gibson
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=20200726011244.GA6587@sol \
--to=warthog618@gmail.com \
--cc=andy.shevchenko@gmail.com \
--cc=bgolaszewski@baylibre.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).