On Fri, Oct 30, 2020 at 3:23 PM Bartosz Golaszewski <brgl@xxxxxxxx> wrote: > > From: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx> > > Current implementation of struct gpiod_line_bulk uses stack memory > excessively. The structure is big: 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. > > The rework addresses it by making the bulk structure opaque and > providing appropriate interfaces for library users while retaining a way > for internal users to allocate single line bulks on the stack. > > The macro-based loop has been removed. In its place we provide a function > iterating over all lines held by a bulk and calling the provided callback > function for each line. > > Since bulk operations can now fail, a bunch of test-cases has been added > to cover the relevant code. > > While at it: using the word offset both when referring to line's HW > offset in a chip as well as the offset in a bulk leads to confusion. > This patch renames the bulk offset to index. > > Some additional improvements to the patch by: > Kent Gibson <warthog618@xxxxxxxxx> > > Signed-off-by: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx> > --- > v1 -> v2: > - make offset -> index in all bulk-related interfaces and docs > - drop the owner chip reference from struct gpiod_line_bulk and reuse the > owner of the first line > - drop bulk_same_chip helper > > v2 -> v3: > - drop bulk iterators in favor of looping over bulk indices > Applied this patch. We can add some tweaks later. Bartosz