On Tue, Sep 22, 2020 at 4:34 AM Kent Gibson <warthog618@xxxxxxxxx> wrote: > +/** > + * struct gpio_v2_line_attribute - a configurable attribute of a line > + * @id: attribute identifier with value from &enum gpio_v2_line_attr_id > + * @padding: reserved for future use and must be zero filled > + * @flags: if id is GPIO_V2_LINE_ATTR_ID_FLAGS, the flags for the GPIO > + * line, with values from enum gpio_v2_line_flag, such as > + * GPIO_V2_LINE_FLAG_ACTIVE_LOW, GPIO_V2_LINE_FLAG_OUTPUT etc, OR:ed > + * together. This overrides the default flags contained in the &struct > + * gpio_v2_line_config for the associated line. > + * @values: if id is GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES, a bitmap > + * containing the values to which the lines will be set, with each bit > + * number corresponding to the index into &struct > + * gpio_v2_line_request.offsets. > + * @debounce_period_us: if id is GPIO_V2_LINE_ATTR_ID_DEBOUNCE, the desired > + * debounce period, in microseconds > + */ > +struct gpio_v2_line_attribute { > + __u32 id; > + __u32 padding; > + union { > + __aligned_u64 flags; > + __aligned_u64 values; > + __u32 debounce_period_us; > + }; > +}; Having different-sized members in the union makes it hard for something like strace to print the contents. How about just making them all __aligned_u64 even when 32 bits are sufficient? > +struct gpio_v2_line_request { > + __u32 offsets[GPIO_V2_LINES_MAX]; > + char consumer[GPIO_MAX_NAME_SIZE]; > + struct gpio_v2_line_config config; > + __u32 num_lines; > + __u32 event_buffer_size; > + /* Pad to fill implicit padding and reserve space for future use. */ > + __u32 padding[5]; > + __s32 fd; > +}; > +struct gpio_v2_line_info { > + char name[GPIO_MAX_NAME_SIZE]; > + char consumer[GPIO_MAX_NAME_SIZE]; > + __u32 offset; > + __u32 num_attrs; > + __aligned_u64 flags; > + struct gpio_v2_line_attribute attrs[GPIO_V2_LINE_NUM_ATTRS_MAX]; > + /* Space reserved for future use. */ > + __u32 padding[4]; > +}; These are both several hundred bytes long, requiring a lot of data to be copied to the stack and take up space there. I see this is not actually much different for the v1 API, but I wonder if there has been any analysis of whether this has a noticeable effect on application runtime. Arnd