From f89a915e68de2327d6fd9e69c2aae730d6fe51c6 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 9 Apr 2025 16:27:53 +0300 Subject: [PATCH 1/2] gpiolib: acpi: Use temporary variable for struct acpi_gpio_info Use temporary variable to access the struct acpi_gpio_info members. This will help further changes to be cleaner. No functional change intended. Acked-by: Mika Westerberg Signed-off-by: Andy Shevchenko --- drivers/gpio/gpiolib-acpi.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index b3fcb9d5a39f..dfa4f9a5a5e6 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -753,6 +753,7 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) { struct acpi_gpio_lookup *lookup = data; struct acpi_gpio_params *params = &lookup->params; + struct acpi_gpio_info *info = &lookup->info; if (ares->type != ACPI_RESOURCE_TYPE_GPIO) return 1; @@ -763,7 +764,7 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) struct gpio_desc *desc; u16 pin_index; - if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) + if (info->quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) params->crs_entry_index++; if (lookup->n++ != params->crs_entry_index) @@ -773,16 +774,16 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) if (pin_index >= agpio->pin_table_length) return 1; - if (lookup->info.quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER) + if (info->quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER) desc = gpio_to_desc(agpio->pin_table[pin_index]); else desc = acpi_get_gpiod(agpio->resource_source.string_ptr, agpio->pin_table[pin_index]); lookup->desc = desc; - lookup->info.pin_config = agpio->pin_config; - lookup->info.debounce = agpio->debounce_timeout; - lookup->info.gpioint = gpioint; - lookup->info.wake_capable = acpi_gpio_irq_is_wake(&lookup->info.adev->dev, agpio); + info->pin_config = agpio->pin_config; + info->debounce = agpio->debounce_timeout; + info->gpioint = gpioint; + info->wake_capable = acpi_gpio_irq_is_wake(&info->adev->dev, agpio); /* * Polarity and triggering are only specified for GpioInt @@ -791,14 +792,14 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH */ - if (lookup->info.gpioint) { - lookup->info.polarity = agpio->polarity; - lookup->info.triggering = agpio->triggering; + if (info->gpioint) { + info->polarity = agpio->polarity; + info->triggering = agpio->triggering; } else { - lookup->info.polarity = params->active_low; + info->polarity = params->active_low; } - lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio, lookup->info.polarity); + info->flags = acpi_gpio_to_gpiod_flags(agpio, info->polarity); } return 1; @@ -806,7 +807,8 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup) { - struct acpi_device *adev = lookup->info.adev; + struct acpi_gpio_info *info = &lookup->info; + struct acpi_device *adev = info->adev; struct list_head res_list; int ret; @@ -831,6 +833,7 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p { struct fwnode_reference_args args; struct acpi_gpio_params *params = &lookup->params; + struct acpi_gpio_info *info = &lookup->info; unsigned int index = params->crs_entry_index; unsigned int quirks = 0; int ret; @@ -858,8 +861,8 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p params->line_index = args.args[1]; params->active_low = !!args.args[2]; - lookup->info.adev = to_acpi_device_node(args.fwnode); - lookup->info.quirks = quirks; + info->adev = to_acpi_device_node(args.fwnode); + info->quirks = quirks; return 0; } From 7c010d463372140006bf96985a306d6cbfc6e118 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 9 Apr 2025 16:27:54 +0300 Subject: [PATCH 2/2] gpiolib: acpi: Make sure we fill struct acpi_gpio_info The previous refactoring missed the filling of the struct acpi_gpio_info and that's how the lot of the code got eliminated. Restore those pieces by passing the pointer all down in the call stack. With this, the code grows by ~6%, but in conjunction with the previous refactoring it still gives -387 bytes add/remove: 2/0 grow/shrink: 5/1 up/down: 852/-35 (817) Function old new delta acpi_dev_gpio_irq_wake_get_by 129 695 +566 acpi_find_gpio 216 354 +138 acpi_find_gpio.__UNIQUE_ID_ddebug504 - 56 +56 acpi_dev_gpio_irq_wake_get_by.__UNIQUE_ID_ddebug506 - 56 +56 acpi_populate_gpio_lookup 536 548 +12 acpi_gpio_property_lookup 414 426 +12 acpi_get_gpiod_by_index 307 319 +12 __acpi_find_gpio 638 603 -35 Total: Before=14154, After=14971, chg +5.77% As a positive side effect, it improves memory footprint for struct acpi_gpio_lookup. `pahole` difference before and after: - /* size: 64, cachelines: 1, members: 4 */ - /* member types with holes: 1, total: 1 */ + /* size: 32, cachelines: 1, members: 4 */ Reported-by: Kees Bakker Closes: https://lore.kernel.org/r/9715c8dd-38df-48fd-a9d1-7a78163dc989@ijzerbout.nl Fixes: 8b4f52ef7a41 ("gpiolib: acpi: Deduplicate some code in __acpi_find_gpio()") Acked-by: Mika Westerberg Signed-off-by: Andy Shevchenko --- drivers/gpio/gpiolib-acpi.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index dfa4f9a5a5e6..3c9535d767e7 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -743,8 +743,8 @@ static int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags, } struct acpi_gpio_lookup { - struct acpi_gpio_info info; struct acpi_gpio_params params; + struct acpi_gpio_info *info; struct gpio_desc *desc; int n; }; @@ -753,7 +753,7 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) { struct acpi_gpio_lookup *lookup = data; struct acpi_gpio_params *params = &lookup->params; - struct acpi_gpio_info *info = &lookup->info; + struct acpi_gpio_info *info = lookup->info; if (ares->type != ACPI_RESOURCE_TYPE_GPIO) return 1; @@ -807,7 +807,7 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup) { - struct acpi_gpio_info *info = &lookup->info; + struct acpi_gpio_info *info = lookup->info; struct acpi_device *adev = info->adev; struct list_head res_list; int ret; @@ -833,7 +833,7 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p { struct fwnode_reference_args args; struct acpi_gpio_params *params = &lookup->params; - struct acpi_gpio_info *info = &lookup->info; + struct acpi_gpio_info *info = lookup->info; unsigned int index = params->crs_entry_index; unsigned int quirks = 0; int ret; @@ -894,8 +894,8 @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p static int acpi_get_gpiod_by_index(struct acpi_device *adev, const char *propname, struct acpi_gpio_lookup *lookup) { - struct acpi_gpio_info *info = &lookup->info; struct acpi_gpio_params *params = &lookup->params; + struct acpi_gpio_info *info = lookup->info; int ret; if (propname) { @@ -976,6 +976,7 @@ __acpi_find_gpio(struct fwnode_handle *fwnode, const char *con_id, unsigned int memset(&lookup, 0, sizeof(lookup)); lookup.params.crs_entry_index = idx; + lookup.info = info; /* Try first from _DSD */ for_each_gpio_property_name(propname, con_id) {