Re: [PATCH v9 11/20] gpiolib: cdev: support GPIO_V2_LINE_SET_VALUES_IOCTL

From: Kent Gibson
Date: Thu Sep 24 2020 - 03:32:59 EST


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@xxxxxxxxx> 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.

Cheers,
Kent.