linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [libgpiod] Rethinking struct gpiod_line_bulk
@ 2020-10-12 15:15 Bartosz Golaszewski
  2020-10-12 15:21 ` Andy Shevchenko
  2020-10-13  0:52 ` Kent Gibson
  0 siblings, 2 replies; 17+ messages in thread
From: Bartosz Golaszewski @ 2020-10-12 15:15 UTC (permalink / raw)
  To: linux-gpio, Kent Gibson, Andy Shevchenko

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.

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?

Best regards,
Bartosz Golaszewski

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2020-10-21  8:29 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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

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).