From: Kent Gibson <warthog618@gmail.com>
To: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Cc: linux-gpio <linux-gpio@vger.kernel.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: Re: [libgpiod] Rethinking struct gpiod_line_bulk
Date: Tue, 13 Oct 2020 08:52:52 +0800 [thread overview]
Message-ID: <20201013005252.GA9387@sol> (raw)
In-Reply-To: <CAMpxmJVWr-M3R-PfsrDvtpZTtSTBLHL95sAorO5EHVwg1eX67A@mail.gmail.com>
On Mon, Oct 12, 2020 at 05:15:25PM +0200, Bartosz Golaszewski wrote:
> Hi!
>
> One of the things I'd like to address in libgpiod v2.0 is excessive
> stack usage with struct gpiod_line_bulk. This structure is pretty big
> right now: it's an array 64 pointers + 4 bytes size. That amounts to
> 260 bytes on 32-bit and 516 bytes on 64-bit architectures
> respectively. It's also used everywhere as all functions dealing with
> single lines eventually end up calling bulk counterparts.
>
> I have some ideas for making this structure smaller and I thought I'd
> run them by you.
>
> The most obvious approach would be to make struct gpiod_line_bulk
> opaque and dynamically allocated. I don't like this idea due to the
> amount of error checking this would involve and also calling malloc()
> on virtually every value read, event poll etc.
>
> Another idea is to use embedded list node structs (see include/list.h
> in the kernel) in struct gpiod_line and chain the lines together with
> struct gpiod_line_bulk containing the list head. That would mean only
> being able to store each line in a single bulk object. This is
> obviously too limiting.
>
I don't think I've ever gotten my head fully around the libgpiod API,
or all its use cases, and I'm not clear on why this is too limiting.
What is the purpose of the gpiod_line_bulk, and how does that differ from the
gpio_v2_line_request?
> An idea I think it relatively straightforward without completely
> changing the current interface is making struct gpiod_line_bulk look
> something like this:
>
> struct gpiod_line_bulk {
> unsigned int num_lines;
> uint64_t lines;
> };
>
> Where lines would be a bitmap with set bits corresponding to offsets
> of lines that are part of this bulk. We'd then provide a function that
> would allow the user to get the line without it being updated (so
> there's no ioctl() call that could fail). The only limit that we'd
> need to introduce here is making it impossible to store lines from
> different chips in a single line bulk object. This doesn't make sense
> anyway so I'm fine with this.
>
> What do you think? Do you have any other ideas?
>
Doesn't that place a strict range limit on offset values, 0-63?
The uAPI limits the number of offsets requested to 64, not their value.
Otherwise I'd've used a bitmap there as well.
Or is there some other mapping happening in the background that I'm
missing?
Cheers,
Kent.
next prev parent reply other threads:[~2020-10-13 2:42 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-12 15:15 [libgpiod] Rethinking struct gpiod_line_bulk Bartosz Golaszewski
2020-10-12 15:21 ` Andy Shevchenko
2020-10-13 0:52 ` Kent Gibson [this message]
2020-10-13 7:45 ` Bartosz Golaszewski
2020-10-13 8:53 ` Kent Gibson
2020-10-13 12:05 ` Bartosz Golaszewski
2020-10-13 12:27 ` Kent Gibson
2020-10-13 12:53 ` Bartosz Golaszewski
2020-10-19 13:31 ` Bartosz Golaszewski
2020-10-19 16:21 ` Kent Gibson
2020-10-20 10:47 ` Bartosz Golaszewski
2020-10-20 11:05 ` Andy Shevchenko
2020-10-20 15:05 ` Kent Gibson
2020-10-20 15:53 ` Bartosz Golaszewski
2020-10-20 22:24 ` Kent Gibson
2020-10-21 7:33 ` Bartosz Golaszewski
2020-10-21 8:29 ` 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=20201013005252.GA9387@sol \
--to=warthog618@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=bgolaszewski@baylibre.com \
--cc=linux-gpio@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).