linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kent Gibson <warthog618@gmail.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>,
	Linus Walleij <linus.walleij@linaro.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH v9 11/20] gpiolib: cdev: support GPIO_V2_LINE_SET_VALUES_IOCTL
Date: Fri, 25 Sep 2020 20:16:18 +0800	[thread overview]
Message-ID: <20200925121618.GA218526@sol> (raw)
In-Reply-To: <CAHp75VegFMMmVx42gWk3cWa4jc3zuBzD_01Kqes1gq-68y3XgQ@mail.gmail.com>

On Fri, Sep 25, 2020 at 12:57:59PM +0300, Andy Shevchenko wrote:
> On Thu, Sep 24, 2020 at 3:46 PM Kent Gibson <warthog618@gmail.com> wrote:
> > On Thu, Sep 24, 2020 at 03:32:48PM +0800, Kent Gibson wrote:
> > > On Wed, Sep 23, 2020 at 07:18:08PM +0300, Andy Shevchenko wrote:
> > > > On Tue, Sep 22, 2020 at 5:36 AM Kent Gibson <warthog618@gmail.com> wrote:
> > > > >
> > > > > Add support for the GPIO_V2_LINE_SET_VALUES_IOCTL.
> > > >
> > > > > +static long linereq_set_values_unlocked(struct linereq *lr,
> > > > > +                                       struct gpio_v2_line_values *lv)
> > > > > +{
> > > > > +       DECLARE_BITMAP(vals, GPIO_V2_LINES_MAX);
> > > > > +       struct gpio_desc **descs;
> > > > > +       unsigned int i, didx, num_set;
> > > > > +       int ret;
> > > > > +
> > > > > +       bitmap_zero(vals, GPIO_V2_LINES_MAX);
> > > > > +       for (num_set = 0, i = 0; i < lr->num_lines; i++) {
> > > > > +               if (lv->mask & BIT_ULL(i)) {
> > > >
> > > > Similar idea
> > > >
> > > > DECLARE_BITMAP(mask, 64) = BITMAP_FROM_U64(lv->mask);
> > > >
> > > > num_set = bitmap_weight();
> > > >
> > >
> > > I had played with this option, but bitmap_weight() counts all
> > > the bits set in the mask - which considers bits >= lr->num_lines.
> > > So you would need to mask lv->mask before converting it to a bitmap.
> > > (I'm ok with ignoring those bits in case userspace wants to be lazy and
> > > use an all 1s mask.)
> > >
> > > But since we're looping over the bitmap anyway we may as well just
> > > count as we go.
> > >
> > > > for_each_set_bit(i, mask, lr->num_lines)
> > > >
> > >
> > > Yeah, that should work.  I vaguely recall trying this and finding it
> > > generated larger object code, but I'll give it another try and if it
> > > works out then include it in v10.
> > >
> >
> > Tried it again and, while it works, it does increase the size of
> > gpiolib-cdev.o as follows:
> >
> >           u64   ->   bitmap
> > x86_64   28360       28616
> > i386     22056       22100
> > aarch64  37392       37600
> > mips32   28008       28016
> 
> Yes, that's pity... See below.
> 
> > So for 64-bit platforms changing to bitmap generates larger code,
> > probably as we are forcing them to use 32-bit array semantics where
> > before they could use the native u64.  For 32-bit there is a much
> > smaller difference as they were already using 32-bit array semantics
> > to realise the u64.
> >
> > Those are for some of my test builds, so obviously YMMV.
> >
> > It is also only for changing linereq_get_values(), which has three
> > instances of the loop.  linereq_set_values_unlocked() has another two,
> > so you could expect another increase of ~2/3 of that seen here if we
> > change that as well.
> >
> > The sizeable increase in x86_64 was what made me revert this last time,
> > and I'm still satisfied with that choice.  Are you still eager to switch
> > to for_each_set_bit()?
> 
> I already asked once about short cut for for_each_set_bit in case of
> constant nbits parameter when it's <= BITS_PER_LONG, but here it seems
> we have variadic amount of lines, dunno if compiler can prove that
> it's smaller than long. In any case my point is that code readability
> has a preference vs. memory footprint (except hot paths) and if we are
> going to fix this it should be done in general. That said, if
> maintainers are okay with that I would prefer bitmap API over
> open-coded pieces.
> 

Agreed - if the bitmap ops made better use of the architecure then I'd
change to bitmap without question - it is more readable.

Bart and Linus - do you have any preference?

> Also note, that it will be easier to extend in the future if needed
> (if we want to have more than BITS_PER_LONG [64] lines to handle).
> 

Yeah, I think we can rule that one out - while I had initially written
the uAPI with the option of > 64 lines we decided on the hard limit to
keep things simple.  And any user that needs to request more than 64
lines in one request shouldn't be using the GPIO uAPI.

Cheers,
Kent.

  reply	other threads:[~2020-09-25 12:16 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-22  2:31 [PATCH v9 00/20] gpio: cdev: add uAPI v2 Kent Gibson
2020-09-22  2:31 ` [PATCH v9 01/20] gpiolib: cdev: gpio_desc_to_lineinfo() should set info offset Kent Gibson
2020-09-22  2:31 ` [PATCH v9 02/20] gpiolib: cdev: replace strncpy() with strscpy() Kent Gibson
2020-09-22  2:31 ` [PATCH v9 03/20] gpio: uapi: define GPIO_MAX_NAME_SIZE for array sizes Kent Gibson
2020-09-22  2:31 ` [PATCH v9 04/20] gpio: uapi: define uAPI v2 Kent Gibson
2020-09-22  7:41   ` Arnd Bergmann
2020-09-22  9:50     ` Bartosz Golaszewski
2020-09-22 10:07       ` Kent Gibson
2020-09-28 13:42       ` strace decoding for GPIO uAPI Kent Gibson
2020-09-29 13:20         ` Bartosz Golaszewski
2020-09-29 15:04           ` Kent Gibson
2020-09-29 16:19           ` Andy Shevchenko
2020-09-23 10:04   ` [PATCH v9 04/20] gpio: uapi: define uAPI v2 Andy Shevchenko
2020-09-23 10:30     ` Kent Gibson
2020-09-23 11:16       ` Andy Shevchenko
2020-09-23 12:18         ` Arnd Bergmann
2020-09-23 15:15           ` Andy Shevchenko
2020-09-22  2:31 ` [PATCH v9 05/20] gpiolib: make cdev a build option Kent Gibson
2020-09-22  2:31 ` [PATCH v9 06/20] gpiolib: add build option for CDEV v1 ABI Kent Gibson
2020-09-22  2:31 ` [PATCH v9 07/20] gpiolib: cdev: support GPIO_V2_GET_LINE_IOCTL and GPIO_V2_LINE_GET_VALUES_IOCTL Kent Gibson
2020-09-23 11:11   ` Andy Shevchenko
2020-09-24  8:09     ` Kent Gibson
2020-09-25 10:06       ` Andy Shevchenko
2020-09-26  9:16         ` Kent Gibson
2020-09-27  9:00           ` Andy Shevchenko
2020-09-27 12:39             ` Kent Gibson
2020-09-24 14:29     ` Bartosz Golaszewski
2020-09-22  2:31 ` [PATCH v9 08/20] gpiolib: cdev: support GPIO_V2_GET_LINEINFO_IOCTL and GPIO_V2_GET_LINEINFO_WATCH_IOCTL Kent Gibson
2020-09-23 15:41   ` Andy Shevchenko
2020-09-24  2:39     ` Kent Gibson
2020-09-24  8:39       ` Andy Shevchenko
2020-09-24  9:48         ` Kent Gibson
2020-09-25 10:12           ` Andy Shevchenko
2020-09-25 11:56             ` Kent Gibson
2020-09-25 14:43               ` Andy Shevchenko
2020-09-25  5:32     ` Kent Gibson
2020-09-22  2:31 ` [PATCH v9 09/20] gpiolib: cdev: support edge detection for uAPI v2 Kent Gibson
2020-09-23 15:47   ` Andy Shevchenko
2020-09-24  3:07     ` Kent Gibson
2020-09-25  9:35       ` Andy Shevchenko
2020-09-25 12:26         ` Kent Gibson
2020-09-25 14:48           ` Andy Shevchenko
2020-09-22  2:31 ` [PATCH v9 10/20] gpiolib: cdev: support GPIO_V2_LINE_SET_CONFIG_IOCTL Kent Gibson
2020-09-23 16:14   ` Andy Shevchenko
2020-09-23 16:15     ` Andy Shevchenko
2020-09-24  3:24       ` Kent Gibson
2020-09-24  8:26         ` Andy Shevchenko
2020-09-24  9:26           ` Kent Gibson
2020-09-25  9:49             ` Andy Shevchenko
2020-09-22  2:31 ` [PATCH v9 11/20] gpiolib: cdev: support GPIO_V2_LINE_SET_VALUES_IOCTL Kent Gibson
2020-09-23 16:18   ` Andy Shevchenko
2020-09-24  7:32     ` Kent Gibson
2020-09-24  8:21       ` Andy Shevchenko
2020-09-24  9:08         ` Kent Gibson
2020-09-24 12:46       ` Kent Gibson
2020-09-25  9:57         ` Andy Shevchenko
2020-09-25 12:16           ` Kent Gibson [this message]
2020-09-22  2:31 ` [PATCH v9 12/20] gpiolib: cdev: support setting debounce Kent Gibson
2020-09-23 16:27   ` Andy Shevchenko
2020-09-24  7:48     ` Kent Gibson
2020-09-25  9:43       ` Andy Shevchenko
2020-09-22  2:31 ` [PATCH v9 13/20] gpio: uapi: document uAPI v1 as deprecated Kent Gibson
2020-09-22  7:49   ` Arnd Bergmann
2020-09-22  8:11     ` Andy Shevchenko
2020-09-22  9:05     ` Kent Gibson
2020-09-22  2:31 ` [PATCH v9 14/20] tools: gpio: port lsgpio to v2 uAPI Kent Gibson
2020-09-22  2:31 ` [PATCH v9 15/20] tools: gpio: port gpio-watch " Kent Gibson
2020-09-22  2:31 ` [PATCH v9 16/20] tools: gpio: rename nlines to num_lines Kent Gibson
2020-09-22  2:31 ` [PATCH v9 17/20] tools: gpio: port gpio-hammer to v2 uAPI Kent Gibson
2020-09-23 16:30   ` Andy Shevchenko
2020-09-24  7:50     ` Kent Gibson
2020-09-22  2:31 ` [PATCH v9 18/20] tools: gpio: port gpio-event-mon " Kent Gibson
2020-09-22  2:31 ` [PATCH v9 19/20] tools: gpio: add multi-line monitoring to gpio-event-mon Kent Gibson
2020-09-22  2:31 ` [PATCH v9 20/20] tools: gpio: add debounce support " Kent Gibson
2020-09-23 16:35 ` [PATCH v9 00/20] gpio: cdev: add uAPI v2 Andy Shevchenko
2020-09-24  8:00   ` Kent Gibson
2020-09-25  9:44     ` Andy Shevchenko

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=20200925121618.GA218526@sol \
    --to=warthog618@gmail.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=arnd@arndb.de \
    --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).