From patchwork Tue Apr 15 06:13:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072679 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDQz13Jrz1yJH for ; Tue, 15 Apr 2025 16:15:07 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZn-0005w5-0s; Tue, 15 Apr 2025 06:15:19 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZj-0005gC-1S for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:15 +0000 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 8FB343F1E4 for ; Tue, 15 Apr 2025 06:15:14 +0000 (UTC) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-736c0306242so6322542b3a.1 for ; Mon, 14 Apr 2025 23:15:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697713; x=1745302513; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=U3AL20Vh9HkkNC14IKRyuslYYcMekNvdTmUDSQW5sFs=; b=RqAHPVW/Vx8I75QCdWBppzeu3jaZv0KOrvRFmeSRFmx9eEbKGLb2SiTOYrOk8n5Eup fFPSXxibHUKVL55mEC1bBL15bKOpRkQJyCYBdsLNU/zJX2VMX0RpDtmLGm43j29GTyCX fFMoguhN0eYPhrgddbm/uUO/vU0iFAyr7wJw0+8d3FUt6WIp/onNorUJ1G0FGfiC1tOf aMCTY5ZvOIBR77/DiMcxuZJu0CUwWMxMarVhcVNWMpcKFu4B91vL/BiRzbvHbJVVXnFP QHvokavJcnu2pAGre46eW856NaM4Rd3vRmc7X40tCa8oKTr7kMHfZFbL92FJ/7phQVV8 DvTA== X-Gm-Message-State: AOJu0Yy9e1NF14H7Fj+RkV3/f0h72UvHtnIw/XBrMt3rLOLxwtYkY2+y FMQJXuaihqXRuIxj9EvGFWnvS9mlDOgD3F1M40rhqXGPh2KHrc2zMnrUPsKeVGwFu52/6recnsS lJglKdU5FSrFZcj7zlrILHVLF9ebmFvkUBFc+BLlGi6CYH3Klf6QQOBHLg4onJzjG2glewFzfl7 B9UsaeQQUKzg== X-Gm-Gg: ASbGncvTA8zuVhStTj/3AjsXw/JrMumY1eCMn/UGRKkzdXUyxBgwml5ghXx4OmnNPSw 0qS9sgjeUzDAlfZfb50CuAZiViS9SuRRGrWsIF+J7newLn64e+ROxJTTQdAvyL2bdWZVENNA6NM taYxosRLwNh+xQN5W+JSM6H8lZY9a6VP6zsrH/bkqHRde8qQos/iwZSgg/Uh673dwJUntoD42BT l3SBv7hauTvCWKl2saUcJlwXoSEaWZjDrsvQl1+nM/pYp+DrUP4FK1RlWe4UGaXZTp6QMXI4Glw pXU3imxTiuYAYiQmuh5SQ0JXhX+RmQ== X-Received: by 2002:a05:6a00:c89:b0:73b:9be4:e64a with SMTP id d2e1a72fcca58-73bd12a3ae7mr20497027b3a.23.1744697712855; Mon, 14 Apr 2025 23:15:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHWhu4MXluGWvFnQoxHFJ/hBMdI51JtM77PgsqYlf6DYqOkQvHoXO0SlGnLnonV3ZOxcO+gEA== X-Received: by 2002:a05:6a00:c89:b0:73b:9be4:e64a with SMTP id d2e1a72fcca58-73bd12a3ae7mr20496991b3a.23.1744697712239; Mon, 14 Apr 2025 23:15:12 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:11 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 01/20] gpio: introduce utilities for synchronous fake device creation Date: Tue, 15 Apr 2025 15:13:47 +0900 Message-ID: <085860f981ec7161d37254db5f0ad4f2dbdee4be.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Both gpio-sim and gpio-virtuser share a mechanism to instantiate a platform device, wait for probe completion, and retrieve the probe success or error status synchronously. With gpio-aggregator planned to adopt this approach for its configfs interface, it's time to factor out the common code. Add dev-sync-probe.[ch] to house helper functions used by all such implementations. No functional change. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250221133501.2203897-2-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit eb5ab6ffb4ca2d28121455dd7452061367ed5588) Signed-off-by: Koichiro Den --- drivers/gpio/Kconfig | 3 ++ drivers/gpio/Makefile | 3 ++ drivers/gpio/dev-sync-probe.c | 97 +++++++++++++++++++++++++++++++++++ drivers/gpio/dev-sync-probe.h | 25 +++++++++ 4 files changed, 128 insertions(+) create mode 100644 drivers/gpio/dev-sync-probe.c create mode 100644 drivers/gpio/dev-sync-probe.h diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index f1fc51ccaf65..4a532952846f 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -1855,3 +1855,6 @@ config GPIO_SIM endmenu endif + +config DEV_SYNC_PROBE + tristate diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 000f60b191c6..883c1a299413 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -19,6 +19,9 @@ obj-$(CONFIG_GPIO_GENERIC) += gpio-generic.o # directly supported by gpio-generic gpio-generic-$(CONFIG_GPIO_GENERIC) += gpio-mmio.o +# Utilities for drivers that need synchronous fake device creation +obj-$(CONFIG_DEV_SYNC_PROBE) += dev-sync-probe.o + obj-$(CONFIG_GPIO_104_DIO_48E) += gpio-104-dio-48e.o obj-$(CONFIG_GPIO_104_IDI_48) += gpio-104-idi-48.o obj-$(CONFIG_GPIO_104_IDIO_16) += gpio-104-idio-16.o diff --git a/drivers/gpio/dev-sync-probe.c b/drivers/gpio/dev-sync-probe.c new file mode 100644 index 000000000000..9ea733b863b2 --- /dev/null +++ b/drivers/gpio/dev-sync-probe.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Common code for drivers creating fake platform devices. + * + * Provides synchronous device creation: waits for probe completion and + * returns the probe success or error status to the device creator. + * + * Copyright (C) 2021 Bartosz Golaszewski + * Copyright (C) 2025 Koichiro Den + */ + +#include +#include + +#include "dev-sync-probe.h" + +static int dev_sync_probe_notifier_call(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct dev_sync_probe_data *pdata; + struct device *dev = data; + + pdata = container_of(nb, struct dev_sync_probe_data, bus_notifier); + if (!device_match_name(dev, pdata->name)) + return NOTIFY_DONE; + + switch (action) { + case BUS_NOTIFY_BOUND_DRIVER: + pdata->driver_bound = true; + break; + case BUS_NOTIFY_DRIVER_NOT_BOUND: + pdata->driver_bound = false; + break; + default: + return NOTIFY_DONE; + } + + complete(&pdata->probe_completion); + return NOTIFY_OK; +} + +void dev_sync_probe_init(struct dev_sync_probe_data *data) +{ + memset(data, 0, sizeof(*data)); + init_completion(&data->probe_completion); + data->bus_notifier.notifier_call = dev_sync_probe_notifier_call; +} +EXPORT_SYMBOL_GPL(dev_sync_probe_init); + +int dev_sync_probe_register(struct dev_sync_probe_data *data, + struct platform_device_info *pdevinfo) +{ + struct platform_device *pdev; + char *name; + + name = kasprintf(GFP_KERNEL, "%s.%d", pdevinfo->name, pdevinfo->id); + if (!name) + return -ENOMEM; + + data->driver_bound = false; + data->name = name; + reinit_completion(&data->probe_completion); + bus_register_notifier(&platform_bus_type, &data->bus_notifier); + + pdev = platform_device_register_full(pdevinfo); + if (IS_ERR(pdev)) { + bus_unregister_notifier(&platform_bus_type, &data->bus_notifier); + kfree(data->name); + return PTR_ERR(pdev); + } + + wait_for_completion(&data->probe_completion); + bus_unregister_notifier(&platform_bus_type, &data->bus_notifier); + + if (!data->driver_bound) { + platform_device_unregister(pdev); + kfree(data->name); + return -ENXIO; + } + + data->pdev = pdev; + return 0; +} +EXPORT_SYMBOL_GPL(dev_sync_probe_register); + +void dev_sync_probe_unregister(struct dev_sync_probe_data *data) +{ + platform_device_unregister(data->pdev); + kfree(data->name); + data->pdev = NULL; +} +EXPORT_SYMBOL_GPL(dev_sync_probe_unregister); + +MODULE_AUTHOR("Bartosz Golaszewski "); +MODULE_AUTHOR("Koichiro Den "); +MODULE_DESCRIPTION("Utilities for synchronous fake device creation"); +MODULE_LICENSE("GPL"); diff --git a/drivers/gpio/dev-sync-probe.h b/drivers/gpio/dev-sync-probe.h new file mode 100644 index 000000000000..4b3d52b70519 --- /dev/null +++ b/drivers/gpio/dev-sync-probe.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef DEV_SYNC_PROBE_H +#define DEV_SYNC_PROBE_H + +#include +#include +#include + +struct dev_sync_probe_data { + struct platform_device *pdev; + const char *name; + + /* Synchronize with probe */ + struct notifier_block bus_notifier; + struct completion probe_completion; + bool driver_bound; +}; + +void dev_sync_probe_init(struct dev_sync_probe_data *data); +int dev_sync_probe_register(struct dev_sync_probe_data *data, + struct platform_device_info *pdevinfo); +void dev_sync_probe_unregister(struct dev_sync_probe_data *data); + +#endif /* DEV_SYNC_PROBE_H */ From patchwork Tue Apr 15 06:13:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072678 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDQy2GxRz1yHt for ; Tue, 15 Apr 2025 16:15:06 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZm-0005tY-J6; Tue, 15 Apr 2025 06:15:18 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZk-0005jj-1r for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:16 +0000 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id C37E23F091 for ; Tue, 15 Apr 2025 06:15:15 +0000 (UTC) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-736d64c5e16so4185267b3a.3 for ; Mon, 14 Apr 2025 23:15:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697714; x=1745302514; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+RsrGW5f2KjvMSwGY84aAXy1/6R8+Bqn/rtsfJi+F0E=; b=M2WhU1QXnRBeLGiwJh3K8j5fM6NVBw02+hax/2PvDij6Aq4EWc+wOmP9k3LSM5DGH+ 3sOZKX+K/Sc3sMRKscrqjXjX9VgFsqQzC9mqh2rDnNaO9FW6HDQThO+rhU6TLzC2kCCr HhgTVafs1zwgwoDABpTZoasJUGEKTQv7jIQ+/Qhk9Nk+dzMOUPUcrB38MlT9u9fP1jgr sbL3hLNAFym2QhBMbFX6jpJho6ZxCj8stiwo+SgjuY4xIuLGKSgclrmViawpJGWjvoYE s56Wq4hahqz1Kiik2BOYsdNpNY4nt/JHG4S88aP2VJUPeRDgbqXzmMOdcL7g2Znn9G6t uSuQ== X-Gm-Message-State: AOJu0Yx097AX9VVMAjCGzaoucpWd7bOJJdD/NKDMUWa2USNVIltSjwYr 6GAodVtQ+DSwtnjT09ZmmEStTL+VwFIWATfO9SoX1AyOSOPQiRe9Nonrltt0LbYhzH6UY4i92ik NNfSWhSORfJfJlV6LJVqANFxP6mtpuKR7W6YtpaHdyjaaxlahZoVE7xqq/cFTnphuIZ8Y98VSR3 qDPltYDIT+Iw== X-Gm-Gg: ASbGncsM13jk5ePwkvmqJggwlg+k/KDkLDKU4qP69ikzelJ+0EXynKkU++jJhSx0Wm/ o/Ukw45tEwJZkY63ynSQ3qD1a/MPtNmy6K+hOF4Iyv+ctRV/hz658ySLP6N4kDqpQgD/rkncNNx hkww66pYGoufhYKbrZWPGR7McaDzH//yntUdOJ7cU48/I7EDaDMfvhEQnBTy6bpwcNUciBSiU5C 0tZGi+Ed4avFV8xygVinC4190n9LbKXKBKIpUlobcWJnVs1LCQ02+9/5V32PLeVOukym/gGs4nG tzm2QBTp01RWWKfshIeD7NRHZ/wwog== X-Received: by 2002:a05:6a00:a8e:b0:736:50d1:fc84 with SMTP id d2e1a72fcca58-73bd12a1937mr20042008b3a.21.1744697714211; Mon, 14 Apr 2025 23:15:14 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH35QEY5nufAZ5qAXFx7c71Paq8lvGSV7nmyXRLQJyasS5X+TQu6C8g32Wg7Cn7IxYlKNo4qg== X-Received: by 2002:a05:6a00:a8e:b0:736:50d1:fc84 with SMTP id d2e1a72fcca58-73bd12a1937mr20041979b3a.21.1744697713833; Mon, 14 Apr 2025 23:15:13 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:13 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 02/20] bitmap: Define a cleanup function for bitmaps Date: Tue, 15 Apr 2025 15:13:48 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Bartosz Golaszewski BugLink: https://bugs.launchpad.net/bugs/2103496 Add support for autopointers for bitmaps allocated with bitmap_alloc() et al. Signed-off-by: Bartosz Golaszewski Signed-off-by: Thomas Gleixner Reviewed-by: Andy Shevchenko Acked-by: Yury Norov Link: https://lore.kernel.org/r/20240122124243.44002-2-brgl@bgdev.pl (cherry picked from commit d12a82848eac28d248e67940378fe4a72b0a8cd3) Signed-off-by: Koichiro Den --- include/linux/bitmap.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 2a71bb3f2454..d7ffed3353f8 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -131,6 +132,8 @@ unsigned long *bitmap_alloc_node(unsigned int nbits, gfp_t flags, int node); unsigned long *bitmap_zalloc_node(unsigned int nbits, gfp_t flags, int node); void bitmap_free(const unsigned long *bitmap); +DEFINE_FREE(bitmap, unsigned long *, if (_T) bitmap_free(_T)) + /* Managed variants of the above. */ unsigned long *devm_bitmap_alloc(struct device *dev, unsigned int nbits, gfp_t flags); From patchwork Tue Apr 15 06:13:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072680 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDR029BJz1yHt for ; Tue, 15 Apr 2025 16:15:08 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZo-0005zu-0G; Tue, 15 Apr 2025 06:15:20 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZl-0005qW-Vi for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:18 +0000 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 8B40D3F091 for ; Tue, 15 Apr 2025 06:15:17 +0000 (UTC) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-739764217ecso4227723b3a.0 for ; Mon, 14 Apr 2025 23:15:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697716; x=1745302516; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m5b2WrwstZXzBBtKnhaqZo7EjBKygUuwpAfg2ky8XNw=; b=eXX7+66vDgmt8HzDxpy6F7J86w5d4OqWoRobGtqlJd+6FvdOUV7bBfOoVvbr/Ngb6U lpSSiabeH7TDbFPcLWqRnfCNwjpPRvMDcKFtRVvSS4gMdWywAy7GodwHXYDdiX44Qjns tQpegz50shXlGgluRrrcb7OysNnL+d60+RCYczafno6GSQ7htvxU9eymRD5nBzSPeGfC vDluTCvKcDHNzEsR4FAkDJRd0G3ULaNCZunMBy290W5izghfakerwh7vjE1MwZYMMir0 gid6KDuQbYCnhcBalpU4mwiOPYNwo1+LPQkU/fRxZFHqV1oPhCxHiTQWyHvKyszlDQdr 7n7A== X-Gm-Message-State: AOJu0Yz7u16jillpxH4P8m0tCr9P6+1pEpKICgDMd+O5v9gDVxFH4bh4 vhyGK1JCiFDjSMqjhjUTKI/ifpHVvAXKJxwqWg9ufOrhO0FT3edk3+5LyJQQn5+rac0NUQO7R4X vfVvtVo4GI5+exVi94jMUIkMY3gkpp8XFCzIQhfV6giY0VJlpyjgg4YG2Jf/ymkR0o+HE1mEzQU 2PZbe27t3i7w== X-Gm-Gg: ASbGnctOLG08J9OGm69k3WNThrQPX0Cl/LSRE67Un8N2kKWaYgaf/bsC57TtFXm6sPw 15PE/xImQdHv6mUjMiI8vOwKkuAm3hjuu0AIF+KI8q1a4L3nFKNsaNG+ubp7l1ljxK37xo+AFbb DrJV9Zkxn7ViJwiDl3tgw70iOlNy/NV37HZoMulzDCefGVFX1eG036pkUp0WyLK7QMHQV19vAy4 nYFVrBNrI3HbOc0yeZDiL+O/krMt4NmeRf0O5+D+/s0LxqZle+W7QmswglQ0ws2quU1avJS6bjx p0P8+kthZVc48eJ+XyCu6AHSa5lOwg== X-Received: by 2002:a05:6a00:820f:b0:727:39a4:30cc with SMTP id d2e1a72fcca58-73c0c885a4cmr2294119b3a.1.1744697715962; Mon, 14 Apr 2025 23:15:15 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG4jJseHQV4OzqPvtVs5x4lGiiWyWvZxciVy8u4NOihQ+/8xUl5KR+ixHC+NNmLhRwDIJIeoQ== X-Received: by 2002:a05:6a00:820f:b0:727:39a4:30cc with SMTP id d2e1a72fcca58-73c0c885a4cmr2294095b3a.1.1744697715505; Mon, 14 Apr 2025 23:15:15 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:15 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 03/20] gpio: aggregator: simplify aggr_parse() with scoped bitmap Date: Tue, 15 Apr 2025 15:13:49 +0900 Message-ID: <3204fb926ca3a2f58df3e958636b05ceed1b8b37.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Bartosz Golaszewski BugLink: https://bugs.launchpad.net/bugs/2103496 The bitmap allocated in aggr_parse() is always freed before the function returns so use __free(bitmap) to simplify it and drop the goto label. Reviewed-by: Linus Walleij Reviewed-by: Geert Uytterhoeven Link: https://lore.kernel.org/r/20240930163207.80276-1-brgl@bgdev.pl Signed-off-by: Bartosz Golaszewski (cherry picked from commit 22dec5aa596ef805cccbcd3fbe5ebffbcb4fa559) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 38e0fff9afe7..65f41cc3eafc 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -65,11 +65,11 @@ static int aggr_parse(struct gpio_aggregator *aggr) { char *args = skip_spaces(aggr->args); char *name, *offsets, *p; - unsigned long *bitmap; unsigned int i, n = 0; int error = 0; - bitmap = bitmap_alloc(AGGREGATOR_MAX_GPIOS, GFP_KERNEL); + unsigned long *bitmap __free(bitmap) = + bitmap_alloc(AGGREGATOR_MAX_GPIOS, GFP_KERNEL); if (!bitmap) return -ENOMEM; @@ -82,7 +82,7 @@ static int aggr_parse(struct gpio_aggregator *aggr) /* Named GPIO line */ error = aggr_add_gpio(aggr, name, U16_MAX, &n); if (error) - goto free_bitmap; + return error; name = offsets; continue; @@ -92,13 +92,13 @@ static int aggr_parse(struct gpio_aggregator *aggr) error = bitmap_parselist(offsets, bitmap, AGGREGATOR_MAX_GPIOS); if (error) { pr_err("Cannot parse %s: %d\n", offsets, error); - goto free_bitmap; + return error; } for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { error = aggr_add_gpio(aggr, name, i, &n); if (error) - goto free_bitmap; + return error; } args = next_arg(args, &name, &p); @@ -106,12 +106,10 @@ static int aggr_parse(struct gpio_aggregator *aggr) if (!n) { pr_err("No GPIOs specified\n"); - error = -EINVAL; + return -EINVAL; } -free_bitmap: - bitmap_free(bitmap); - return error; + return 0; } static ssize_t new_device_store(struct device_driver *driver, const char *buf, From patchwork Tue Apr 15 06:13:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072681 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDR24P80z1yHt for ; Tue, 15 Apr 2025 16:15:10 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZp-00068D-VY; Tue, 15 Apr 2025 06:15:22 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZo-00062E-L4 for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:20 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 16EA93F091 for ; Tue, 15 Apr 2025 06:15:19 +0000 (UTC) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-736c135f695so3592935b3a.0 for ; Mon, 14 Apr 2025 23:15:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697717; x=1745302517; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=512ty5KKynv5bozfQVKcLi1tWYbnfRanlAvdcNmnRTk=; b=Ghyz+1bQo8nNhEUv5GHpkCt9qWR4Cdpt8CKzPLNPmQJrn8ZD7mPU0I8+kVIHiHTXwg wQs2i0+bg0xU9eShHULSw6tSf7HOoPMCph00GSDtQXLAcRG1HoTEwIs37Ml4fzZOjQBE NSvBxeMPKgMEHpvPYZsP8vlbFNNanjigEzHNUrfXwXGzfXk+b7J1jqZlSkJcvfh5rmMu K/OXJybm4wWG/bB9iRwepuulDrLTdUnypfgybGpLK9mBClHm61/N1OR+y2rrsr0BZM1D gN+ItEl8Tzl0BvTz5phf8APu//fksOdL+3N9HYGHC/cCC9UdBD2gQbMFAtJlfHkd5pbz T0AA== X-Gm-Message-State: AOJu0Yzr4mX+tApp7h/xx+yMtRqY3k8or+fekIjqgpkpdcdfBH4VibKH 0A+diuNpA94LWopgvgFLQ60jNfMZuxSmlt1ijRTAIoUu9qHWtWN18XDMGm5CK1o6fQlaOqZkl1f 2p68KeLiUPb+D3gShHrdnBHJgc/5gbuRcP38PLsLcFatWcyBCUWjrbg/7nuQMYcJN+wZd285y9O utSIRLkVYcPg== X-Gm-Gg: ASbGncvrAJqxgLIZ0DKT0i4fnNX98k7CrfQjo+1jPtViinF5+SqGUYjjKIqpM8A1NmY oMLwiSSBe3u49P+RnvJ5L+zI8Dryelz7pZ7KSz1DFGsP8DZAxMY9FIwsvhzwhC42eeG075CY81A ftEUHf3aM3/Y6ybRqMRanBdzz+VhGTRKk3Rc4wSxPMF3ToJlp/slqQQalLya5I0yZNTcQOds7s4 1kWPqD46ciAdYY9nTHNEGIKol3/TDLTOOYX304gOaTioWlEqIQ0Lb4PbBAOjllNXqOF94w41TAq VucNkROK8832h02IYQ9ai7WtAl8kbA== X-Received: by 2002:a05:6a00:3a0e:b0:737:5edd:9805 with SMTP id d2e1a72fcca58-73bd129b3a6mr20295619b3a.19.1744697717532; Mon, 14 Apr 2025 23:15:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEwj0aVhlG1QeaseAzC45eGEVUuvVj3Rd8khGTYZS5pDf6bSFnevSycxxbLSsJuir4Z8X+73g== X-Received: by 2002:a05:6a00:3a0e:b0:737:5edd:9805 with SMTP id d2e1a72fcca58-73bd129b3a6mr20295587b3a.19.1744697717029; Mon, 14 Apr 2025 23:15:17 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:16 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 04/20] gpio: aggregator: protect driver attr handlers against module unload Date: Tue, 15 Apr 2025 15:13:50 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Both new_device_store and delete_device_store touch module global resources (e.g. gpio_aggregator_lock). To prevent race conditions with module unload, a reference needs to be held. Add try_module_get() in these handlers. For new_device_store, this eliminates what appears to be the most dangerous scenario: if an id is allocated from gpio_aggregator_idr but platform_device_register has not yet been called or completed, a concurrent module unload could fail to unregister/delete the device, leaving behind a dangling platform device/GPIO forwarder. This can result in various issues. The following simple reproducer demonstrates these problems: #!/bin/bash while :; do # note: whether 'gpiochip0 0' exists or not does not matter. echo 'gpiochip0 0' > /sys/bus/platform/drivers/gpio-aggregator/new_device done & while :; do modprobe gpio-aggregator modprobe -r gpio-aggregator done & wait Starting with the following warning, several kinds of warnings will appear and the system may become unstable: ------------[ cut here ]------------ list_del corruption, ffff888103e2e980->next is LIST_POISON1 (dead000000000100) WARNING: CPU: 1 PID: 1327 at lib/list_debug.c:56 __list_del_entry_valid_or_report+0xa3/0x120 [...] RIP: 0010:__list_del_entry_valid_or_report+0xa3/0x120 [...] Call Trace: ? __list_del_entry_valid_or_report+0xa3/0x120 ? __warn.cold+0x93/0xf2 ? __list_del_entry_valid_or_report+0xa3/0x120 ? report_bug+0xe6/0x170 ? __irq_work_queue_local+0x39/0xe0 ? handle_bug+0x58/0x90 ? exc_invalid_op+0x13/0x60 ? asm_exc_invalid_op+0x16/0x20 ? __list_del_entry_valid_or_report+0xa3/0x120 gpiod_remove_lookup_table+0x22/0x60 new_device_store+0x315/0x350 [gpio_aggregator] kernfs_fop_write_iter+0x137/0x1f0 vfs_write+0x262/0x430 ksys_write+0x60/0xd0 do_syscall_64+0x6c/0x180 entry_SYSCALL_64_after_hwframe+0x76/0x7e [...] ---[ end trace 0000000000000000 ]--- Fixes: 828546e24280 ("gpio: Add GPIO Aggregator") Cc: stable@vger.kernel.org Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250224143134.3024598-2-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 12f65d1203507f7db3ba59930fe29a3b8eee9945) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 65f41cc3eafc..d668ddb2e81d 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -119,10 +119,15 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf, struct platform_device *pdev; int res, id; + if (!try_module_get(THIS_MODULE)) + return -ENOENT; + /* kernfs guarantees string termination, so count + 1 is safe */ aggr = kzalloc(sizeof(*aggr) + count + 1, GFP_KERNEL); - if (!aggr) - return -ENOMEM; + if (!aggr) { + res = -ENOMEM; + goto put_module; + } memcpy(aggr->args, buf, count + 1); @@ -161,6 +166,7 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf, } aggr->pdev = pdev; + module_put(THIS_MODULE); return count; remove_table: @@ -175,6 +181,8 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf, kfree(aggr->lookups); free_ga: kfree(aggr); +put_module: + module_put(THIS_MODULE); return res; } @@ -203,13 +211,19 @@ static ssize_t delete_device_store(struct device_driver *driver, if (error) return error; + if (!try_module_get(THIS_MODULE)) + return -ENOENT; + mutex_lock(&gpio_aggregator_lock); aggr = idr_remove(&gpio_aggregator_idr, id); mutex_unlock(&gpio_aggregator_lock); - if (!aggr) + if (!aggr) { + module_put(THIS_MODULE); return -ENOENT; + } gpio_aggregator_free(aggr); + module_put(THIS_MODULE); return count; } static DRIVER_ATTR_WO(delete_device); From patchwork Tue Apr 15 06:13:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072682 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDR41g4sz1yHt for ; Tue, 15 Apr 2025 16:15:12 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZr-0006EU-Ot; Tue, 15 Apr 2025 06:15:23 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZp-00064H-HN for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:21 +0000 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 918E23F1ED for ; Tue, 15 Apr 2025 06:15:20 +0000 (UTC) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-7395095a505so4061233b3a.1 for ; Mon, 14 Apr 2025 23:15:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697719; x=1745302519; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CNbq/NpJ4KheRhANvZjV/MLV/ZCYE0gS1Y/uJVreU70=; b=JyCn7Ft7F64QATAmQoSzkRwUFzkmbC7e/67sWTUBktPeEiMIcYbDf0BNBYrVgLgSqq I4CGR7l/3wmLNL15CvWyYClzP1gUmCP75B4llNBdKxjdxDAP7YUrGXO/yNcvqWi0Ms7q YfD3tckibFqBshRMSjE/vOMS4SU/dOYieh0BlLrsjsmwUscA1t3NTL5wtozlwMburP/N 9DnVzIohvzi7NBODlfrPiGEpiD05jBDq2fKGZfIfzrHDhypNcyTEZc/iz3zKgzjuMGip j1WbdV3gzdVO3Nlt66Pk8AnBj0WdZg3F5kqL5oLm63fFwwg2zXdNJJunFWwSUcyBQ1vL p21A== X-Gm-Message-State: AOJu0Yy1wgl5SJiNzkkAB9rhLGql0fav1v5tDsGQduq+r8xD4f47hfQB c2YhO/OA8P0tu9yIzY45WsVrIr0ejS3j3iAjZgoWHAjfQN+LbBoTNdFLRJ9bRYtNaGdkZrInHWt TyNyi8EmK38UAtDHFF3EZKaKW0rXi8zHKRxPWYdgGWXEeNvshjdHfeFxKEFNYSpKIt79Ymp6v4y 1tMKguOCWCUA== X-Gm-Gg: ASbGncuEG22bJlqL8nk5QwC0xBNG3TP6TpzYOawRd/1jv1393K1mkmqgDYGNNtCzL4C 7yqrdO2y7SdqxsnaMBvpBZP9nk5BA9GTmmn8Hv6iUhHSi+/BRE8HMtyZwoW+iey9102B/jsn9pf tKMua13kWPBIMaL7fFqyH4KWjZq/uHOLwKptwH/X3cwEz21EE0hKxT6fXVBRXI7s5Bh3P5ajMTV cVz3zwl+Uk4SOAILHXTxB4+mp+cV0UbbIaOxRzhJWnnODKbpSxrvz4WUso1ow8tTO/RytoaN5a3 WnhPWXvXk/59j2CIbqDJ4tya6cjJPA== X-Received: by 2002:a05:6a21:9999:b0:1f5:619a:8f73 with SMTP id adf61e73a8af0-2017996fb6cmr20471766637.26.1744697718760; Mon, 14 Apr 2025 23:15:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGkK5C8ZZlsCwH96JqN0C2xOOzYOGz0CU+dVM0Idq9twKudUr2gHsy/fKVRQU8D0xR0bvsUkA== X-Received: by 2002:a05:6a21:9999:b0:1f5:619a:8f73 with SMTP id adf61e73a8af0-2017996fb6cmr20471736637.26.1744697718334; Mon, 14 Apr 2025 23:15:18 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:18 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 05/20] gpio: aggregator: reorder functions to prepare for configfs introduction Date: Tue, 15 Apr 2025 15:13:51 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Reorder functions in drivers/gpio/gpio-aggregator.c to prepare for the configfs-based interface additions in subsequent commits. Arrange the code so that the configfs implementations will appear above the existing sysfs-specific code, since the latter will partly depend on the configfs interface implementations when it starts to expose the settings to configfs. The order in drivers/gpio/gpio-aggregator.c will be as follows: * Basic gpio_aggregator/gpio_aggregator_line representations * Common utility functions * GPIO Forwarder implementations * Configfs interface implementations * Sysfs interface implementations * Platform device implementations * Module init/exit implementations This separate commit ensures a clean diff for the subsequent commits. No functional change. Reviewed-by: Geert Uytterhoeven Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-2-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 7a56efeabffd13a162073068b8e29113c65f9e64 linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 380 +++++++++++++++++---------------- 1 file changed, 192 insertions(+), 188 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index d668ddb2e81d..893cd56de867 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -61,194 +61,6 @@ static int aggr_add_gpio(struct gpio_aggregator *aggr, const char *key, return 0; } -static int aggr_parse(struct gpio_aggregator *aggr) -{ - char *args = skip_spaces(aggr->args); - char *name, *offsets, *p; - unsigned int i, n = 0; - int error = 0; - - unsigned long *bitmap __free(bitmap) = - bitmap_alloc(AGGREGATOR_MAX_GPIOS, GFP_KERNEL); - if (!bitmap) - return -ENOMEM; - - args = next_arg(args, &name, &p); - while (*args) { - args = next_arg(args, &offsets, &p); - - p = get_options(offsets, 0, &error); - if (error == 0 || *p) { - /* Named GPIO line */ - error = aggr_add_gpio(aggr, name, U16_MAX, &n); - if (error) - return error; - - name = offsets; - continue; - } - - /* GPIO chip + offset(s) */ - error = bitmap_parselist(offsets, bitmap, AGGREGATOR_MAX_GPIOS); - if (error) { - pr_err("Cannot parse %s: %d\n", offsets, error); - return error; - } - - for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { - error = aggr_add_gpio(aggr, name, i, &n); - if (error) - return error; - } - - args = next_arg(args, &name, &p); - } - - if (!n) { - pr_err("No GPIOs specified\n"); - return -EINVAL; - } - - return 0; -} - -static ssize_t new_device_store(struct device_driver *driver, const char *buf, - size_t count) -{ - struct gpio_aggregator *aggr; - struct platform_device *pdev; - int res, id; - - if (!try_module_get(THIS_MODULE)) - return -ENOENT; - - /* kernfs guarantees string termination, so count + 1 is safe */ - aggr = kzalloc(sizeof(*aggr) + count + 1, GFP_KERNEL); - if (!aggr) { - res = -ENOMEM; - goto put_module; - } - - memcpy(aggr->args, buf, count + 1); - - aggr->lookups = kzalloc(struct_size(aggr->lookups, table, 1), - GFP_KERNEL); - if (!aggr->lookups) { - res = -ENOMEM; - goto free_ga; - } - - mutex_lock(&gpio_aggregator_lock); - id = idr_alloc(&gpio_aggregator_idr, aggr, 0, 0, GFP_KERNEL); - mutex_unlock(&gpio_aggregator_lock); - - if (id < 0) { - res = id; - goto free_table; - } - - aggr->lookups->dev_id = kasprintf(GFP_KERNEL, "%s.%d", DRV_NAME, id); - if (!aggr->lookups->dev_id) { - res = -ENOMEM; - goto remove_idr; - } - - res = aggr_parse(aggr); - if (res) - goto free_dev_id; - - gpiod_add_lookup_table(aggr->lookups); - - pdev = platform_device_register_simple(DRV_NAME, id, NULL, 0); - if (IS_ERR(pdev)) { - res = PTR_ERR(pdev); - goto remove_table; - } - - aggr->pdev = pdev; - module_put(THIS_MODULE); - return count; - -remove_table: - gpiod_remove_lookup_table(aggr->lookups); -free_dev_id: - kfree(aggr->lookups->dev_id); -remove_idr: - mutex_lock(&gpio_aggregator_lock); - idr_remove(&gpio_aggregator_idr, id); - mutex_unlock(&gpio_aggregator_lock); -free_table: - kfree(aggr->lookups); -free_ga: - kfree(aggr); -put_module: - module_put(THIS_MODULE); - return res; -} - -static DRIVER_ATTR_WO(new_device); - -static void gpio_aggregator_free(struct gpio_aggregator *aggr) -{ - platform_device_unregister(aggr->pdev); - gpiod_remove_lookup_table(aggr->lookups); - kfree(aggr->lookups->dev_id); - kfree(aggr->lookups); - kfree(aggr); -} - -static ssize_t delete_device_store(struct device_driver *driver, - const char *buf, size_t count) -{ - struct gpio_aggregator *aggr; - unsigned int id; - int error; - - if (!str_has_prefix(buf, DRV_NAME ".")) - return -EINVAL; - - error = kstrtouint(buf + strlen(DRV_NAME "."), 10, &id); - if (error) - return error; - - if (!try_module_get(THIS_MODULE)) - return -ENOENT; - - mutex_lock(&gpio_aggregator_lock); - aggr = idr_remove(&gpio_aggregator_idr, id); - mutex_unlock(&gpio_aggregator_lock); - if (!aggr) { - module_put(THIS_MODULE); - return -ENOENT; - } - - gpio_aggregator_free(aggr); - module_put(THIS_MODULE); - return count; -} -static DRIVER_ATTR_WO(delete_device); - -static struct attribute *gpio_aggregator_attrs[] = { - &driver_attr_new_device.attr, - &driver_attr_delete_device.attr, - NULL -}; -ATTRIBUTE_GROUPS(gpio_aggregator); - -static int __exit gpio_aggregator_idr_remove(int id, void *p, void *data) -{ - gpio_aggregator_free(p); - return 0; -} - -static void __exit gpio_aggregator_remove_all(void) -{ - mutex_lock(&gpio_aggregator_lock); - idr_for_each(&gpio_aggregator_idr, gpio_aggregator_idr_remove, NULL); - idr_destroy(&gpio_aggregator_idr); - mutex_unlock(&gpio_aggregator_lock); -} - /* * GPIO Forwarder @@ -573,6 +385,184 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev, } +/* + * Sysfs interface + */ +static int aggr_parse(struct gpio_aggregator *aggr) +{ + char *args = skip_spaces(aggr->args); + char *name, *offsets, *p; + unsigned int i, n = 0; + int error = 0; + + unsigned long *bitmap __free(bitmap) = + bitmap_alloc(AGGREGATOR_MAX_GPIOS, GFP_KERNEL); + if (!bitmap) + return -ENOMEM; + + args = next_arg(args, &name, &p); + while (*args) { + args = next_arg(args, &offsets, &p); + + p = get_options(offsets, 0, &error); + if (error == 0 || *p) { + /* Named GPIO line */ + error = aggr_add_gpio(aggr, name, U16_MAX, &n); + if (error) + return error; + + name = offsets; + continue; + } + + /* GPIO chip + offset(s) */ + error = bitmap_parselist(offsets, bitmap, AGGREGATOR_MAX_GPIOS); + if (error) { + pr_err("Cannot parse %s: %d\n", offsets, error); + return error; + } + + for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { + error = aggr_add_gpio(aggr, name, i, &n); + if (error) + return error; + } + + args = next_arg(args, &name, &p); + } + + if (!n) { + pr_err("No GPIOs specified\n"); + return -EINVAL; + } + + return 0; +} + +static ssize_t new_device_store(struct device_driver *driver, const char *buf, + size_t count) +{ + struct gpio_aggregator *aggr; + struct platform_device *pdev; + int res, id; + + if (!try_module_get(THIS_MODULE)) + return -ENOENT; + + /* kernfs guarantees string termination, so count + 1 is safe */ + aggr = kzalloc(sizeof(*aggr) + count + 1, GFP_KERNEL); + if (!aggr) { + res = -ENOMEM; + goto put_module; + } + + memcpy(aggr->args, buf, count + 1); + + aggr->lookups = kzalloc(struct_size(aggr->lookups, table, 1), + GFP_KERNEL); + if (!aggr->lookups) { + res = -ENOMEM; + goto free_ga; + } + + mutex_lock(&gpio_aggregator_lock); + id = idr_alloc(&gpio_aggregator_idr, aggr, 0, 0, GFP_KERNEL); + mutex_unlock(&gpio_aggregator_lock); + + if (id < 0) { + res = id; + goto free_table; + } + + aggr->lookups->dev_id = kasprintf(GFP_KERNEL, "%s.%d", DRV_NAME, id); + if (!aggr->lookups->dev_id) { + res = -ENOMEM; + goto remove_idr; + } + + res = aggr_parse(aggr); + if (res) + goto free_dev_id; + + gpiod_add_lookup_table(aggr->lookups); + + pdev = platform_device_register_simple(DRV_NAME, id, NULL, 0); + if (IS_ERR(pdev)) { + res = PTR_ERR(pdev); + goto remove_table; + } + + aggr->pdev = pdev; + module_put(THIS_MODULE); + return count; + +remove_table: + gpiod_remove_lookup_table(aggr->lookups); +free_dev_id: + kfree(aggr->lookups->dev_id); +remove_idr: + mutex_lock(&gpio_aggregator_lock); + idr_remove(&gpio_aggregator_idr, id); + mutex_unlock(&gpio_aggregator_lock); +free_table: + kfree(aggr->lookups); +free_ga: + kfree(aggr); +put_module: + module_put(THIS_MODULE); + return res; +} + +static DRIVER_ATTR_WO(new_device); + +static void gpio_aggregator_free(struct gpio_aggregator *aggr) +{ + platform_device_unregister(aggr->pdev); + gpiod_remove_lookup_table(aggr->lookups); + kfree(aggr->lookups->dev_id); + kfree(aggr->lookups); + kfree(aggr); +} + +static ssize_t delete_device_store(struct device_driver *driver, + const char *buf, size_t count) +{ + struct gpio_aggregator *aggr; + unsigned int id; + int error; + + if (!str_has_prefix(buf, DRV_NAME ".")) + return -EINVAL; + + error = kstrtouint(buf + strlen(DRV_NAME "."), 10, &id); + if (error) + return error; + + if (!try_module_get(THIS_MODULE)) + return -ENOENT; + + mutex_lock(&gpio_aggregator_lock); + aggr = idr_remove(&gpio_aggregator_idr, id); + mutex_unlock(&gpio_aggregator_lock); + if (!aggr) { + module_put(THIS_MODULE); + return -ENOENT; + } + + gpio_aggregator_free(aggr); + module_put(THIS_MODULE); + return count; +} +static DRIVER_ATTR_WO(delete_device); + +static struct attribute *gpio_aggregator_attrs[] = { + &driver_attr_new_device.attr, + &driver_attr_delete_device.attr, + NULL +}; +ATTRIBUTE_GROUPS(gpio_aggregator); + + /* * GPIO Aggregator platform device */ @@ -630,6 +620,20 @@ static struct platform_driver gpio_aggregator_driver = { }, }; +static int __exit gpio_aggregator_idr_remove(int id, void *p, void *data) +{ + gpio_aggregator_free(p); + return 0; +} + +static void __exit gpio_aggregator_remove_all(void) +{ + mutex_lock(&gpio_aggregator_lock); + idr_for_each(&gpio_aggregator_idr, gpio_aggregator_idr_remove, NULL); + idr_destroy(&gpio_aggregator_idr); + mutex_unlock(&gpio_aggregator_lock); +} + static int __init gpio_aggregator_init(void) { return platform_driver_register(&gpio_aggregator_driver); From patchwork Tue Apr 15 06:13:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072683 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDR527tKz1yHt for ; Tue, 15 Apr 2025 16:15:13 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZt-0006Jm-Hh; Tue, 15 Apr 2025 06:15:25 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZq-0006AI-Oi for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:22 +0000 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 665303F091 for ; Tue, 15 Apr 2025 06:15:22 +0000 (UTC) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-739764217ecso4227787b3a.0 for ; Mon, 14 Apr 2025 23:15:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697721; x=1745302521; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tV2PFa98tVyrVVP+npSmDplUBtTKAnGTyIxrNUDrPw0=; b=stdiR+XPsMqpoknBdV7qP52uWt447vvfgPzqGSbSnHMByBowaTgpa4r3e7LCiSVetg 6W4jc6rG0dUpLcyncBtZ3hX0BOCVuADxEfRp6cv2WnLRWvK0QRUfcln8XGZkirJdLivo ifGbI2CpEL/P48l8EXLsr0rnuILozC0XZRHxWEO7cxVTinCu5Q5YyHFSCxAj72WAk8vh N17FEnMfKHOgz/8S6R50raHY7Q6GhGLOHgavCSJKiLGP0YO/QJmH/YeR9F1DSGlRu7hk lpVr6SVpqANsZn8AsC6LHQBK+3viiHhkLZ8R1DsjyInqA0QP8GVkZtTy06xFOwg3YfPS XfSg== X-Gm-Message-State: AOJu0Yy74HiXIY33JX4eo9kxtpTU61RCU9Ym6Ei+FZRyS65mY/Fzpmw0 pFpdvB/k9jhuQejrg4DSkkRZull1lInq63LNH2DQplkBPV35ISYlzl5AE7ZnrZuAJR/BH5I2/7i +Ent4kYH7TC1X0mQ3kkHaE46gvkKQSFweW/LxHtS8Fgv5IFPjg7+/t/rZJapwn0ehW2wKU6Mdgl fh6Lpp+Uj6DA== X-Gm-Gg: ASbGncv9UFJ16cmToalBplRBZzRNrQLgndhuNTCR7CqSK39Y4WmbJgk6yaSCXirpn+F qTLGqdFgp349vxvCIpK/AOaTsfbuKyy7CzOicySg0lmryeQ6ZLz3yWbyEDAd2ot9BbFUHquJcpu jew6JPgFEYAfCZCKzr6/Eqw9mko1D56ge6Yv6CG6JBN+D/IurnhqJwNFHwmNn5Xsm5XVb2q0Vz7 KTOAlGK6AQ1GlHZrPTm/93rS/syBop5Uu8nI6pgbLjnuiTUW2eSsoH5tudY5DvOG3xB0gPgG3pM aR0m+f8R8iigUeYfxmDNmx7D+BNIKw== X-Received: by 2002:a05:6a00:2449:b0:730:9637:b2ff with SMTP id d2e1a72fcca58-73c0c92af93mr3394690b3a.7.1744697720640; Mon, 14 Apr 2025 23:15:20 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEFvMY0xxplyCgq9tnIC6XY+DVBnsd02zMC/AwshLtAWLy4v7ct0cLKFcypyOJptJH2jyVIDA== X-Received: by 2002:a05:6a00:2449:b0:730:9637:b2ff with SMTP id d2e1a72fcca58-73c0c92af93mr3394651b3a.7.1744697720049; Mon, 14 Apr 2025 23:15:20 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:19 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 06/20] gpio: aggregator: unify function naming Date: Tue, 15 Apr 2025 15:13:52 +0900 Message-ID: <2da49cfe16208199925b027c5889127758af5d41.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Unify function names to use gpio_aggregator_ prefix (except GPIO forwarder implementations, which remain unchanged in subsequent commits). While at it, rename the pre-existing gpio_aggregator_free() to gpio_aggregator_destory(), since that name will be used by new alloc/free functions introduced in the next commit, for which the name is more appropriate. No functional change. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-3-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 7616dd97ae22e5f69b24774455673d183d4191c9 linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 37 ++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 893cd56de867..92cb18830d42 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -42,8 +42,8 @@ struct gpio_aggregator { static DEFINE_MUTEX(gpio_aggregator_lock); /* protects idr */ static DEFINE_IDR(gpio_aggregator_idr); -static int aggr_add_gpio(struct gpio_aggregator *aggr, const char *key, - int hwnum, unsigned int *n) +static int gpio_aggregator_add_gpio(struct gpio_aggregator *aggr, + const char *key, int hwnum, unsigned int *n) { struct gpiod_lookup_table *lookups; @@ -388,7 +388,7 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev, /* * Sysfs interface */ -static int aggr_parse(struct gpio_aggregator *aggr) +static int gpio_aggregator_parse(struct gpio_aggregator *aggr) { char *args = skip_spaces(aggr->args); char *name, *offsets, *p; @@ -407,7 +407,7 @@ static int aggr_parse(struct gpio_aggregator *aggr) p = get_options(offsets, 0, &error); if (error == 0 || *p) { /* Named GPIO line */ - error = aggr_add_gpio(aggr, name, U16_MAX, &n); + error = gpio_aggregator_add_gpio(aggr, name, U16_MAX, &n); if (error) return error; @@ -423,7 +423,7 @@ static int aggr_parse(struct gpio_aggregator *aggr) } for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { - error = aggr_add_gpio(aggr, name, i, &n); + error = gpio_aggregator_add_gpio(aggr, name, i, &n); if (error) return error; } @@ -439,8 +439,8 @@ static int aggr_parse(struct gpio_aggregator *aggr) return 0; } -static ssize_t new_device_store(struct device_driver *driver, const char *buf, - size_t count) +static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, + const char *buf, size_t count) { struct gpio_aggregator *aggr; struct platform_device *pdev; @@ -480,7 +480,7 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf, goto remove_idr; } - res = aggr_parse(aggr); + res = gpio_aggregator_parse(aggr); if (res) goto free_dev_id; @@ -513,9 +513,10 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf, return res; } -static DRIVER_ATTR_WO(new_device); +static struct driver_attribute driver_attr_gpio_aggregator_new_device = + __ATTR(new_device, 0200, NULL, gpio_aggregator_new_device_store); -static void gpio_aggregator_free(struct gpio_aggregator *aggr) +static void gpio_aggregator_destroy(struct gpio_aggregator *aggr) { platform_device_unregister(aggr->pdev); gpiod_remove_lookup_table(aggr->lookups); @@ -524,8 +525,8 @@ static void gpio_aggregator_free(struct gpio_aggregator *aggr) kfree(aggr); } -static ssize_t delete_device_store(struct device_driver *driver, - const char *buf, size_t count) +static ssize_t gpio_aggregator_delete_device_store(struct device_driver *driver, + const char *buf, size_t count) { struct gpio_aggregator *aggr; unsigned int id; @@ -549,15 +550,17 @@ static ssize_t delete_device_store(struct device_driver *driver, return -ENOENT; } - gpio_aggregator_free(aggr); + gpio_aggregator_destroy(aggr); module_put(THIS_MODULE); return count; } -static DRIVER_ATTR_WO(delete_device); + +static struct driver_attribute driver_attr_gpio_aggregator_delete_device = + __ATTR(delete_device, 0200, NULL, gpio_aggregator_delete_device_store); static struct attribute *gpio_aggregator_attrs[] = { - &driver_attr_new_device.attr, - &driver_attr_delete_device.attr, + &driver_attr_gpio_aggregator_new_device.attr, + &driver_attr_gpio_aggregator_delete_device.attr, NULL }; ATTRIBUTE_GROUPS(gpio_aggregator); @@ -622,7 +625,7 @@ static struct platform_driver gpio_aggregator_driver = { static int __exit gpio_aggregator_idr_remove(int id, void *p, void *data) { - gpio_aggregator_free(p); + gpio_aggregator_destroy(p); return 0; } From patchwork Tue Apr 15 06:13:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072684 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDR669m6z1yHt for ; Tue, 15 Apr 2025 16:15:14 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZu-0006PP-LK; Tue, 15 Apr 2025 06:15:26 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZs-0006GZ-LE for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:24 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 292F53F1ED for ; Tue, 15 Apr 2025 06:15:24 +0000 (UTC) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-736c89461d1so7145409b3a.3 for ; Mon, 14 Apr 2025 23:15:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697722; x=1745302522; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EjT+z9DhbLon52nrw+r9YMwREsiKYQZHkZRglAKRCQI=; b=r03z8tD1rQJu58M/Dc3Xoa4GFK2b+m/IoEv+76WDgHXV2g4GJQQ8UrDTbjolKW6npF zpbqx2HzyJA3iJr10O8kWG6ZSSSJDezMCO8nbCNZBTGJBbDwnD4zBNNJrhEHBDig9gb6 NU55YYZsU8mv2ZgoK1EVnRZigTWRXk64ouXoop9VGtg8qbPFAJyNn9dh+2SmOie5tPoQ SWWXoaZmTtKu6hex9gLo+WiCI50u3ZqoI88EZFbadG5U6UkR4nHweEAUvt5zk2T62I9a GYSebLwNmPlVML3jhjDotV/c1bQsoMC45GDk7qxadfZB97p9asA1jK+wCgQ/Gc9j8td+ BbIA== X-Gm-Message-State: AOJu0YwypKNB8Z9u3nBfcdl8+GlPdJcj0RquRvemY9UsjvUjt94QtmxF JsstfSW/2rygDw7wo46OhG+v7DBFO9rcIb46cf1K9fWNoBWu56BFYxwagC8+8sri9rC04vH1XTu 8xAxzK4D/iuIaJqyl3+f+P2uQxIQXqZtowteV3d9HoZtBvFOp/MJNx9iqw7RsvfqJ4EEfLkcstU my+8gvqaPMWg== X-Gm-Gg: ASbGncumbQ08P5cU+UI35yYXCNd07DSR5LewcZf9bHOZdsM8UPr16rI4vbPokum/Xgn 6GFE5187PjOg0Zo+lqlJFIK1KA72FKwyOYmjD8ASgSCL2PdDWGxmiEOh8NUlZBrkmoWeTka1g/v MgKGfm2rYhKDqjRtxU6dl5LGdnCQ8V+An2DurNA3i+yBwam85GH3T9/eE++Pc6/K2lxN8Gp0ZkE n6YeM7RnKI2SryPM/eElF41BOlGbuOPT6KuR4M/Q57qlQkwcb5Z69UI/uTgUxUzAmyXuPPpyO20 cJS2ZwYWkoos7NRHZuRKWRnyz16EFQ== X-Received: by 2002:a05:6a00:23d3:b0:736:4b85:ee05 with SMTP id d2e1a72fcca58-73bd120c920mr20226909b3a.11.1744697722360; Mon, 14 Apr 2025 23:15:22 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEcOlgni3VZfyWHqEKIo4DddOMc7UVIw1VFHBU4k5VUMkhIKFmZH8+02bHWqF+/9t8Q2e0CqQ== X-Received: by 2002:a05:6a00:23d3:b0:736:4b85:ee05 with SMTP id d2e1a72fcca58-73bd120c920mr20226883b3a.11.1744697721932; Mon, 14 Apr 2025 23:15:21 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:21 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 07/20] gpio: aggregator: add gpio_aggregator_{alloc, free}() Date: Tue, 15 Apr 2025 15:13:53 +0900 Message-ID: <3747ad5a3738bd1cf613b01dada6947bdf62a90c.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Prepare for the upcoming configfs interface. These functions will be used by both the existing sysfs interface and the new configfs interface, reducing code duplication. No functional change. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-4-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 88fe1d1a646b3b01dcc335c44e7b33ea510f620e linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 58 +++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 92cb18830d42..f34581a76b06 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -36,12 +36,41 @@ struct gpio_aggregator { struct gpiod_lookup_table *lookups; struct platform_device *pdev; + int id; char args[]; }; static DEFINE_MUTEX(gpio_aggregator_lock); /* protects idr */ static DEFINE_IDR(gpio_aggregator_idr); +static int gpio_aggregator_alloc(struct gpio_aggregator **aggr, size_t arg_size) +{ + int ret; + + struct gpio_aggregator *new __free(kfree) = kzalloc( + sizeof(*new) + arg_size, GFP_KERNEL); + if (!new) + return -ENOMEM; + + scoped_guard(mutex, &gpio_aggregator_lock) + ret = idr_alloc(&gpio_aggregator_idr, new, 0, 0, GFP_KERNEL); + + if (ret < 0) + return ret; + + new->id = ret; + *aggr = no_free_ptr(new); + return 0; +} + +static void gpio_aggregator_free(struct gpio_aggregator *aggr) +{ + scoped_guard(mutex, &gpio_aggregator_lock) + idr_remove(&gpio_aggregator_idr, aggr->id); + + kfree(aggr); +} + static int gpio_aggregator_add_gpio(struct gpio_aggregator *aggr, const char *key, int hwnum, unsigned int *n) { @@ -444,17 +473,15 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, { struct gpio_aggregator *aggr; struct platform_device *pdev; - int res, id; + int res; if (!try_module_get(THIS_MODULE)) return -ENOENT; /* kernfs guarantees string termination, so count + 1 is safe */ - aggr = kzalloc(sizeof(*aggr) + count + 1, GFP_KERNEL); - if (!aggr) { - res = -ENOMEM; + res = gpio_aggregator_alloc(&aggr, count + 1); + if (res) goto put_module; - } memcpy(aggr->args, buf, count + 1); @@ -465,19 +492,10 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, goto free_ga; } - mutex_lock(&gpio_aggregator_lock); - id = idr_alloc(&gpio_aggregator_idr, aggr, 0, 0, GFP_KERNEL); - mutex_unlock(&gpio_aggregator_lock); - - if (id < 0) { - res = id; - goto free_table; - } - - aggr->lookups->dev_id = kasprintf(GFP_KERNEL, "%s.%d", DRV_NAME, id); + aggr->lookups->dev_id = kasprintf(GFP_KERNEL, "%s.%d", DRV_NAME, aggr->id); if (!aggr->lookups->dev_id) { res = -ENOMEM; - goto remove_idr; + goto free_table; } res = gpio_aggregator_parse(aggr); @@ -486,7 +504,7 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, gpiod_add_lookup_table(aggr->lookups); - pdev = platform_device_register_simple(DRV_NAME, id, NULL, 0); + pdev = platform_device_register_simple(DRV_NAME, aggr->id, NULL, 0); if (IS_ERR(pdev)) { res = PTR_ERR(pdev); goto remove_table; @@ -500,14 +518,10 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, gpiod_remove_lookup_table(aggr->lookups); free_dev_id: kfree(aggr->lookups->dev_id); -remove_idr: - mutex_lock(&gpio_aggregator_lock); - idr_remove(&gpio_aggregator_idr, id); - mutex_unlock(&gpio_aggregator_lock); free_table: kfree(aggr->lookups); free_ga: - kfree(aggr); + gpio_aggregator_free(aggr); put_module: module_put(THIS_MODULE); return res; From patchwork Tue Apr 15 06:13:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072685 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDR93n8Rz1yHt for ; Tue, 15 Apr 2025 16:15:17 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZw-0006a5-Iq; Tue, 15 Apr 2025 06:15:28 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZu-0006P4-Mi for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:26 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 0D7983F1E4 for ; Tue, 15 Apr 2025 06:15:26 +0000 (UTC) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-736b2a25d9fso3823826b3a.0 for ; Mon, 14 Apr 2025 23:15:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697724; x=1745302524; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ota0bEdZdVgXkxLKj7KfBSlb/eLz23NZxpiAFemKs9k=; b=AqhrGipjFdyq6Szk8M2iAaoA92fhoz3V34j7zf5Ynx9kliag6HD85Q9yYAnpFirCD+ 087jqND6fpIqHGpgdZa09nAEaMAYOfRxUOpJBBuwd2uCOUi3RMoboRmO+RJvgA/L5Uq7 22BeGNt0IQtWX9gXxZPXFbduucMpwk/JRDfO+Cs+ZCbJLNgQfu3nvuYT/71IfuNKBCpf kUIEEIlNoW06LqbwdNFYdc7HUhpsxltAxgjQNGp6eId51eki4msThAdZRLeTcJgROg4s YyIjOWrZGokbyVko0RU6GuXSrUIOhdTTWp3jtUxOwU6Sg/S9UmD4gMec7+fLA7Efmx5R BgHw== X-Gm-Message-State: AOJu0Ywmwcimj2/ILaANJUbzt03WPLJN3Na9l1CWgFCZw+20OJLTB6in TZ2LgaUYdNzYX6ayHX2Yg1a/38JHr2zo9zhWRx0B8PgNOB8QvSILjP0dvJahNH0GQ2ZlQqbRuz3 3+QbnQIvCKiG75Vp8Wh1kzuy2n0mFb8WVj+jPFfIY8eY4L70umk9z0SQP0h7b6j6luvJgfo4x7I VbRGKD/WKygg== X-Gm-Gg: ASbGncv2jarxG0TXSSCemcRXBlfbDFdVlEhsPfnzOT/tBwuIfW+XSQ3XgR1ZkfBgvUK E83Zs2it9NEheEGwcrHumLM+1cSoY7r09fGiltP0+Qkg3uPi3jOsKuJkFRgfhVOvr8VCU9NbHAS Wlb414x6wDUzjG4ElDRW2fIbvAJ4AKP5KduIDSBdZ1M2w+GpFSrn7g582Eaeq1IKRbzQMtkRzdd AG2tkTmej/d2gicggDm8VSBwSSiFNmJV0ZsVG4RF9DaV6ZQFwveTulQmAxy3sUlkbpapW8nf2UQ bT952IezJR9io+0K8mIlHqnSH3hwMg== X-Received: by 2002:a05:6a21:33a3:b0:1f5:8da5:ffe9 with SMTP id adf61e73a8af0-201797a0d3amr20892431637.12.1744697724054; Mon, 14 Apr 2025 23:15:24 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGy0/XhPVXGjiB0zapG8FzYt+1v3H1YIbNEMTvqatTqr9LrbT8lSXbiYMZiKedLc6SyFt2PvQ== X-Received: by 2002:a05:6a21:33a3:b0:1f5:8da5:ffe9 with SMTP id adf61e73a8af0-201797a0d3amr20892385637.12.1744697723418; Mon, 14 Apr 2025 23:15:23 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:23 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 08/20] gpio: aggregator: introduce basic configfs interface Date: Tue, 15 Apr 2025 15:13:54 +0900 Message-ID: <87cec239d8c1f1bc3b050f1361ad947fef4fdaad.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 The existing sysfs 'new_device' interface has several limitations: * No way to determine when GPIO aggregator creation is complete. * No way to retrieve errors when creating a GPIO aggregator. * No way to trace a GPIO line of an aggregator back to its corresponding physical device. * The 'new_device' echo does not indicate which virtual gpiochip was created. * No way to assign names to GPIO lines exported through an aggregator. Introduce the new configfs interface for gpio-aggregator to address these limitations. It provides a more streamlined, modern, and extensible configuration method. For backward compatibility, the 'new_device' interface and its behavior is retained for now. This commit implements basic functionalities: /config/gpio-aggregator// /config/gpio-aggregator//live /config/gpio-aggregator//dev_name /config/gpio-aggregator/// /config/gpio-aggregator///key /config/gpio-aggregator///offset /config/gpio-aggregator///name Basic setup flow is: 1. Create a directory for a GPIO aggregator. 2. Create subdirectories for each line you want to instantiate. 3. In each line directory, configure the key and offset. The key/offset semantics are as follows: * If offset is >= 0: - key specifies the name of the chip this GPIO belongs to - offset specifies the line offset within that chip. * If offset is <0: - key needs to specify the GPIO line name. 4. Return to the aggregator's root directory and write '1' to the live attribute. For example, the command in the existing kernel doc: echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device is equivalent to: mkdir /sys/kernel/config/gpio-aggregator/ # Change to name of your choice (e.g. "aggr0") cd /sys/kernel/config/gpio-aggregator/ mkdir line0 line1 line2 # Only "line" naming allowed. echo e6052000.gpio > line0/key echo 19 > line0/offset echo e6050000.gpio > line1/key echo 20 > line1/offset echo e6050000.gpio > line2/key echo 21 > line2/offset echo 1 > live The corresponding gpio_device id can be identified as follows: cd /sys/kernel/config/gpio-aggregator/ ls -d /sys/devices/platform/`cat dev_name`/gpiochip* Also, via configfs, custom GPIO line name can be set like this: cd /sys/kernel/config/gpio-aggregator/ echo "abc" > line1/name Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-5-koichiro.den@canonical.com [Bartosz: remove stray newlines] Signed-off-by: Bartosz Golaszewski (cherry picked from commit 86f162e73d2d81ef6d819c06a3b6c2fda77a79b8 linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/Kconfig | 2 + drivers/gpio/gpio-aggregator.c | 637 ++++++++++++++++++++++++++++++++- 2 files changed, 626 insertions(+), 13 deletions(-) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 4a532952846f..72035b5555a1 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -1806,6 +1806,8 @@ menu "Virtual GPIO drivers" config GPIO_AGGREGATOR tristate "GPIO Aggregator" + select CONFIGFS_FS + select DEV_SYNC_PROBE help Say yes here to enable the GPIO Aggregator, which provides a way to aggregate existing GPIO lines into a new virtual GPIO chip. diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index f34581a76b06..f492b7259ec5 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -9,10 +9,13 @@ #include #include +#include #include #include #include #include +#include +#include #include #include #include @@ -27,6 +30,8 @@ #include #include +#include "dev-sync-probe.h" + #define AGGREGATOR_MAX_GPIOS 512 /* @@ -34,12 +39,38 @@ */ struct gpio_aggregator { + struct dev_sync_probe_data probe_data; + struct config_group group; struct gpiod_lookup_table *lookups; - struct platform_device *pdev; + struct mutex lock; int id; + + /* List of gpio_aggregator_line. Always added in order */ + struct list_head list_head; + + /* used by legacy sysfs interface only */ + bool init_via_sysfs; char args[]; }; +struct gpio_aggregator_line { + struct config_group group; + struct gpio_aggregator *parent; + struct list_head entry; + + /* Line index within the aggregator device */ + unsigned int idx; + + /* Custom name for the virtual line */ + const char *name; + /* GPIO chip label or line name */ + const char *key; + /* Can be negative to indicate lookup by line name */ + int offset; + + enum gpio_lookup_flags flags; +}; + static DEFINE_MUTEX(gpio_aggregator_lock); /* protects idr */ static DEFINE_IDR(gpio_aggregator_idr); @@ -59,6 +90,8 @@ static int gpio_aggregator_alloc(struct gpio_aggregator **aggr, size_t arg_size) return ret; new->id = ret; + INIT_LIST_HEAD(&new->list_head); + mutex_init(&new->lock); *aggr = no_free_ptr(new); return 0; } @@ -68,6 +101,7 @@ static void gpio_aggregator_free(struct gpio_aggregator *aggr) scoped_guard(mutex, &gpio_aggregator_lock) idr_remove(&gpio_aggregator_idr, aggr->id); + mutex_destroy(&aggr->lock); kfree(aggr); } @@ -90,6 +124,71 @@ static int gpio_aggregator_add_gpio(struct gpio_aggregator *aggr, return 0; } +static bool gpio_aggregator_is_active(struct gpio_aggregator *aggr) +{ + lockdep_assert_held(&aggr->lock); + + return aggr->probe_data.pdev && platform_get_drvdata(aggr->probe_data.pdev); +} + +static size_t gpio_aggregator_count_lines(struct gpio_aggregator *aggr) +{ + lockdep_assert_held(&aggr->lock); + + return list_count_nodes(&aggr->list_head); +} + +static struct gpio_aggregator_line * +gpio_aggregator_line_alloc(struct gpio_aggregator *parent, unsigned int idx, + char *key, int offset) +{ + struct gpio_aggregator_line *line; + + line = kzalloc(sizeof(*line), GFP_KERNEL); + if (!line) + return ERR_PTR(-ENOMEM); + + if (key) { + line->key = kstrdup(key, GFP_KERNEL); + if (!line->key) { + kfree(line); + return ERR_PTR(-ENOMEM); + } + } + + line->flags = GPIO_LOOKUP_FLAGS_DEFAULT; + line->parent = parent; + line->idx = idx; + line->offset = offset; + INIT_LIST_HEAD(&line->entry); + + return line; +} + +static void gpio_aggregator_line_add(struct gpio_aggregator *aggr, + struct gpio_aggregator_line *line) +{ + struct gpio_aggregator_line *tmp; + + lockdep_assert_held(&aggr->lock); + + list_for_each_entry(tmp, &aggr->list_head, entry) { + if (tmp->idx > line->idx) { + list_add_tail(&line->entry, &tmp->entry); + return; + } + } + list_add_tail(&line->entry, &aggr->list_head); +} + +static void gpio_aggregator_line_del(struct gpio_aggregator *aggr, + struct gpio_aggregator_line *line) +{ + lockdep_assert_held(&aggr->lock); + + list_del(&line->entry); +} + /* * GPIO Forwarder @@ -413,6 +512,473 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev, return fwd; } +/* + * Configfs interface + */ + +static struct gpio_aggregator * +to_gpio_aggregator(struct config_item *item) +{ + struct config_group *group = to_config_group(item); + + return container_of(group, struct gpio_aggregator, group); +} + +static struct gpio_aggregator_line * +to_gpio_aggregator_line(struct config_item *item) +{ + struct config_group *group = to_config_group(item); + + return container_of(group, struct gpio_aggregator_line, group); +} + +static struct fwnode_handle * +gpio_aggregator_make_device_sw_node(struct gpio_aggregator *aggr) +{ + struct property_entry properties[2]; + struct gpio_aggregator_line *line; + size_t num_lines; + int n = 0; + + memset(properties, 0, sizeof(properties)); + + num_lines = gpio_aggregator_count_lines(aggr); + if (num_lines == 0) + return NULL; + + const char **line_names __free(kfree) = kcalloc( + num_lines, sizeof(*line_names), GFP_KERNEL); + if (!line_names) + return ERR_PTR(-ENOMEM); + + /* The list is always sorted as new elements are inserted in order. */ + list_for_each_entry(line, &aggr->list_head, entry) + line_names[n++] = line->name ?: ""; + + properties[0] = PROPERTY_ENTRY_STRING_ARRAY_LEN( + "gpio-line-names", + line_names, num_lines); + + return fwnode_create_software_node(properties, NULL); +} + +static int gpio_aggregator_activate(struct gpio_aggregator *aggr) +{ + struct platform_device_info pdevinfo; + struct gpio_aggregator_line *line; + struct fwnode_handle *swnode; + unsigned int n = 0; + int ret = 0; + + if (gpio_aggregator_count_lines(aggr) == 0) + return -EINVAL; + + aggr->lookups = kzalloc(struct_size(aggr->lookups, table, 1), + GFP_KERNEL); + if (!aggr->lookups) + return -ENOMEM; + + swnode = gpio_aggregator_make_device_sw_node(aggr); + if (IS_ERR(swnode)) + goto err_remove_lookups; + + memset(&pdevinfo, 0, sizeof(pdevinfo)); + pdevinfo.name = DRV_NAME; + pdevinfo.id = aggr->id; + pdevinfo.fwnode = swnode; + + /* The list is always sorted as new elements are inserted in order. */ + list_for_each_entry(line, &aggr->list_head, entry) { + /* + * - Either GPIO chip label or line name must be configured + * (i.e. line->key must be non-NULL) + * - Line directories must be named with sequential numeric + * suffixes starting from 0. (i.e. ./line0, ./line1, ...) + */ + if (!line->key || line->idx != n) { + ret = -EINVAL; + goto err_remove_swnode; + } + + if (line->offset < 0) + ret = gpio_aggregator_add_gpio(aggr, line->key, + U16_MAX, &n); + else + ret = gpio_aggregator_add_gpio(aggr, line->key, + line->offset, &n); + if (ret) + goto err_remove_swnode; + } + + aggr->lookups->dev_id = kasprintf(GFP_KERNEL, "%s.%d", DRV_NAME, aggr->id); + if (!aggr->lookups->dev_id) { + ret = -ENOMEM; + goto err_remove_swnode; + } + + gpiod_add_lookup_table(aggr->lookups); + + ret = dev_sync_probe_register(&aggr->probe_data, &pdevinfo); + if (ret) + goto err_remove_lookup_table; + + return 0; + +err_remove_lookup_table: + kfree(aggr->lookups->dev_id); + gpiod_remove_lookup_table(aggr->lookups); +err_remove_swnode: + fwnode_remove_software_node(swnode); +err_remove_lookups: + kfree(aggr->lookups); + + return ret; +} + +static void gpio_aggregator_deactivate(struct gpio_aggregator *aggr) +{ + dev_sync_probe_unregister(&aggr->probe_data); + gpiod_remove_lookup_table(aggr->lookups); + kfree(aggr->lookups->dev_id); + kfree(aggr->lookups); +} + +static void gpio_aggregator_lockup_configfs(struct gpio_aggregator *aggr, + bool lock) +{ + struct configfs_subsystem *subsys = aggr->group.cg_subsys; + struct gpio_aggregator_line *line; + + /* + * The device only needs to depend on leaf lines. This is + * sufficient to lock up all the configfs entries that the + * instantiated, alive device depends on. + */ + list_for_each_entry(line, &aggr->list_head, entry) { + if (lock) + configfs_depend_item_unlocked( + subsys, &line->group.cg_item); + else + configfs_undepend_item_unlocked( + &line->group.cg_item); + } +} + +static ssize_t +gpio_aggregator_line_key_show(struct config_item *item, char *page) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + + guard(mutex)(&aggr->lock); + + return sysfs_emit(page, "%s\n", line->key ?: ""); +} + +static ssize_t +gpio_aggregator_line_key_store(struct config_item *item, const char *page, + size_t count) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + + char *key __free(kfree) = kstrndup(skip_spaces(page), count, + GFP_KERNEL); + if (!key) + return -ENOMEM; + + strim(key); + + guard(mutex)(&aggr->lock); + + if (gpio_aggregator_is_active(aggr)) + return -EBUSY; + + kfree(line->key); + line->key = no_free_ptr(key); + + return count; +} +CONFIGFS_ATTR(gpio_aggregator_line_, key); + +static ssize_t +gpio_aggregator_line_name_show(struct config_item *item, char *page) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + + guard(mutex)(&aggr->lock); + + return sysfs_emit(page, "%s\n", line->name ?: ""); +} + +static ssize_t +gpio_aggregator_line_name_store(struct config_item *item, const char *page, + size_t count) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + + char *name __free(kfree) = kstrndup(skip_spaces(page), count, + GFP_KERNEL); + if (!name) + return -ENOMEM; + + strim(name); + + guard(mutex)(&aggr->lock); + + if (gpio_aggregator_is_active(aggr)) + return -EBUSY; + + kfree(line->name); + line->name = no_free_ptr(name); + + return count; +} +CONFIGFS_ATTR(gpio_aggregator_line_, name); + +static ssize_t +gpio_aggregator_line_offset_show(struct config_item *item, char *page) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + + guard(mutex)(&aggr->lock); + + return sysfs_emit(page, "%d\n", line->offset); +} + +static ssize_t +gpio_aggregator_line_offset_store(struct config_item *item, const char *page, + size_t count) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + int offset, ret; + + ret = kstrtoint(page, 0, &offset); + if (ret) + return ret; + + /* + * When offset == -1, 'key' represents a line name to lookup. + * When 0 <= offset < 65535, 'key' represents the label of the chip with + * the 'offset' value representing the line within that chip. + * + * GPIOLIB uses the U16_MAX value to indicate lookup by line name so + * the greatest offset we can accept is (U16_MAX - 1). + */ + if (offset > (U16_MAX - 1) || offset < -1) + return -EINVAL; + + guard(mutex)(&aggr->lock); + + if (gpio_aggregator_is_active(aggr)) + return -EBUSY; + + line->offset = offset; + + return count; +} +CONFIGFS_ATTR(gpio_aggregator_line_, offset); + +static struct configfs_attribute *gpio_aggregator_line_attrs[] = { + &gpio_aggregator_line_attr_key, + &gpio_aggregator_line_attr_name, + &gpio_aggregator_line_attr_offset, + NULL +}; + +static ssize_t +gpio_aggregator_device_dev_name_show(struct config_item *item, char *page) +{ + struct gpio_aggregator *aggr = to_gpio_aggregator(item); + struct platform_device *pdev; + + guard(mutex)(&aggr->lock); + + pdev = aggr->probe_data.pdev; + if (pdev) + return sysfs_emit(page, "%s\n", dev_name(&pdev->dev)); + + return sysfs_emit(page, "%s.%d\n", DRV_NAME, aggr->id); +} +CONFIGFS_ATTR_RO(gpio_aggregator_device_, dev_name); + +static ssize_t +gpio_aggregator_device_live_show(struct config_item *item, char *page) +{ + struct gpio_aggregator *aggr = to_gpio_aggregator(item); + + guard(mutex)(&aggr->lock); + + return sysfs_emit(page, "%c\n", + gpio_aggregator_is_active(aggr) ? '1' : '0'); +} + +static ssize_t +gpio_aggregator_device_live_store(struct config_item *item, const char *page, + size_t count) +{ + struct gpio_aggregator *aggr = to_gpio_aggregator(item); + int ret = 0; + bool live; + + ret = kstrtobool(page, &live); + if (ret) + return ret; + + if (!try_module_get(THIS_MODULE)) + return -ENOENT; + + if (live) + gpio_aggregator_lockup_configfs(aggr, true); + + scoped_guard(mutex, &aggr->lock) { + if (live == gpio_aggregator_is_active(aggr)) + ret = -EPERM; + else if (live) + ret = gpio_aggregator_activate(aggr); + else + gpio_aggregator_deactivate(aggr); + } + + /* + * Undepend is required only if device disablement (live == 0) + * succeeds or if device enablement (live == 1) fails. + */ + if (live == !!ret) + gpio_aggregator_lockup_configfs(aggr, false); + + module_put(THIS_MODULE); + + return ret ?: count; +} +CONFIGFS_ATTR(gpio_aggregator_device_, live); + +static struct configfs_attribute *gpio_aggregator_device_attrs[] = { + &gpio_aggregator_device_attr_dev_name, + &gpio_aggregator_device_attr_live, + NULL +}; + +static void +gpio_aggregator_line_release(struct config_item *item) +{ + struct gpio_aggregator_line *line = to_gpio_aggregator_line(item); + struct gpio_aggregator *aggr = line->parent; + + guard(mutex)(&aggr->lock); + + gpio_aggregator_line_del(aggr, line); + kfree(line->key); + kfree(line->name); + kfree(line); +} + +static struct configfs_item_operations gpio_aggregator_line_item_ops = { + .release = gpio_aggregator_line_release, +}; + +static const struct config_item_type gpio_aggregator_line_type = { + .ct_item_ops = &gpio_aggregator_line_item_ops, + .ct_attrs = gpio_aggregator_line_attrs, + .ct_owner = THIS_MODULE, +}; + +static void gpio_aggregator_device_release(struct config_item *item) +{ + struct gpio_aggregator *aggr = to_gpio_aggregator(item); + + /* + * If the aggregator is active, this code wouldn't be reached, + * so calling gpio_aggregator_deactivate() is always unnecessary. + */ + gpio_aggregator_free(aggr); +} + +static struct configfs_item_operations gpio_aggregator_device_item_ops = { + .release = gpio_aggregator_device_release, +}; + +static struct config_group * +gpio_aggregator_device_make_group(struct config_group *group, const char *name) +{ + struct gpio_aggregator *aggr = to_gpio_aggregator(&group->cg_item); + struct gpio_aggregator_line *line; + unsigned int idx; + int ret, nchar; + + ret = sscanf(name, "line%u%n", &idx, &nchar); + if (ret != 1 || nchar != strlen(name)) + return ERR_PTR(-EINVAL); + + guard(mutex)(&aggr->lock); + + if (gpio_aggregator_is_active(aggr)) + return ERR_PTR(-EBUSY); + + list_for_each_entry(line, &aggr->list_head, entry) + if (line->idx == idx) + return ERR_PTR(-EINVAL); + + line = gpio_aggregator_line_alloc(aggr, idx, NULL, -1); + if (!line) + return ERR_PTR(-ENOMEM); + + config_group_init_type_name(&line->group, name, &gpio_aggregator_line_type); + + gpio_aggregator_line_add(aggr, line); + + return &line->group; +} + +static struct configfs_group_operations gpio_aggregator_device_group_ops = { + .make_group = gpio_aggregator_device_make_group, +}; + +static const struct config_item_type gpio_aggregator_device_type = { + .ct_group_ops = &gpio_aggregator_device_group_ops, + .ct_item_ops = &gpio_aggregator_device_item_ops, + .ct_attrs = gpio_aggregator_device_attrs, + .ct_owner = THIS_MODULE, +}; + +static struct config_group * +gpio_aggregator_make_group(struct config_group *group, const char *name) +{ + struct gpio_aggregator *aggr; + int ret; + + /* arg space is unneeded */ + ret = gpio_aggregator_alloc(&aggr, 0); + if (ret) + return ERR_PTR(ret); + + config_group_init_type_name(&aggr->group, name, &gpio_aggregator_device_type); + dev_sync_probe_init(&aggr->probe_data); + + return &aggr->group; +} + +static struct configfs_group_operations gpio_aggregator_group_ops = { + .make_group = gpio_aggregator_make_group, +}; + +static const struct config_item_type gpio_aggregator_type = { + .ct_group_ops = &gpio_aggregator_group_ops, + .ct_owner = THIS_MODULE, +}; + +static struct configfs_subsystem gpio_aggregator_subsys = { + .su_group = { + .cg_item = { + .ci_namebuf = DRV_NAME, + .ci_type = &gpio_aggregator_type, + }, + }, +}; /* * Sysfs interface @@ -485,6 +1051,7 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, memcpy(aggr->args, buf, count + 1); + aggr->init_via_sysfs = true; aggr->lookups = kzalloc(struct_size(aggr->lookups, table, 1), GFP_KERNEL); if (!aggr->lookups) { @@ -510,7 +1077,7 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, goto remove_table; } - aggr->pdev = pdev; + aggr->probe_data.pdev = pdev; module_put(THIS_MODULE); return count; @@ -532,10 +1099,7 @@ static struct driver_attribute driver_attr_gpio_aggregator_new_device = static void gpio_aggregator_destroy(struct gpio_aggregator *aggr) { - platform_device_unregister(aggr->pdev); - gpiod_remove_lookup_table(aggr->lookups); - kfree(aggr->lookups->dev_id); - kfree(aggr->lookups); + gpio_aggregator_deactivate(aggr); kfree(aggr); } @@ -557,12 +1121,19 @@ static ssize_t gpio_aggregator_delete_device_store(struct device_driver *driver, return -ENOENT; mutex_lock(&gpio_aggregator_lock); - aggr = idr_remove(&gpio_aggregator_idr, id); - mutex_unlock(&gpio_aggregator_lock); - if (!aggr) { + aggr = idr_find(&gpio_aggregator_idr, id); + /* + * For simplicity, devices created via configfs cannot be deleted + * via sysfs. + */ + if (aggr && aggr->init_via_sysfs) + idr_remove(&gpio_aggregator_idr, id); + else { + mutex_unlock(&gpio_aggregator_lock); module_put(THIS_MODULE); return -ENOENT; } + mutex_unlock(&gpio_aggregator_lock); gpio_aggregator_destroy(aggr); module_put(THIS_MODULE); @@ -579,7 +1150,6 @@ static struct attribute *gpio_aggregator_attrs[] = { }; ATTRIBUTE_GROUPS(gpio_aggregator); - /* * GPIO Aggregator platform device */ @@ -639,21 +1209,61 @@ static struct platform_driver gpio_aggregator_driver = { static int __exit gpio_aggregator_idr_remove(int id, void *p, void *data) { + /* + * There should be no aggregator created via configfs, as their + * presence would prevent module unloading. + */ gpio_aggregator_destroy(p); return 0; } static void __exit gpio_aggregator_remove_all(void) { - mutex_lock(&gpio_aggregator_lock); + /* + * Configfs callbacks acquire gpio_aggregator_lock when accessing + * gpio_aggregator_idr, so to prevent lock inversion deadlock, we + * cannot protect idr_for_each invocation here with + * gpio_aggregator_lock, as gpio_aggregator_idr_remove() accesses + * configfs groups. Fortunately, the new_device/delete_device path + * and the module unload path are mutually exclusive, thanks to an + * explicit try_module_get inside of those driver attr handlers. + * Also, when we reach here, no configfs entries present or being + * created. Therefore, no need to protect with gpio_aggregator_lock + * below. + */ idr_for_each(&gpio_aggregator_idr, gpio_aggregator_idr_remove, NULL); idr_destroy(&gpio_aggregator_idr); - mutex_unlock(&gpio_aggregator_lock); } static int __init gpio_aggregator_init(void) { - return platform_driver_register(&gpio_aggregator_driver); + int ret = 0; + + config_group_init(&gpio_aggregator_subsys.su_group); + mutex_init(&gpio_aggregator_subsys.su_mutex); + ret = configfs_register_subsystem(&gpio_aggregator_subsys); + if (ret) { + pr_err("Failed to register the '%s' configfs subsystem: %d\n", + gpio_aggregator_subsys.su_group.cg_item.ci_namebuf, ret); + mutex_destroy(&gpio_aggregator_subsys.su_mutex); + return ret; + } + + /* + * CAVEAT: This must occur after configfs registration. Otherwise, + * a race condition could arise: driver attribute groups might be + * exposed and accessed by users before configfs registration + * completes. new_device_store() does not expect a partially + * initialized configfs state. + */ + ret = platform_driver_register(&gpio_aggregator_driver); + if (ret) { + pr_err("Failed to register the platform driver: %d\n", ret); + mutex_destroy(&gpio_aggregator_subsys.su_mutex); + configfs_unregister_subsystem(&gpio_aggregator_subsys); + } + + return ret; } module_init(gpio_aggregator_init); @@ -661,6 +1271,7 @@ static void __exit gpio_aggregator_exit(void) { gpio_aggregator_remove_all(); platform_driver_unregister(&gpio_aggregator_driver); + configfs_unregister_subsystem(&gpio_aggregator_subsys); } module_exit(gpio_aggregator_exit); From patchwork Tue Apr 15 06:13:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072686 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRB6lXwz1yHt for ; Tue, 15 Apr 2025 16:15:18 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZZy-0006it-5g; Tue, 15 Apr 2025 06:15:30 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZv-0006Rn-4T for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:27 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id A3D1C3F1ED for ; Tue, 15 Apr 2025 06:15:26 +0000 (UTC) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-73917303082so3394787b3a.3 for ; Mon, 14 Apr 2025 23:15:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697725; x=1745302525; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wrHkupNep4P0pAsp8OGChBHkMUv9w/Htv88LfYUfaJg=; b=jOj4IJhFuolld8OH4uozyq8kKOo/usG+KwrtFP+JMd6AVBog4H6+qfrIN3GYsdG/I3 +BoJvU8HSilmUzYENl+9xaOgguHK0GaKjeD+UVXuDLp9ia22TMyC1vBdgesHDmwb+t3b /ecxLU/rDuH3YGfC9gVLvzapE4ixmRJZy6OYIztOaMGHYuBv9KuS3AGL9Olw+6p6lYV9 ofV3sNQICC5p4Ns0eTf44NBCU8RBz7Z57p+Lqtp+Tds6sB/rqRayUFYsGUMgQ+hE+nra vlqM5XWb88u3d1PW9r+BjBq2PQseD/ggK48rF8EDXS4iWWbkuDVt9W3q+1Pu75SyKhJF gBtg== X-Gm-Message-State: AOJu0YxI628Rn0nUxFsTlyPn20CaB3Li3VsRSDfOOslDVNE0kk5RDNaL RXyxR95zIQc8/PZlKkh9JVw/VKcGGrvOaCTGSOEUwiXWR3hEHovOZ8P3qnyZzNyXsJ3p2Diub3t wpg9gXc5/4F172WyQ1X0Pv3OVaVGG9TzggU6UJDFPzTvmdGqUx3dKf1DAQJk1qQLvm8qYhFLn7q utCdV81DYAKg== X-Gm-Gg: ASbGncsH6UrlRG59i2+nTrD+mPs8eyyBsn3d/lpkPPaaf0sRUoxIGqRtejkT3T53MLC wQQQoNmNODj7by+ZhUynXPbU887kibl88ennF3vZSksacX9M80iGSOLQU2hAbIEec5RB7iXSH7D /Ag32vReQ+eggXtv9kQNmbsBxCmHJxWXT/yIE+R5el7cZd0QsB57JFBHxxTZjwrzjaCHnU2g29t DHG85XsblazEkmaOePLYipAixTQYLOxPH4SP45M4dEHzSM2NJubxHCom3i2E2yjydErUzFE3U+u ETcGe4fj0/uVDSdtVpALqtAqhR+2/g== X-Received: by 2002:aa7:8895:0:b0:736:4d05:2e2e with SMTP id d2e1a72fcca58-73bd11c6792mr16125959b3a.6.1744697725077; Mon, 14 Apr 2025 23:15:25 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHy/23onzH3MYSB0w8/X2m7ZgDPkkj8XbLQSa+loniE3/Pg46iZcM7R905O+pbctv9l5NAwZQ== X-Received: by 2002:aa7:8895:0:b0:736:4d05:2e2e with SMTP id d2e1a72fcca58-73bd11c6792mr16125939b3a.6.1744697724611; Mon, 14 Apr 2025 23:15:24 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:24 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 09/20] UBUNTU: [Config] updateconfigs for DEV_SYNC_PROBE Date: Tue, 15 Apr 2025 15:13:55 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Signed-off-by: Koichiro Den --- debian.master/config/annotations | 1 + 1 file changed, 1 insertion(+) diff --git a/debian.master/config/annotations b/debian.master/config/annotations index 1a044e3e9d45..09b136c24d5d 100644 --- a/debian.master/config/annotations +++ b/debian.master/config/annotations @@ -3924,6 +3924,7 @@ CONFIG_DEV_DAX_HMEM policy<{'amd64': 'm', 'arm64': ' CONFIG_DEV_DAX_HMEM_DEVICES policy<{'amd64': 'y', 'arm64': 'y'}> CONFIG_DEV_DAX_KMEM policy<{'amd64': 'm', 'arm64': 'm', 'ppc64el': 'm', 's390x': 'm'}> CONFIG_DEV_DAX_PMEM policy<{'amd64': 'm', 'arm64': 'm', 'ppc64el': 'm'}> +CONFIG_DEV_SYNC_PROBE policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'ppc64el': 'm', 'riscv64': 'm', 's390x': 'm'}> CONFIG_DHT11 policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'ppc64el': 'm', 'riscv64': 'm'}> CONFIG_DIAG288_WATCHDOG policy<{'s390x': 'm'}> CONFIG_DIMLIB policy<{'amd64': 'y', 'arm64': 'y', 'armhf': 'y', 'ppc64el': 'y', 'riscv64': 'y', 's390x': 'y'}> From patchwork Tue Apr 15 06:13:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072687 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRD6GDWz1yHt for ; Tue, 15 Apr 2025 16:15:20 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za0-0006ph-9h; Tue, 15 Apr 2025 06:15:32 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZw-0006a4-IT for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:28 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 3B9CB3F1ED for ; Tue, 15 Apr 2025 06:15:28 +0000 (UTC) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-739764217ecso4227866b3a.0 for ; Mon, 14 Apr 2025 23:15:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697726; x=1745302526; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9ibUL46XsePE9Hd3Oo4uyW5f2muyPr3RQ83B9Vp9zG8=; b=MBnKoSSwGu5ONr7D3+1xtCqk44KmmO0zoSkYxcaBK1NcDennFepdIiYxH1Ta5iRHBx SxhTWVGepssi06ecpJYHg/lYei+4nyuOlHgy6iF7qxeiWa1pixo3WBj1uvKuZ1uVLt8V 7A33JcgNaWXu6QVbyQgpLtusxT5BVV0B1sgGqMK6gzPPZcPD6/J0SKdohjm7dKKerD/4 SNW6ZUbLjMqfrlDyLmD282VRYpQxq0EHiYBXoZhxwCs/HedIS/Ig0ts9QflOQZvKCNIu haPJq+EsiwRyCS1H8xW+hGvXv74EPIdZNyJUch2jTK7MnYQA7kvF7NvaD1ZXjT1cxVDB 7j5g== X-Gm-Message-State: AOJu0YwgU1QGpk4mdtBzS4odEiHcmK2QrIi1obJQd3Ns9sGN5z/k3Yrs r1730/6WcTsEML2FBQKgB03Ol/CEnjBX2zusznvsYA8/nZI2eTpcZfpusk+RVzBC7UlFWZZiLzl /JAyR4/ZfRiCgRNxOHq1PTxXqcEb+oKbUHSdzmAb2RnrnNatskFHQvsm0/GcxDuLAbDdMHkm7ot N3YENcmT5Exg== X-Gm-Gg: ASbGncvtQ5YC37N8absH7OFPPQnMa+FmVg1CgysHRoAb0Hot8ForQB/Qei9mloUCDhf LDj4QWtn1fVTh7yuwupbVbhRM+RCQv9sHVYqlMdnCClqJQ1nq+fV45WAdde6q2biMnhyDmf3kDf 9oikIEe1y7+w5GR1/qXkmqF0rFEu5igTwpDfCeKKFGfoAMHwvxoJ3sBp+5gIRrKP7z44DBG92jR 5S8GMHa72fxczPmqWxdSLTvOjzSm7rULI8FGQPQB1EifZ73Zqn3aYZRAIgiTTijJBejrOerJ286 iDZP/gNfqfS2CIAdHsvpk7WV4ElgZQ== X-Received: by 2002:a05:6a00:1a92:b0:728:f21b:ce4c with SMTP id d2e1a72fcca58-73c0c8f1421mr3956408b3a.5.1744697726580; Mon, 14 Apr 2025 23:15:26 -0700 (PDT) X-Google-Smtp-Source: AGHT+IER8MNYvAcniNsuMKKL2LgbFnEZb554lQqA72ZY0zdl+8AbwjWAEwsK1iJJD1zMIcvwnQZ6Ww== X-Received: by 2002:a05:6a00:1a92:b0:728:f21b:ce4c with SMTP id d2e1a72fcca58-73c0c8f1421mr3956354b3a.5.1744697726020; Mon, 14 Apr 2025 23:15:26 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:25 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 10/20] UBUNTU: SAUCE: gpio: aggregator: Fix error code in gpio_aggregator_activate() Date: Tue, 15 Apr 2025 15:13:56 +0900 Message-ID: <54fc63fd992fe10d4b56a7e2596f80c54846c8a7.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Dan Carpenter BugLink: https://bugs.launchpad.net/bugs/2103496 Propagate the error code if gpio_aggregator_make_device_sw_node() fails. Don't return success. Fixes: 86f162e73d2d ("gpio: aggregator: introduce basic configfs interface") Signed-off-by: Dan Carpenter Acked-by: Koichiro Den Link: https://lore.kernel.org/r/79b804a0769a434698616bebedacc0e5d5605fdc.1744452787.git.dan.carpenter@linaro.org Signed-off-by: Bartosz Golaszewski (cherry picked from commit 05b43de95add3d787a7a88378086bf01c10b3f40 gpio/for-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index f492b7259ec5..14dfbeb5f112 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -579,8 +579,10 @@ static int gpio_aggregator_activate(struct gpio_aggregator *aggr) return -ENOMEM; swnode = gpio_aggregator_make_device_sw_node(aggr); - if (IS_ERR(swnode)) + if (IS_ERR(swnode)) { + ret = PTR_ERR(swnode); goto err_remove_lookups; + } memset(&pdevinfo, 0, sizeof(pdevinfo)); pdevinfo.name = DRV_NAME; From patchwork Tue Apr 15 06:13:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072688 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRG2433z1yHt for ; Tue, 15 Apr 2025 16:15:22 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za1-0006tT-Jb; Tue, 15 Apr 2025 06:15:33 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZZz-0006mo-G5 for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:31 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 1ACEE3F1E4 for ; Tue, 15 Apr 2025 06:15:30 +0000 (UTC) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-736cd27d51fso4295026b3a.2 for ; Mon, 14 Apr 2025 23:15:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697728; x=1745302528; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Bk7yXsC7NRTef6+gidPYlDtYXptk3RPyO0dCT9Z4vjs=; b=pG3nTEWkFfQYZXSjl/XQL+Hyz4fSztv/xrz5wjEc+nlfOhbCGPkxLWdyDnJuHB2ck4 cKgs/B5TIx6Za61L71+V/vaMwngQzidwzkkXkZfgHMNktxn/F9Z3IyEyJ4aWEM/hmFO/ bs/iYo2zvedoiZzuTm2/CL3xEA8rgpIlmXefGHimL0yz89DjCs/hrSr/x+mRcPW0IcEr /tuqDrYXT4R7gMMabYFXk2DPnqiPbfT/T/IE3Wifki/XYeLTxCdlkneUyF9ng8DbKuT2 ZN948jgpXxhhNVMVy7QtzTvrRVfRQ/LP1aVGtHBZmF50o3Hf4cHcdoAz0cqwFCJGC1vt YkiA== X-Gm-Message-State: AOJu0YzGK7Eoz6OJHVqITsgpOBgcVy9rJElXLLz5RjFtaz3ZyfwEy2Au 2JQc5Dkdj688OnOOckJjuA0Ro3tiPD4azOAR2yQVqrpiJ90SHZ3MTF4S1HMXYljaEMGkjyc081M FxT6NeZ7n12sAs5bOV+2Al9vE4CXCQkejRk9MDuaJLcagIPmHrWD+mfIq5EaOEaOJ4a0C9dcweK oTz4vX/cywhw== X-Gm-Gg: ASbGncurGmvPMhyk8GZX1kuNdjLEb0dT0QDUpJaaZQjoJMVirU8jykCrde0VeBOWgi+ 0htuGhaYWm5V4hN3HCFSlDozZpMXMbQEq5TjtZEV3KWB27JinBweoS0nP9JfMbK9FtS37hy/M5g qkKqLYNIx3xHs0gMo/Ag6I2Z2VDQ5TW1LkGT/XcGlMmF+AxXV27vXEQBLmxOuH8jKpf/ABwYzdr WiVS1R8pCMJSjKYE7neJKTLk/lQMEU1gmWLp95+/iLdUt/FD2apun2RN0yavSQ9hX+S3Z9yDjV0 6CQgLnK8rFYugPdJG+BKVyUQ/n6eXg== X-Received: by 2002:a05:6a00:a8e:b0:736:2a73:675b with SMTP id d2e1a72fcca58-73bd129b37bmr20221803b3a.19.1744697728466; Mon, 14 Apr 2025 23:15:28 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEmVf5YuOTT9vlT0V2iGgy/cM7FqJTD16/zD9MW2Akdh3zM14ZbsxW+EEERpHL/MuI61bxrxg== X-Received: by 2002:a05:6a00:a8e:b0:736:2a73:675b with SMTP id d2e1a72fcca58-73bd129b37bmr20221772b3a.19.1744697728017; Mon, 14 Apr 2025 23:15:28 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.26 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:27 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 11/20] gpio: aggregator: rename 'name' to 'key' in gpio_aggregator_parse() Date: Tue, 15 Apr 2025 15:13:57 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Rename the local variable 'name' in gpio_aggregator_parse() to 'key' because struct gpio_aggregator_line now uses the 'name' field for the custom line name and the local variable actually represents a 'key'. This change prepares for the next but one commit. No functional change. Reviewed-by: Geert Uytterhoeven Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-6-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 4ec2315d7fabeb08e9ad7995bd16f34118e4633b linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 14dfbeb5f112..06c39ebc9bbb 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -988,7 +988,7 @@ static struct configfs_subsystem gpio_aggregator_subsys = { static int gpio_aggregator_parse(struct gpio_aggregator *aggr) { char *args = skip_spaces(aggr->args); - char *name, *offsets, *p; + char *key, *offsets, *p; unsigned int i, n = 0; int error = 0; @@ -997,18 +997,18 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) if (!bitmap) return -ENOMEM; - args = next_arg(args, &name, &p); + args = next_arg(args, &key, &p); while (*args) { args = next_arg(args, &offsets, &p); p = get_options(offsets, 0, &error); if (error == 0 || *p) { /* Named GPIO line */ - error = gpio_aggregator_add_gpio(aggr, name, U16_MAX, &n); + error = gpio_aggregator_add_gpio(aggr, key, U16_MAX, &n); if (error) return error; - name = offsets; + key = offsets; continue; } @@ -1020,12 +1020,12 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) } for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { - error = gpio_aggregator_add_gpio(aggr, name, i, &n); + error = gpio_aggregator_add_gpio(aggr, key, i, &n); if (error) return error; } - args = next_arg(args, &name, &p); + args = next_arg(args, &key, &p); } if (!n) { From patchwork Tue Apr 15 06:13:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072689 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRJ1fxyz1yHt for ; Tue, 15 Apr 2025 16:15:24 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za4-00074m-3t; Tue, 15 Apr 2025 06:15:36 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za0-0006qS-GG for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:32 +0000 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 270523F1ED for ; Tue, 15 Apr 2025 06:15:32 +0000 (UTC) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-736cd27d51fso4295051b3a.2 for ; Mon, 14 Apr 2025 23:15:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697730; x=1745302530; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vdHJExmI2/7VCS0ChwfJPNvYNNGV0Za9BvuS5DnPA7E=; b=Awlne21/VPTkmxH/mLkSFUjWx9cpPVB94Ata0PP7t45ygvP/dExeJA8Ml5AvkvIDNP SUVQgdS8b6uTL1VzywFoFMpwU8DEgztLHb4MCSYn2XSffOvK0aMT5MokVOqUfBylsrcO 8NgBub7P+TR9qW5MwnUuxlAWWq7rL2V6f45jndu6Bfq2SsofIeqDk4t6mVy9R2zEtua2 b5Wq0PLkxpH1R/zzJl7MLOlWm8Cuq4SQvO/zTV1Tz2HQoVKjYYWdDAYPmPMwkgFV2Uik zo/R/gq0GyYBG/1iWZQEFZLnHVKO+G3XKZjveCnY3cSVyWzu0cfhJ6TI8U2AajWeovKU 68TA== X-Gm-Message-State: AOJu0YyuVhKlEcSLcMXDSDTmYTPKGBGymJWbNpMqsn3vo7MeZuIX7sQT WoY591RP2ZbcbJ/ZLhy8V5bGeQmLBm75YLMIqOiUny8S/p+K8IXW4sjzyEqTjr2C+RYna9kPVSl mkfQcAgQm8f/jtz9Og/x3pSGZM3ZHlCQ/HljT1tKcU8K4LNwHYuOYuAMwCFyPwCek1cQzx8+Nra laagREih0fqA== X-Gm-Gg: ASbGncs8RVN4MvmEkrvjdO2zYs6KGipRLbkPuEY3nmknzUqn9q2aeAQekpdUDtf/A2k z2AohMBiuhgbKQsaHyB61urBMbQh1Dy3ul32D9SZpZ0gWWOSThgaMqd2mgdCjCe11zHLG24/QV9 WsAIehZj3A6HgAZt7baAATnStryKSTWm6zXG9FFCpFno58sroMuypMLaT326rzHc2+WdX6REJ6A Lw08Njr5a91iqypBRpD5UhEhfkU45Q5Y1Zmqs5TvVbjnbNLPeajlxURpXRmRcgKO8ti4Lki1hHb 20nC7dzK7LPEIE+kz3c3yb31ejCEZA== X-Received: by 2002:a05:6a21:9981:b0:1f5:86c6:5747 with SMTP id adf61e73a8af0-201799140e6mr24808024637.32.1744697730223; Mon, 14 Apr 2025 23:15:30 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHUYS50gbJ8rj2G8pjO7XkiabuJqMklulvWl8fC0tIlMuG5SlXeWKmRMW9QhCGs9N45riYMUA== X-Received: by 2002:a05:6a21:9981:b0:1f5:86c6:5747 with SMTP id adf61e73a8af0-201799140e6mr24807978637.32.1744697729720; Mon, 14 Apr 2025 23:15:29 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:29 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 12/20] gpio: aggregator: expose aggregator created via legacy sysfs to configfs Date: Tue, 15 Apr 2025 15:13:58 +0900 Message-ID: <8658efd79e0ceca07dc7c81803f61f7d9e26488d.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Expose settings for aggregators created using the sysfs 'new_device' interface to configfs. Once written to 'new_device', an "_sysfs." path appears in the configfs regardless of whether the probe succeeds. Consequently, users can no longer use that prefix for custom GPIO aggregator names. The 'live' attribute changes to 1 when the probe succeeds and the GPIO forwarder is instantiated. Note that the aggregator device created via sysfs is asynchronous, i.e. writing into 'new_device' returns without waiting for probe completion, and the probe may succeed, fail, or eventually succeed via deferred probe. Thus, the 'live' attribute may change from 0 to 1 asynchronously without notice. So, editing key/offset/name while it's waiting for deferred probe is prohibited. The configfs auto-generation relies on create_default_group(), which inherently prohibits rmdir(2). To align with the limitation, this commit also prohibits mkdir(2) for them. When users want to change the number of lines for an aggregator initialized via 'new_device', they need to tear down the device using 'delete_device' and reconfigure it from scratch. This does not break previous behavior; users of legacy sysfs interface simply gain additional almost read-only configfs exposure. Still, users can write to the 'live' attribute to toggle the device unless it's waiting for deferred probe. So once probe succeeds, they can deactivate it in the same manner as the devices initialized via configfs. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-7-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 83c8e3df642f5fde320278a5e6ce9e46f9689d1a linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 138 ++++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 12 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 06c39ebc9bbb..a51b01a058bd 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -33,6 +33,7 @@ #include "dev-sync-probe.h" #define AGGREGATOR_MAX_GPIOS 512 +#define AGGREGATOR_LEGACY_PREFIX "_sysfs" /* * GPIO Aggregator sysfs interface @@ -131,6 +132,14 @@ static bool gpio_aggregator_is_active(struct gpio_aggregator *aggr) return aggr->probe_data.pdev && platform_get_drvdata(aggr->probe_data.pdev); } +/* Only aggregators created via legacy sysfs can be "activating". */ +static bool gpio_aggregator_is_activating(struct gpio_aggregator *aggr) +{ + lockdep_assert_held(&aggr->lock); + + return aggr->probe_data.pdev && !platform_get_drvdata(aggr->probe_data.pdev); +} + static size_t gpio_aggregator_count_lines(struct gpio_aggregator *aggr) { lockdep_assert_held(&aggr->lock); @@ -189,6 +198,30 @@ static void gpio_aggregator_line_del(struct gpio_aggregator *aggr, list_del(&line->entry); } +static void gpio_aggregator_free_lines(struct gpio_aggregator *aggr) +{ + struct gpio_aggregator_line *line, *tmp; + + list_for_each_entry_safe(line, tmp, &aggr->list_head, entry) { + configfs_unregister_group(&line->group); + /* + * Normally, we acquire aggr->lock within the configfs + * callback. However, in the legacy sysfs interface case, + * calling configfs_(un)register_group while holding + * aggr->lock could cause a deadlock. Fortunately, this is + * unnecessary because the new_device/delete_device path + * and the module unload path are mutually exclusive, + * thanks to an explicit try_module_get. That's why this + * minimal scoped_guard suffices. + */ + scoped_guard(mutex, &aggr->lock) + gpio_aggregator_line_del(aggr, line); + kfree(line->key); + kfree(line->name); + kfree(line); + } +} + /* * GPIO Forwarder @@ -693,7 +726,8 @@ gpio_aggregator_line_key_store(struct config_item *item, const char *page, guard(mutex)(&aggr->lock); - if (gpio_aggregator_is_active(aggr)) + if (gpio_aggregator_is_activating(aggr) || + gpio_aggregator_is_active(aggr)) return -EBUSY; kfree(line->key); @@ -730,7 +764,8 @@ gpio_aggregator_line_name_store(struct config_item *item, const char *page, guard(mutex)(&aggr->lock); - if (gpio_aggregator_is_active(aggr)) + if (gpio_aggregator_is_activating(aggr) || + gpio_aggregator_is_active(aggr)) return -EBUSY; kfree(line->name); @@ -776,7 +811,8 @@ gpio_aggregator_line_offset_store(struct config_item *item, const char *page, guard(mutex)(&aggr->lock); - if (gpio_aggregator_is_active(aggr)) + if (gpio_aggregator_is_activating(aggr) || + gpio_aggregator_is_active(aggr)) return -EBUSY; line->offset = offset; @@ -834,11 +870,12 @@ gpio_aggregator_device_live_store(struct config_item *item, const char *page, if (!try_module_get(THIS_MODULE)) return -ENOENT; - if (live) + if (live && !aggr->init_via_sysfs) gpio_aggregator_lockup_configfs(aggr, true); scoped_guard(mutex, &aggr->lock) { - if (live == gpio_aggregator_is_active(aggr)) + if (gpio_aggregator_is_activating(aggr) || + (live == gpio_aggregator_is_active(aggr))) ret = -EPERM; else if (live) ret = gpio_aggregator_activate(aggr); @@ -850,7 +887,7 @@ gpio_aggregator_device_live_store(struct config_item *item, const char *page, * Undepend is required only if device disablement (live == 0) * succeeds or if device enablement (live == 1) fails. */ - if (live == !!ret) + if (live == !!ret && !aggr->init_via_sysfs) gpio_aggregator_lockup_configfs(aggr, false); module_put(THIS_MODULE); @@ -894,7 +931,7 @@ static void gpio_aggregator_device_release(struct config_item *item) struct gpio_aggregator *aggr = to_gpio_aggregator(item); /* - * If the aggregator is active, this code wouldn't be reached, + * At this point, aggr is neither active nor activating, * so calling gpio_aggregator_deactivate() is always unnecessary. */ gpio_aggregator_free(aggr); @@ -916,6 +953,15 @@ gpio_aggregator_device_make_group(struct config_group *group, const char *name) if (ret != 1 || nchar != strlen(name)) return ERR_PTR(-EINVAL); + if (aggr->init_via_sysfs) + /* + * Aggregators created via legacy sysfs interface are exposed as + * default groups, which means rmdir(2) is prohibited for them. + * For simplicity, and to avoid confusion, we also prohibit + * mkdir(2). + */ + return ERR_PTR(-EPERM); + guard(mutex)(&aggr->lock); if (gpio_aggregator_is_active(aggr)) @@ -953,6 +999,14 @@ gpio_aggregator_make_group(struct config_group *group, const char *name) struct gpio_aggregator *aggr; int ret; + /* + * "_sysfs" prefix is reserved for auto-generated config group + * for devices create via legacy sysfs interface. + */ + if (strncmp(name, AGGREGATOR_LEGACY_PREFIX, + sizeof(AGGREGATOR_LEGACY_PREFIX)) == 0) + return ERR_PTR(-EINVAL); + /* arg space is unneeded */ ret = gpio_aggregator_alloc(&aggr, 0); if (ret) @@ -988,6 +1042,8 @@ static struct configfs_subsystem gpio_aggregator_subsys = { static int gpio_aggregator_parse(struct gpio_aggregator *aggr) { char *args = skip_spaces(aggr->args); + struct gpio_aggregator_line *line; + char name[CONFIGFS_ITEM_NAME_LEN]; char *key, *offsets, *p; unsigned int i, n = 0; int error = 0; @@ -1004,9 +1060,24 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) p = get_options(offsets, 0, &error); if (error == 0 || *p) { /* Named GPIO line */ + scnprintf(name, sizeof(name), "line%u", n); + line = gpio_aggregator_line_alloc(aggr, n, key, -1); + if (!line) { + error = -ENOMEM; + goto err; + } + config_group_init_type_name(&line->group, name, + &gpio_aggregator_line_type); + error = configfs_register_group(&aggr->group, + &line->group); + if (error) + goto err; + scoped_guard(mutex, &aggr->lock) + gpio_aggregator_line_add(aggr, line); + error = gpio_aggregator_add_gpio(aggr, key, U16_MAX, &n); if (error) - return error; + goto err; key = offsets; continue; @@ -1020,9 +1091,24 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) } for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { + scnprintf(name, sizeof(name), "line%u", n); + line = gpio_aggregator_line_alloc(aggr, n, key, i); + if (!line) { + error = -ENOMEM; + goto err; + } + config_group_init_type_name(&line->group, name, + &gpio_aggregator_line_type); + error = configfs_register_group(&aggr->group, + &line->group); + if (error) + goto err; + scoped_guard(mutex, &aggr->lock) + gpio_aggregator_line_add(aggr, line); + error = gpio_aggregator_add_gpio(aggr, key, i, &n); if (error) - return error; + goto err; } args = next_arg(args, &key, &p); @@ -1030,15 +1116,20 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) if (!n) { pr_err("No GPIOs specified\n"); - return -EINVAL; + goto err; } return 0; + +err: + gpio_aggregator_free_lines(aggr); + return error; } static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, const char *buf, size_t count) { + char name[CONFIGFS_ITEM_NAME_LEN]; struct gpio_aggregator *aggr; struct platform_device *pdev; int res; @@ -1067,10 +1158,25 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, goto free_table; } - res = gpio_aggregator_parse(aggr); + scnprintf(name, sizeof(name), "%s.%d", AGGREGATOR_LEGACY_PREFIX, aggr->id); + config_group_init_type_name(&aggr->group, name, &gpio_aggregator_device_type); + + /* + * Since the device created by sysfs might be toggled via configfs + * 'live' attribute later, this initialization is needed. + */ + dev_sync_probe_init(&aggr->probe_data); + + /* Expose to configfs */ + res = configfs_register_group(&gpio_aggregator_subsys.su_group, + &aggr->group); if (res) goto free_dev_id; + res = gpio_aggregator_parse(aggr); + if (res) + goto unregister_group; + gpiod_add_lookup_table(aggr->lookups); pdev = platform_device_register_simple(DRV_NAME, aggr->id, NULL, 0); @@ -1085,6 +1191,8 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, remove_table: gpiod_remove_lookup_table(aggr->lookups); +unregister_group: + configfs_unregister_group(&aggr->group); free_dev_id: kfree(aggr->lookups->dev_id); free_table: @@ -1101,7 +1209,13 @@ static struct driver_attribute driver_attr_gpio_aggregator_new_device = static void gpio_aggregator_destroy(struct gpio_aggregator *aggr) { - gpio_aggregator_deactivate(aggr); + scoped_guard(mutex, &aggr->lock) { + if (gpio_aggregator_is_activating(aggr) || + gpio_aggregator_is_active(aggr)) + gpio_aggregator_deactivate(aggr); + } + gpio_aggregator_free_lines(aggr); + configfs_unregister_group(&aggr->group); kfree(aggr); } From patchwork Tue Apr 15 06:13:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072690 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRJ6MRfz1yJH for ; Tue, 15 Apr 2025 16:15:24 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za4-00077M-NW; Tue, 15 Apr 2025 06:15:36 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za1-0006v8-RV for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:34 +0000 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 89A963F1E4 for ; Tue, 15 Apr 2025 06:15:33 +0000 (UTC) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-736cd27d51fso4295110b3a.2 for ; Mon, 14 Apr 2025 23:15:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697732; x=1745302532; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bqtE/Ny7Q24fkjlMIOle97nnd9xmT38xVGc2ofQjE/s=; b=nTOjQXQRpS3k3SRu2wTEJ7d9fGBbFvX9KlFNg166RiLZC0L5t8UemxXtwoIcDifQ49 zlC7l8KEd6koYYtg5fqDUGApNYxTISZ+Rx+Xcu1MJ6uO/FBPVqFVTa6dKUdz/MJyMyZf 7dTHwI2Czjdok/iOi+VJc+PNVXczB4qL0PjeN5pn4rCf3xRzVh0xEbeQ6TPhXxzGhtjj PAKFmrJaXmqAFUWNHfCOMCzpZhYIoXzlJyy4zPROClgiIa2X0jZY5itaVwRIEmEaLcP/ CTlrP/OUGXIe/Xq4EqHqDbezXSxMNEYQlBWJxqlLKqpbMyXh6Ecq03psQXqkbhuGjQT+ LsSQ== X-Gm-Message-State: AOJu0YysvrUENxtAGh/OHd1gBlCViZdqzVzXPpLCJVMMqcih7F1jvsV8 5/YfPXQ2qIEkut+VLlE13uEL8UWQskP4e32XxcUqMJ+OfmTNAlJKeC/PF4F1pY+tkB+D4WFgivb Pri0dvHc0pvFNqhvd37uaCjq16yVEisw3OJXb2R9mFa/J90bYTdVNOtJpj9pQR8utUScGE8sCvD vzvOXqwKm0iA== X-Gm-Gg: ASbGnctbx5TX9OxwRiH5lSo964esC8ZpOLSECKYXJFb4WGWx1J7Fs3pAoeqcEysqHk8 VdV4DVOcWVsOOKkXtnp71iG6BP5q8oT/FLtVwxmZlA3n6uEiY9fJvk6ghGbPvMiCTEZjSbXNmq7 4XBERpaPQ0HrMsexeZA6MSIDBgioYVi2UWdGsGzhLjDqCkIuNQCG6VLtf69IFFx5bjgZVqUgkKv vHKiAH5654MVpy+4UpSBijqKjkzKLDSxq21P8HjvPn2Whoul6ooeq0EP2FpHLWMEbBLTskQrqqv mRYaf65HaKLjgzyCTQjANTSPDwfFOg== X-Received: by 2002:a05:6a00:ace:b0:736:6ac4:d1ff with SMTP id d2e1a72fcca58-73bd119d019mr22955174b3a.3.1744697731990; Mon, 14 Apr 2025 23:15:31 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHnmKVthfrafvd4MkwE/x44kCjpbRwIjkOGQAh65qvm8NHMhsyCiT6MeDwbSgAzPiXt4nmV6g== X-Received: by 2002:a05:6a00:ace:b0:736:6ac4:d1ff with SMTP id d2e1a72fcca58-73bd119d019mr22955134b3a.3.1744697731513; Mon, 14 Apr 2025 23:15:31 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:31 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 13/20] UBUNTU: SAUCE: gpio: aggregator: fix "_sysfs" prefix check in gpio_aggregator_make_group() Date: Tue, 15 Apr 2025 15:13:59 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Dan Carpenter BugLink: https://bugs.launchpad.net/bugs/2103496 This code is intended to reject strings that start with "_sysfs" but the strcmp() limit is wrong so checks the whole string instead of the prefix. Fixes: 83c8e3df642f ("gpio: aggregator: expose aggregator created via legacy sysfs to configfs") Signed-off-by: Dan Carpenter Reviewed-by: Geert Uytterhoeven Acked-by: Koichiro Den Link: https://lore.kernel.org/r/30210ed77b40b4b6629de659cb56b9ec7832c447.1744452787.git.dan.carpenter@linaro.org Signed-off-by: Bartosz Golaszewski (cherry picked from commit eebfcb98cdc0228f5e1b7407f9db1c602bd8e545 gpio/for-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index a51b01a058bd..bbcb33bcaa9d 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -1004,7 +1004,7 @@ gpio_aggregator_make_group(struct config_group *group, const char *name) * for devices create via legacy sysfs interface. */ if (strncmp(name, AGGREGATOR_LEGACY_PREFIX, - sizeof(AGGREGATOR_LEGACY_PREFIX)) == 0) + sizeof(AGGREGATOR_LEGACY_PREFIX) - 1) == 0) return ERR_PTR(-EINVAL); /* arg space is unneeded */ From patchwork Tue Apr 15 06:14:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072691 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRL73hHz1yHt for ; Tue, 15 Apr 2025 16:15:26 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za6-0007DH-7W; Tue, 15 Apr 2025 06:15:38 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za3-0006zV-54 for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:35 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id E04E63F1ED for ; Tue, 15 Apr 2025 06:15:34 +0000 (UTC) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-72f3b4c0305so6062176b3a.0 for ; Mon, 14 Apr 2025 23:15:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697733; x=1745302533; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P+0VLbg2JGOSKYhf+AjVAbpOcdfnjmaj4ynbHGsmdfQ=; b=PY07olCUbIdcZMVljcTbualpcVsXK1ivrDpjXOXkQuWsVdh8rBktf0J9aF4cuJeZcW mNjzrSHDeK+j0092QGkw752kh4X9SUouyVvY6irRa9iL7KmPLJxYQ/B13OvGlVu0F4C7 jO3JE5knKjlqu1MSjSL+xAU/frm7fW6paY5h4wMOmpbvfcFWO+msSzFMu1XUHHRdoVVa DYFZDNvhOV9naccjAzeFpGMq5pYO4636MTOF5eycfA/J9+No/gkR5icfEBpiGNaDpYwq 5zHSXG6+SYXweg6nIfwaDyUWHMHp9RuOaQwaatlarJrszOme0nE/m+O3DM0Co4KvumOq VdlQ== X-Gm-Message-State: AOJu0YzIHAo8bt3xF9GnvEVwZE3QsS3hDndlbvUGCZfPYMHITJcyhjpG Bp2OJ5R0Yxr+fTYtWnzBO8O7JHGVtpvDj68hQZJsqHZoMUSekQ8y4myKUesiU70HP+9RDg1MN4i qfGweKSaVEHoM0AEo5a9qO41e6iNsyPlKKmcysAdoTOZbZAUzBo1b/mmgQKD88erCKw/gMW/jKU 7SFc1BXuReQQ== X-Gm-Gg: ASbGncsvyvJezgN1ZJMNKBUeJ0DCeARJMfPhHgzVX6JTYifNhD3milwO869Q7AX/Q+r /J2hs7C0sDDMSdjnHPQuEUlDVRzvVlAU43wpubLAu6hvULYKmCibq9FKVL6WO+eIPhE6fMCDZNA Rb67kgQUfReWdUCVyG9knkI+ODoE7zj6opJPcTKXouDkQM0zNgeXIhjeSpkx3bj7CrdOn6XIMNk 2vqVbdrs5h9CRAiXr6fQ3NhJw1pIUMuOn0iCrL7fa3JQh1jp1Bofq6C/5hPyPr1D5Lw6xEHLRua +1BewQe4a6AyabN5Hwg+SzpIAaUMXQ== X-Received: by 2002:a05:6a20:9c97:b0:1f5:79c4:5da6 with SMTP id adf61e73a8af0-2017978093dmr19507253637.5.1744697733368; Mon, 14 Apr 2025 23:15:33 -0700 (PDT) X-Google-Smtp-Source: AGHT+IETR9DRXqVCwv/KpZwUDq8NgCiJQegofERnZ6nPcBkUMeVJDusXvb6MV60IOIX37sk3YaaDHg== X-Received: by 2002:a05:6a20:9c97:b0:1f5:79c4:5da6 with SMTP id adf61e73a8af0-2017978093dmr19507235637.5.1744697733067; Mon, 14 Apr 2025 23:15:33 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:32 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 14/20] UBUNTU: SAUCE: gpio: aggregator: Fix gpio_aggregator_line_alloc() checking Date: Tue, 15 Apr 2025 15:14:00 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Dan Carpenter BugLink: https://bugs.launchpad.net/bugs/2103496 The gpio_aggregator_line_alloc() function returns error pointers, but the callers check for NULL. Update the error checking in the callers. Fixes: 83c8e3df642f ("gpio: aggregator: expose aggregator created via legacy sysfs to configfs") Signed-off-by: Dan Carpenter Acked-by: Koichiro Den Link: https://lore.kernel.org/r/cc71d8cf6e9bb4bb8cd9ae5050100081891d9345.1744452787.git.dan.carpenter@linaro.org Signed-off-by: Bartosz Golaszewski (cherry picked from commit 2e8636ca340002f3ac31383622911a1aa75fb086 gpio/for-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index bbcb33bcaa9d..db001f765aa0 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -972,8 +972,8 @@ gpio_aggregator_device_make_group(struct config_group *group, const char *name) return ERR_PTR(-EINVAL); line = gpio_aggregator_line_alloc(aggr, idx, NULL, -1); - if (!line) - return ERR_PTR(-ENOMEM); + if (IS_ERR(line)) + return ERR_CAST(line); config_group_init_type_name(&line->group, name, &gpio_aggregator_line_type); @@ -1062,8 +1062,8 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) /* Named GPIO line */ scnprintf(name, sizeof(name), "line%u", n); line = gpio_aggregator_line_alloc(aggr, n, key, -1); - if (!line) { - error = -ENOMEM; + if (IS_ERR(line)) { + error = PTR_ERR(line); goto err; } config_group_init_type_name(&line->group, name, @@ -1093,8 +1093,8 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { scnprintf(name, sizeof(name), "line%u", n); line = gpio_aggregator_line_alloc(aggr, n, key, i); - if (!line) { - error = -ENOMEM; + if (IS_ERR(line)) { + error = PTR_ERR(line); goto err; } config_group_init_type_name(&line->group, name, From patchwork Tue Apr 15 06:14:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072692 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRM5rJHz1yJH for ; Tue, 15 Apr 2025 16:15:27 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za7-0007ID-9C; Tue, 15 Apr 2025 06:15:39 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za4-00077l-UF for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:36 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 9A4393F1E4 for ; Tue, 15 Apr 2025 06:15:36 +0000 (UTC) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-736b2a25d9fso3824074b3a.0 for ; Mon, 14 Apr 2025 23:15:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697735; x=1745302535; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TrtBoNcAP2ry1sG0FolSO4eJN85t2BtxRi21t0VbzaM=; b=CK5IvkVP/mDWn5h3EbIb9NZAMCWuqNA1JQVHNlJeKTlSOEnbkN9KT3F/gn0bRkgj/F m8J/oDoxBuDnhHHq99qfbiv7ANXKVefEDwIAbQTpA1QlZV1Lc1vylJBDQTX/TatCDszX 9gLNZgqvWkGgdBcdkNtwU76sHkwTK3iexOpFC7CGvTxcewacZI/7Stt4zjLc+KvyS0w1 loe0Li+sFOiVKPvOITSorjNdHpQYFLw3YyL0t6bzWVXqKXup/r1NIQIEGvDa8/d26NJg OWHtdwRexMqrSgQYdP29Mu2Q457cPvZCxWZFd7wEQNrC/UUWZb/M9TrfcJRX2pFutunq s4xg== X-Gm-Message-State: AOJu0Ywa6VsPxxA+SSx7WxAWx/YuJ2EBRC5IPXo2TTeYcKNDE8SAyBav 8Fl53CyiIpDRev1I7C4ec48/0gvKelpYSIOXvFKr896bktRKv2EDKTP4xRx86Cmkf5Clc0hw8tA spFaT5dMG2zsYiH7wyi7BvMkMm6ZHGqmxWJ/1SKjyD35sN3rSRWpD/Bq6rjjIgh8dNG55yWUyqW ENqHp5IZHq3Q== X-Gm-Gg: ASbGncuY0XHM6BMJUhHnq3/mONPuIZ3lQk4Cfo9lBG0MR74FAlFTSOEHApfg9Y9vEGT x8kAT/Sj82AKLb8ae6f+o7J5jeW+yyQF6x3qHVJ7nZFM4S8zZsZLqN1KVty/ojjJLPPRAB6jOyu EBiwC+2IJ8/6mAKHr+pdQSsRLuIRtNmRSW7V/FVH7NhwYYWzbqe1SW8ELNXjPkPtZSMmxfHN8eh ot8q/npNeXl4G56C/0GTI/h8T0rnriDsYRPC/rnkwsgUkpqCa5bISEEDEHCH1pCvae8n2w8mxTB PZhlRWWycNUVA2hb+JtnMri0AmEkpw== X-Received: by 2002:a05:6a00:1306:b0:736:3979:369e with SMTP id d2e1a72fcca58-73bd11e20femr17346634b3a.9.1744697735026; Mon, 14 Apr 2025 23:15:35 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF+CmxHO8KV6yvh4l7A6ZcRIPFsDsjvQcBf/z4cZhAAmKfWZRP5VTywzcT6lmlWCdQSFTU4nA== X-Received: by 2002:a05:6a00:1306:b0:736:3979:369e with SMTP id d2e1a72fcca58-73bd11e20femr17346610b3a.9.1744697734600; Mon, 14 Apr 2025 23:15:34 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:34 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 15/20] UBUNTU: SAUCE: gpio: aggregator: Return an error if there are no GPIOs in gpio_aggregator_parse() Date: Tue, 15 Apr 2025 15:14:01 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Dan Carpenter BugLink: https://bugs.launchpad.net/bugs/2103496 The error handling in gpio_aggregator_parse() was re-written. It now returns success if there are no GPIOs. Restore the previous behavior and return -EINVAL instead. Fixes: 83c8e3df642f ("gpio: aggregator: expose aggregator created via legacy sysfs to configfs") Signed-off-by: Dan Carpenter Acked-by: Koichiro Den Link: https://lore.kernel.org/r/9dcd5fda7a3819e896d9eee4156e7c46c9a64595.1744452787.git.dan.carpenter@linaro.org Signed-off-by: Bartosz Golaszewski (cherry picked from commit db1baf69e563fc222a75c0add5c76f437c717ac0 gpio/for-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index db001f765aa0..03e0011b3836 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -1116,6 +1116,7 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) if (!n) { pr_err("No GPIOs specified\n"); + error = -EINVAL; goto err; } From patchwork Tue Apr 15 06:14:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072693 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRP2WPqz1yHt for ; Tue, 15 Apr 2025 16:15:29 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4Za8-0007OY-Tr; Tue, 15 Apr 2025 06:15:41 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za6-0007EA-GB for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:38 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 0FE593F1F4 for ; Tue, 15 Apr 2025 06:15:38 +0000 (UTC) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-736c1ea954fso2708704b3a.3 for ; Mon, 14 Apr 2025 23:15:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697736; x=1745302536; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RYm6QWBaeC+V00UUPpyLbgCRTabtUeZez62VXlN/RCg=; b=ty1x5Z9+YRSGj2d0q0uw71ybhhGHM81cxamWQatAfapL/KZNXG7eizxejDciUJ8zqV Lz/TxuUQgDBoOGtb/xk7/+lW+cGwMJPFxwBB0tUdO4IejJaSaUqgyQL0KeiPpxCjvGix ovsCWRXSozIQqGRODC7bHwJxkdhZ2ARC56dHMlKmkIulS8KRzHo5jx5DqrNyf5Xb9PQg VKwXyy0JLi/yMUt9H743z8wE3a7GY8En4WQwXewFMxldkCEKFT00mgwqoKWb0SzuviF+ y9s3r/gHauy3FetprC1GNTXVJg2lP5bNR3H8fIiSfx7qD/PmJ+bhfe/FAteg86ZwUNZb Je0w== X-Gm-Message-State: AOJu0Yw4rxubcX9CqZJlzzvV/25Fm/04nUIQGkGqaxjfd8Pr6MialE2b ydhWB92Au9tzXIcgxQnE9zjEALvzS7r/PcnqwRvFujx8fBeZjLURAoVnniEcVahStuplJ3DODUh MjnSdfRm2decmsawFsRFvlSPT3a8ffVtuhgl0DHYGq8eIk+3acr+YQdLG9Ndb2gVFWzFJaYxk/F GnK86gEkVH0w== X-Gm-Gg: ASbGnct6//uzPsv2o7duEQrfZmlZII3j11o9pAQbYFYIlxvolFjxX3HG1zw94LGDDkK hHM6sN41fgkVhj3cwoZQyAGSaAvd5gTqJ7wvP5+ODtCKhS5F5N2iQrQFs3OUOKDDTUQM7BOgW0H lDalrNSCTd+VgVFxCiQvNgFoNnmGh6z2K9LfAjOtK09tevRwBONfwxtFIYPEf2bGsPIAMpvhNoF 7WbQe5u2nrtJLktfaDxVa3FTdQMr3jWIH6fkliMBgpzsBgHmlELO6SQdbwgccWbrDeRdv1BE/1r A0o4VkpkkvhJLfSm84EEl5o8A59K/Q== X-Received: by 2002:a05:6a20:9f49:b0:1f5:80a3:b006 with SMTP id adf61e73a8af0-201797b80fcmr21867705637.21.1744697736374; Mon, 14 Apr 2025 23:15:36 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG7q7imo7tiJS4MKeIZSGItEmJfUtI7XGF4T3bQaLkUwzNE4aahYJspNEDAccrgDA8kjslonw== X-Received: by 2002:a05:6a20:9f49:b0:1f5:80a3:b006 with SMTP id adf61e73a8af0-201797b80fcmr21867684637.21.1744697736053; Mon, 14 Apr 2025 23:15:36 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:35 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 16/20] UBUNTU: SAUCE: gpio: aggregator: Fix leak in gpio_aggregator_parse() Date: Tue, 15 Apr 2025 15:14:02 +0900 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Dan Carpenter BugLink: https://bugs.launchpad.net/bugs/2103496 Call gpio_aggregator_free_lines() before returning on this error path. Fixes: 83c8e3df642f ("gpio: aggregator: expose aggregator created via legacy sysfs to configfs") Signed-off-by: Dan Carpenter Acked-by: Koichiro Den Link: https://lore.kernel.org/r/e023bfe52509ce1bef6209ec7c47e99279c551dd.1744452787.git.dan.carpenter@linaro.org Signed-off-by: Bartosz Golaszewski (cherry picked from commit d945ff52642d98eb6fa191f88a9cfde729129395 gpio/for-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 03e0011b3836..7a15432d0bef 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -1087,7 +1087,7 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) error = bitmap_parselist(offsets, bitmap, AGGREGATOR_MAX_GPIOS); if (error) { pr_err("Cannot parse %s: %d\n", offsets, error); - return error; + goto err; } for_each_set_bit(i, bitmap, AGGREGATOR_MAX_GPIOS) { From patchwork Tue Apr 15 06:14:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072694 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRQ2pVNz1yHt for ; Tue, 15 Apr 2025 16:15:30 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZaA-0007Tv-83; Tue, 15 Apr 2025 06:15:42 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za8-0007LW-4k for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:40 +0000 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id B6BF23F1E4 for ; Tue, 15 Apr 2025 06:15:39 +0000 (UTC) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-7391d68617cso4821711b3a.0 for ; Mon, 14 Apr 2025 23:15:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697738; x=1745302538; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y4clEjlaRHgbV32K4YVg7+S6HstaPqyfkTijaTpLUNI=; b=o6O7id+H28S51Eyn/wLL5x8OYtA1zNbgomt7wTFYKuqh5+Lxw/EvBUkSsWNQYrvbVK GHZijlfsopt/qP5qTBzx7CpfBfcETXZ0IzJaKE3xMevTIPzqUpx30cTbSHU1umHhvAuM XN8zWECnDEu6Bo4yoEpEmbSvrJ5c3/NBuLOmNR8mUbSoBq2sV+36WGFtVkwLP6URfz7U krxtRCk4FZhEQeRau76X3W2tLYrJUXlMF/9fXrXnBzeK0pKtvI0GOAo/26K6OIaSktg9 J4b/MC5OG+T2AZIcBuClsRiFQWNPIfZ0gZTaJovO+uRiOfGcLujYADptC2uku6hGqSg7 0L4Q== X-Gm-Message-State: AOJu0YywOZquqaPWllFzU5aG/+CRgxGtwyUD/n8zjjz5ZwkM1YbzZD/n QKlTiHSYSo7pO00C3pLBMcGlVN5Lw36yK/hSNMiStFFgQwysLQGFNhb10pxnDD93CuntbRqtXXz h/5bRBShJup2gVDHWF5THKXfNHVXK6CWMZOnq5Cm2qZ7tcpuptf36hywNwElpsUse2v+UJcHwwW 51Egb8nYlCgA== X-Gm-Gg: ASbGncv1sd5v1MpxXY+RmDg1tcKISH4xRp0GyfKIykBHhmeLpJogiWW9ymNggv7oOMj c/txZu9deRKwhFA8qLlhRwAq4mT0EckJXY/1OJBoL2IIe057PmM1OCnqHVrGFFz0CjOEhDA3pNb ZgTcgFJbgs8ZDqFdagbRSGmgglhHwyWGjxqFMZikNZk1tsBRP26G3tEsNBotsO/Te3ZOZKfR+S/ DClmuJxDyMtUuYaAiQmQOSNf42wMS+/faB8SaR/rgvvyi+KM/X+c/BwahhGkNgQa0xGocYhtbHG lk/LEM/pnN+3IWZhWCR4XhR7CCrxMw== X-Received: by 2002:a05:6a00:f0a:b0:734:26c6:26d3 with SMTP id d2e1a72fcca58-73c0c8d3ffbmr4064913b3a.5.1744697738033; Mon, 14 Apr 2025 23:15:38 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEvWuiK2fy0TU13tAkTrh3bcf36pfGCsdlTUwvZ8Izs3vtl8OhGEBDepaBPw/Ckkj6qzI6oMQ== X-Received: by 2002:a05:6a00:f0a:b0:734:26c6:26d3 with SMTP id d2e1a72fcca58-73c0c8d3ffbmr4064876b3a.5.1744697737586; Mon, 14 Apr 2025 23:15:37 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:37 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 17/20] gpio: aggregator: cancel deferred probe for devices created via configfs Date: Tue, 15 Apr 2025 15:14:03 +0900 Message-ID: <067de39bac91eab3938f6e8950702bed517fca48.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 For aggregators initialized via configfs, write 1 to 'live' waits for probe completion and returns an error if the probe fails, unlike the legacy sysfs interface, which is asynchronous. Since users control the liveness of the aggregator device and might be editing configurations while 'live' is 0, deferred probing is both unnatural and unsafe. Cancel deferred probe for purely configfs-based aggregators when probe fails. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-8-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 0269c768de1b5e430c3f9a6869261606c82abe90 linux-next) Signed-off-by: Koichiro Den --- drivers/gpio/gpio-aggregator.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 7a15432d0bef..d4e746e88eab 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -72,6 +72,10 @@ struct gpio_aggregator_line { enum gpio_lookup_flags flags; }; +struct gpio_aggregator_pdev_meta { + bool init_via_sysfs; +}; + static DEFINE_MUTEX(gpio_aggregator_lock); /* protects idr */ static DEFINE_IDR(gpio_aggregator_idr); @@ -1130,6 +1134,7 @@ static int gpio_aggregator_parse(struct gpio_aggregator *aggr) static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, const char *buf, size_t count) { + struct gpio_aggregator_pdev_meta meta = { .init_via_sysfs = true }; char name[CONFIGFS_ITEM_NAME_LEN]; struct gpio_aggregator *aggr; struct platform_device *pdev; @@ -1180,7 +1185,7 @@ static ssize_t gpio_aggregator_new_device_store(struct device_driver *driver, gpiod_add_lookup_table(aggr->lookups); - pdev = platform_device_register_simple(DRV_NAME, aggr->id, NULL, 0); + pdev = platform_device_register_data(NULL, DRV_NAME, aggr->id, &meta, sizeof(meta)); if (IS_ERR(pdev)) { res = PTR_ERR(pdev); goto remove_table; @@ -1273,7 +1278,9 @@ ATTRIBUTE_GROUPS(gpio_aggregator); static int gpio_aggregator_probe(struct platform_device *pdev) { + struct gpio_aggregator_pdev_meta *meta; struct device *dev = &pdev->dev; + bool init_via_sysfs = false; struct gpio_desc **descs; struct gpiochip_fwd *fwd; unsigned long features; @@ -1287,10 +1294,28 @@ static int gpio_aggregator_probe(struct platform_device *pdev) if (!descs) return -ENOMEM; + meta = dev_get_platdata(&pdev->dev); + if (meta && meta->init_via_sysfs) + init_via_sysfs = true; + for (i = 0; i < n; i++) { descs[i] = devm_gpiod_get_index(dev, NULL, i, GPIOD_ASIS); - if (IS_ERR(descs[i])) + if (IS_ERR(descs[i])) { + /* + * Deferred probing is not suitable when the aggregator + * is created via configfs. They should just retry later + * whenever they like. For device creation via sysfs, + * error is propagated without overriding for backward + * compatibility. .prevent_deferred_probe is kept unset + * for other cases. + */ + if (!init_via_sysfs && !dev_of_node(dev) && + descs[i] == ERR_PTR(-EPROBE_DEFER)) { + pr_warn("Deferred probe canceled for creation via configfs.\n"); + return -ENODEV; + } return PTR_ERR(descs[i]); + } } features = (uintptr_t)device_get_match_data(dev); From patchwork Tue Apr 15 06:14:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072695 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRS6MXPz1yHt for ; Tue, 15 Apr 2025 16:15:32 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZaD-0007h0-52; Tue, 15 Apr 2025 06:15:45 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4Za9-0007TH-Ux for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:42 +0000 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 4D88F3F1ED for ; Tue, 15 Apr 2025 06:15:41 +0000 (UTC) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-7398d70abbfso6641529b3a.2 for ; Mon, 14 Apr 2025 23:15:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697740; x=1745302540; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CZ6kElinfxeAlNz/rA9L6uEGTm7s2zy36MrQb/qdn0I=; b=ku51N5AFSan8oKFLLSVK/7OGFu3szyBv9LjQcLQ9On37N7ubbWWcZR5vPRKfMU+kRO whSalJe3BY3NSZSKiCgZsc98XxSn+RhIxrMx00ol03ZEvwnEWWYfzp8rhP4QGcxc2z6d 5jlk+WzwKBrWPGU903zVfL5QgZsEja0QNAASBTBGUHjaJuX4T1uLbVIDf/NDFORxFA4k t7Tu3Qi4C7/sgX6/gxXtQvcGyzhhr+k9ZkxzTPWmFGaDAio6wAt79vf3eNgdgmlmaMcP PVVElXxG5HBKmsuAd0OunGWRjMQwMwG7othvWPHTHVXXv3dZJTEDRMJI5pMqjltLZ1L2 4JRw== X-Gm-Message-State: AOJu0YxpkLqQcovn2HP+LnX5EJ2+b+RdQ9+ampAQ8SjR1ViZPPvIDl1K J/4q50Ap4o0FiQpJk1E5YJv97VO5vU4jnw5zsLQvAqbH1MiVHrgUriVXsxUg0V/C//Ud0ox6/ON hKdrtlcN2zVVEL7V36jtH4mBPHfuFDgeC07eHzSi5Wlr8XTJrZko8/T+90pMoLuWDz0mRWFOwpX x8suSjrM92mA== X-Gm-Gg: ASbGncsSOYW5hpYhyJg3B/flY+aIXR4R/RkdcLy2SCl/DmDzt/KL0Fc0z4fZR/A4ufe QlocPOBlDscBqSuWOtVDvNt1DtYMJjPioUyvPpCkq7XeF9KUfpmn8+xKYWBNV5DhfwLgo8WJLqa FsfXWIrm98WLgrSpeBT4PeziNtGfyZseHsqtF61EX4YP5j43U8aCqDno/hDVtBIVQN1H/GGi3y8 PA1tEehTXRYpEsiLyHydDSgxjOwGBFncy87mvvCPd0NBntX0jrAVcEqWqqbr3wtH9NiByKG/wXt x3SoKrXcLZ2L4mOWEdabjCs8WZPYgg== X-Received: by 2002:a05:6a00:ac2:b0:730:97a6:f04 with SMTP id d2e1a72fcca58-73bd11bde4fmr17254303b3a.7.1744697739490; Mon, 14 Apr 2025 23:15:39 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHmZDDp40YYs/JG7bL/JXOWoQviSYvyZolZfkVSf/hRBU+x1uuOhxD0j0Up+/5+duD0W8WNBQ== X-Received: by 2002:a05:6a00:ac2:b0:730:97a6:f04 with SMTP id d2e1a72fcca58-73bd11bde4fmr17254269b3a.7.1744697739003; Mon, 14 Apr 2025 23:15:39 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:38 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 18/20] Documentation: gpio: document configfs interface for gpio-aggregator Date: Tue, 15 Apr 2025 15:14:04 +0900 Message-ID: <76529e96803869f1d4d6c98e0ac8dad37319825f.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Add documentation for the newly added configfs-based interface for GPIO aggregator. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-9-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 10f94d092bba9ab08004c624c604e976e6e3cd22 linux-next) Signed-off-by: Koichiro Den --- .../admin-guide/gpio/gpio-aggregator.rst | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/Documentation/admin-guide/gpio/gpio-aggregator.rst b/Documentation/admin-guide/gpio/gpio-aggregator.rst index 5cd1e7221756..8374a9df9105 100644 --- a/Documentation/admin-guide/gpio/gpio-aggregator.rst +++ b/Documentation/admin-guide/gpio/gpio-aggregator.rst @@ -69,6 +69,113 @@ write-only attribute files in sysfs. $ echo gpio-aggregator.0 > delete_device +Aggregating GPIOs using Configfs +-------------------------------- + +**Group:** ``/config/gpio-aggregator`` + + This is the root directory of the gpio-aggregator configfs tree. + +**Group:** ``/config/gpio-aggregator/`` + + This directory represents a GPIO aggregator device. You can assign any + name to ```` (e.g. ``agg0``), except names starting with + ``_sysfs`` prefix, which are reserved for auto-generated configfs + entries corresponding to devices created via Sysfs. + +**Attribute:** ``/config/gpio-aggregator//live`` + + The ``live`` attribute allows to trigger the actual creation of the device + once it's fully configured. Accepted values are: + + * ``1``, ``yes``, ``true`` : enable the virtual device + * ``0``, ``no``, ``false`` : disable the virtual device + +**Attribute:** ``/config/gpio-aggregator//dev_name`` + + The read-only ``dev_name`` attribute exposes the name of the device as it + will appear in the system on the platform bus (e.g. ``gpio-aggregator.0``). + This is useful for identifying a character device for the newly created + aggregator. If it's ``gpio-aggregator.0``, + ``/sys/devices/platform/gpio-aggregator.0/gpiochipX`` path tells you that the + GPIO device id is ``X``. + +You must create subdirectories for each virtual line you want to +instantiate, named exactly as ``line0``, ``line1``, ..., ``lineY``, when +you want to instantiate ``Y+1`` (Y >= 0) lines. Configure all lines before +activating the device by setting ``live`` to 1. + +**Group:** ``/config/gpio-aggregator///`` + + This directory represents a GPIO line to include in the aggregator. + +**Attribute:** ``/config/gpio-aggregator///key`` + +**Attribute:** ``/config/gpio-aggregator///offset`` + + The default values after creating the ```` directory are: + + * ``key`` : + * ``offset`` : -1 + + ``key`` must always be explicitly configured, while ``offset`` depends. + Two configuration patterns exist for each ````: + + (a). For lookup by GPIO line name: + + * Set ``key`` to the line name. + * Ensure ``offset`` remains -1 (the default). + + (b). For lookup by GPIO chip name and the line offset within the chip: + + * Set ``key`` to the chip name. + * Set ``offset`` to the line offset (0 <= ``offset`` < 65535). + +**Attribute:** ``/config/gpio-aggregator///name`` + + The ``name`` attribute sets a custom name for lineY. If left unset, the + line will remain unnamed. + +Once the configuration is done, the ``'live'`` attribute must be set to 1 +in order to instantiate the aggregator device. It can be set back to 0 to +destroy the virtual device. The module will synchronously wait for the new +aggregator device to be successfully probed and if this doesn't happen, writing +to ``'live'`` will result in an error. This is a different behaviour from the +case when you create it using sysfs ``new_device`` interface. + +.. note:: + + For aggregators created via Sysfs, the configfs entries are + auto-generated and appear as ``/config/gpio-aggregator/_sysfs./``. You + cannot add or remove line directories with mkdir(2)/rmdir(2). To modify + lines, you must use the "delete_device" interface to tear down the + existing device and reconfigure it from scratch. However, you can still + toggle the aggregator with the ``live`` attribute and adjust the + ``key``, ``offset``, and ``name`` attributes for each line when ``live`` + is set to 0 by hand (i.e. it's not waiting for deferred probe). + +Sample configuration commands +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: sh + + # Create a directory for an aggregator device + $ mkdir /sys/kernel/config/gpio-aggregator/agg0 + + # Configure each line + $ mkdir /sys/kernel/config/gpio-aggregator/agg0/line0 + $ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line0/key + $ echo 6 > /sys/kernel/config/gpio-aggregator/agg0/line0/offset + $ echo test0 > /sys/kernel/config/gpio-aggregator/agg0/line0/name + $ mkdir /sys/kernel/config/gpio-aggregator/agg0/line1 + $ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line1/key + $ echo 7 > /sys/kernel/config/gpio-aggregator/agg0/line1/offset + $ echo test1 > /sys/kernel/config/gpio-aggregator/agg0/line1/name + + # Activate the aggregator device + $ echo 1 > /sys/kernel/config/gpio-aggregator/agg0/live + + Generic GPIO Driver ------------------- From patchwork Tue Apr 15 06:14:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072697 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRX0jjmz1yHt for ; Tue, 15 Apr 2025 16:15:36 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZaG-0007xj-4K; Tue, 15 Apr 2025 06:15:48 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZaB-0007b1-VI for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:44 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 450BD3F1E4 for ; Tue, 15 Apr 2025 06:15:43 +0000 (UTC) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-736cb72efd5so4518550b3a.3 for ; Mon, 14 Apr 2025 23:15:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697742; x=1745302542; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IZ/lLH1g7ZBdFIghO7vkn0UTastMX5NLJd4EZFr6sDA=; b=przMP5wbAU0+LclWnUX2dyUQM84k0yx7JpHR3rvABAv90A2UDKgwoSC98v/KZgQc34 hin7snTI9SFsRTnBj69KtmBJb/QpEb6H4o/EqxZPaVwoWDuX1vC0Z4UZesfJv0Gg3mkS 82YvKINWYv+etVsaWVX7ANNuaqQr5FKBX7j9sEUxW0PuF3Guj9Yu/0ARa2PSkA3nU3vl wzUPRnwjWUEXmDTp7SX0kZxuH4e+HwTGPtm0T9uiSUt8+bjtpUzZxG5CPoHKLRjv86GG 34Jp8U1URaSpX+KkpdMOX1/vD6FfmcWPcUyGlnalpc9KjiUlo1/EhfFnc0QmR4yUA33F 20KA== X-Gm-Message-State: AOJu0YzBtu6cNoCueMrknfIEj7PSMFbjZCXz5YDaH8X1ZGMzZCgbG0bO Iw+W5Jyyi1OGotJ5T0aC1BhWZmbqQHG6mnZqvMGBoJ9/SXQz40IeMpQKeQykEtWrGPYsMc3b/Ag zh5LZB6i+/6YBzfu0O1iFdNLOCn/HbzzQbQJZWShnAt3ckLCuDSH2WO1k1hey1+wJwaRddcCmi7 tshGjaVtB5nQ== X-Gm-Gg: ASbGncvkeoaASfZyiw3Ob8wEpDA+auV7Zf03jMHZ9oNM/Yyc9QL9+3045j9b7XbZ58B TXDR0TnTT6kj+wvfai2QNqsqvPq+yWhrfGmHIwWe1ZyZSUnwuMZPCr0QC9WDFdoQRowwzCzMrZ1 TAbeZ37NOSB8SiHQpw1wJU3m7E9SipOGfd293sYO7En9/s7OF9chSx5k2ogsAlnRlwQYg5eO5qM B2I6ZaLq0JTZRwzQm9Lf/GaXXmmkC9iK+MLYCYHk/j599QBZnrro1VRFk/yA9M5C0VO6jsJj5kq Nu69OtmBiXmD3TpQvKuEUlL8w5+/aA== X-Received: by 2002:a05:6a20:6f01:b0:1f5:5903:edcf with SMTP id adf61e73a8af0-2017979b61dmr21186729637.16.1744697741294; Mon, 14 Apr 2025 23:15:41 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFxibg/5BXfBftQi4zU7N940aocb0KotghQAB3J9yboevXbMkyqNaIdinjvvsRwu8LZEHzRwg== X-Received: by 2002:a05:6a20:6f01:b0:1f5:5903:edcf with SMTP id adf61e73a8af0-2017979b61dmr21186664637.16.1744697740522; Mon, 14 Apr 2025 23:15:40 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:39 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 19/20] selftests: gpio: add test cases for gpio-aggregator Date: Tue, 15 Apr 2025 15:14:05 +0900 Message-ID: <1b29b68d1a47c58f989768f342816534198122cf.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 Add a set of tests for gpio-aggregator module. This test covers both pre-existing new_device/delete_device interface and new configfs-based interface. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250407043019.4105613-10-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 6d7f0c1103ef3935eb3f302d09af4ef9e85212a3 linux-next) Signed-off-by: Koichiro Den --- tools/testing/selftests/gpio/Makefile | 2 +- tools/testing/selftests/gpio/config | 1 + .../testing/selftests/gpio/gpio-aggregator.sh | 723 ++++++++++++++++++ 3 files changed, 725 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/gpio/gpio-aggregator.sh diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile index e0884390447d..7bfe315f7001 100644 --- a/tools/testing/selftests/gpio/Makefile +++ b/tools/testing/selftests/gpio/Makefile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 -TEST_PROGS := gpio-mockup.sh gpio-sim.sh +TEST_PROGS := gpio-mockup.sh gpio-sim.sh gpio-aggregator.sh TEST_FILES := gpio-mockup-sysfs.sh TEST_GEN_PROGS_EXTENDED := gpio-mockup-cdev gpio-chip-info gpio-line-name CFLAGS += -O2 -g -Wall $(KHDR_INCLUDES) diff --git a/tools/testing/selftests/gpio/config b/tools/testing/selftests/gpio/config index 409a8532facc..1287abeaac7e 100644 --- a/tools/testing/selftests/gpio/config +++ b/tools/testing/selftests/gpio/config @@ -2,3 +2,4 @@ CONFIG_GPIOLIB=y CONFIG_GPIO_CDEV=y CONFIG_GPIO_MOCKUP=m CONFIG_GPIO_SIM=m +CONFIG_GPIO_AGGREGATOR=m diff --git a/tools/testing/selftests/gpio/gpio-aggregator.sh b/tools/testing/selftests/gpio/gpio-aggregator.sh new file mode 100755 index 000000000000..f1bab62c4cd2 --- /dev/null +++ b/tools/testing/selftests/gpio/gpio-aggregator.sh @@ -0,0 +1,723 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2025 Bartosz Golaszewski +# Copyright (C) 2025 Koichiro Den + +BASE_DIR=$(dirname "$0") +CONFIGFS_SIM_DIR="/sys/kernel/config/gpio-sim" +CONFIGFS_AGG_DIR="/sys/kernel/config/gpio-aggregator" +SYSFS_AGG_DIR="/sys/bus/platform/drivers/gpio-aggregator" +MODULE="gpio-aggregator" + +fail() { + echo "$*" >&2 + echo "GPIO $MODULE test FAIL" + exit 1 +} + +skip() { + echo "$*" >&2 + echo "GPIO $MODULE test SKIP" + exit 4 +} + +# gpio-sim +sim_enable_chip() { + local CHIP=$1 + + echo 1 > "$CONFIGFS_SIM_DIR/$CHIP/live" || fail "Unable to enable the chip" +} + +sim_disable_chip() { + local CHIP=$1 + + echo 0 > "$CONFIGFS_SIM_DIR/$CHIP/live" || fail "Unable to disable the chip" +} + +sim_configfs_cleanup() { + local NOCHECK=${1:-0} + + for CHIP_DIR in "$CONFIGFS_SIM_DIR"/*; do + [ -d "$CHIP_DIR" ] || continue + echo 0 > "$CHIP_DIR/live" + find "$CHIP_DIR" -depth -type d -exec rmdir {} \; + done + [ "$NOCHECK" -eq 1 ] && return; + remaining=$(find "$CONFIGFS_SIM_DIR" -mindepth 1 -type d 2> /dev/null) + if [ -n "$remaining" ]; then + fail "Directories remain in $CONFIGFS_SIM_DIR: $remaining" + fi +} + +sim_get_chip_label() { + local CHIP=$1 + local BANK=$2 + local CHIP_NAME=$(cat "$CONFIGFS_SIM_DIR/$CHIP/$BANK/chip_name" 2> /dev/null) || \ + fail "Unable to read the chip name from configfs" + + $BASE_DIR/gpio-chip-info "/dev/$CHIP_NAME" label || \ + fail "Unable to read the chip label from the character device" +} + +# gpio-aggregator +agg_create_chip() { + local CHIP=$1 + + mkdir "$CONFIGFS_AGG_DIR/$CHIP" +} + +agg_remove_chip() { + local CHIP=$1 + + find "$CONFIGFS_AGG_DIR/$CHIP/" -depth -type d -exec rmdir {} \; || \ + fail "Unable to remove $CONFIGFS_AGG_DIR/$CHIP" +} + +agg_create_line() { + local CHIP=$1 + local LINE=$2 + + mkdir "$CONFIGFS_AGG_DIR/$CHIP/$LINE" +} + +agg_remove_line() { + local CHIP=$1 + local LINE=$2 + + rmdir "$CONFIGFS_AGG_DIR/$CHIP/$LINE" +} + +agg_set_key() { + local CHIP=$1 + local LINE=$2 + local KEY=$3 + + echo "$KEY" > "$CONFIGFS_AGG_DIR/$CHIP/$LINE/key" || fail "Unable to set the lookup key" +} + +agg_set_offset() { + local CHIP=$1 + local LINE=$2 + local OFFSET=$3 + + echo "$OFFSET" > "$CONFIGFS_AGG_DIR/$CHIP/$LINE/offset" || \ + fail "Unable to set the lookup offset" +} + +agg_set_line_name() { + local CHIP=$1 + local LINE=$2 + local NAME=$3 + + echo "$NAME" > "$CONFIGFS_AGG_DIR/$CHIP/$LINE/name" || fail "Unable to set the line name" +} + +agg_enable_chip() { + local CHIP=$1 + + echo 1 > "$CONFIGFS_AGG_DIR/$CHIP/live" || fail "Unable to enable the chip" +} + +agg_disable_chip() { + local CHIP=$1 + + echo 0 > "$CONFIGFS_AGG_DIR/$CHIP/live" || fail "Unable to disable the chip" +} + +agg_configfs_cleanup() { + local NOCHECK=${1:-0} + + for CHIP_DIR in "$CONFIGFS_AGG_DIR"/*; do + [ -d "$CHIP_DIR" ] || continue + echo 0 > "$CHIP_DIR/live" 2> /dev/null + find "$CHIP_DIR" -depth -type d -exec rmdir {} \; + done + [ "$NOCHECK" -eq 1 ] && return; + remaining=$(find "$CONFIGFS_AGG_DIR" -mindepth 1 -type d 2> /dev/null) + if [ -n "$remaining" ]; then + fail "Directories remain in $CONFIGFS_AGG_DIR: $remaining" + fi +} + +agg_configfs_dev_name() { + local CHIP=$1 + + cat "$CONFIGFS_AGG_DIR/$CHIP/dev_name" 2> /dev/null || \ + fail "Unable to read the device name from configfs" +} + +agg_configfs_chip_name() { + local CHIP=$1 + local DEV_NAME=$(agg_configfs_dev_name "$CHIP") + local CHIP_LIST=$(find "/sys/devices/platform/$DEV_NAME" \ + -maxdepth 1 -type d -name "gpiochip[0-9]*" 2> /dev/null) + local CHIP_COUNT=$(echo "$CHIP_LIST" | wc -l) + + if [ -z "$CHIP_LIST" ]; then + fail "No gpiochip in /sys/devices/platform/$DEV_NAME/" + elif [ "$CHIP_COUNT" -ne 1 ]; then + fail "Multiple gpiochips unexpectedly found: $CHIP_LIST" + fi + basename "$CHIP_LIST" +} + +agg_get_chip_num_lines() { + local CHIP=$1 + local N_DIR=$(ls -d $CONFIGFS_AGG_DIR/$CHIP/line[0-9]* 2> /dev/null | wc -l) + local N_LINES + + if [ "$(cat $CONFIGFS_AGG_DIR/$CHIP/live)" = 0 ]; then + echo "$N_DIR" + else + N_LINES=$( + $BASE_DIR/gpio-chip-info \ + "/dev/$(agg_configfs_chip_name "$CHIP")" num-lines + ) || fail "Unable to read the number of lines from the character device" + if [ $N_DIR != $N_LINES ]; then + fail "Discrepancy between two sources for the number of lines" + fi + echo "$N_LINES" + fi +} + +agg_get_chip_label() { + local CHIP=$1 + + $BASE_DIR/gpio-chip-info "/dev/$(agg_configfs_chip_name "$CHIP")" label || \ + fail "Unable to read the chip label from the character device" +} + +agg_get_line_name() { + local CHIP=$1 + local OFFSET=$2 + local NAME_CONFIGFS=$(cat "$CONFIGFS_AGG_DIR/$CHIP/line${OFFSET}/name") + local NAME_CDEV + + if [ "$(cat "$CONFIGFS_AGG_DIR/$CHIP/live")" = 0 ]; then + echo "$NAME_CONFIGFS" + else + NAME_CDEV=$( + $BASE_DIR/gpio-line-name \ + "/dev/$(agg_configfs_chip_name "$CHIP")" "$OFFSET" + ) || fail "Unable to read the line name from the character device" + if [ "$NAME_CONFIGFS" != "$NAME_CDEV" ]; then + fail "Discrepancy between two sources for the name of line" + fi + echo "$NAME_CDEV" + fi +} + + +# Load the modules. This will pull in configfs if needed too. +modprobe gpio-sim || skip "unable to load the gpio-sim module" +modprobe gpio-aggregator || skip "unable to load the gpio-aggregator module" + +# Make sure configfs is mounted at /sys/kernel/config. Wait a bit if needed. +for IDX in $(seq 5); do + if [ "$IDX" -eq "5" ]; then + skip "configfs not mounted at /sys/kernel/config" + fi + + mountpoint -q /sys/kernel/config && break + sleep 0.1 +done + +# If the module was already loaded: remove all previous chips +agg_configfs_cleanup +sim_configfs_cleanup + +trap "exit 1" SIGTERM SIGINT +trap "agg_configfs_cleanup 1; sim_configfs_cleanup 1" EXIT + +# Use gpio-sim chips as the test backend +for CHIP in $(seq -f "chip%g" 0 1); do + mkdir $CONFIGFS_SIM_DIR/$CHIP + for BANK in $(seq -f "bank%g" 0 1); do + mkdir -p "$CONFIGFS_SIM_DIR/$CHIP/$BANK" + echo "${CHIP}_${BANK}" > "$CONFIGFS_SIM_DIR/$CHIP/$BANK/label" || \ + fail "unable to set the chip label" + echo 16 > "$CONFIGFS_SIM_DIR/$CHIP/$BANK/num_lines" || \ + fail "unable to set the number of lines" + for IDX in $(seq 0 15); do + LINE_NAME="${CHIP}${BANK}_${IDX}" + LINE_DIR="$CONFIGFS_SIM_DIR/$CHIP/$BANK/line$IDX" + mkdir -p $LINE_DIR + echo "$LINE_NAME" > "$LINE_DIR/name" || fail "unable to set the line name" + done + done + sim_enable_chip "$CHIP" +done + +echo "1. GPIO aggregator creation/deletion" + +echo "1.1. Creation/deletion via configfs" + +echo "1.1.1. Minimum creation/deletion" +agg_create_chip agg0 +agg_create_line agg0 line0 +agg_set_key agg0 line0 "$(sim_get_chip_label chip0 bank0)" +agg_set_offset agg0 line0 5 +agg_set_line_name agg0 line0 test0 +agg_enable_chip agg0 +test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 1 || fail "chip unexpectedly dead" +test "$(agg_get_chip_label agg0)" = "$(agg_configfs_dev_name agg0)" || \ + fail "label is inconsistent" +test "$(agg_get_chip_num_lines agg0)" = "1" || fail "number of lines is not 1" +test "$(agg_get_line_name agg0 0)" = "test0" || fail "line name is unset" +agg_disable_chip agg0 +agg_remove_line agg0 line0 +agg_remove_chip agg0 + +echo "1.1.2. Complex creation/deletion" +agg_create_chip agg0 +agg_create_line agg0 line0 +agg_create_line agg0 line1 +agg_create_line agg0 line2 +agg_create_line agg0 line3 +agg_set_key agg0 line0 "$(sim_get_chip_label chip0 bank0)" +agg_set_key agg0 line1 "$(sim_get_chip_label chip0 bank1)" +agg_set_key agg0 line2 "$(sim_get_chip_label chip1 bank0)" +agg_set_key agg0 line3 "$(sim_get_chip_label chip1 bank1)" +agg_set_offset agg0 line0 1 +agg_set_offset agg0 line1 3 +agg_set_offset agg0 line2 5 +agg_set_offset agg0 line3 7 +agg_set_line_name agg0 line0 test0 +agg_set_line_name agg0 line1 test1 +agg_set_line_name agg0 line2 test2 +agg_set_line_name agg0 line3 test3 +agg_enable_chip agg0 +test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 1 || fail "chip unexpectedly dead" +test "$(agg_get_chip_label agg0)" = "$(agg_configfs_dev_name agg0)" || \ + fail "label is inconsistent" +test "$(agg_get_chip_num_lines agg0)" = "4" || fail "number of lines is not 1" +test "$(agg_get_line_name agg0 0)" = "test0" || fail "line name is unset" +test "$(agg_get_line_name agg0 1)" = "test1" || fail "line name is unset" +test "$(agg_get_line_name agg0 2)" = "test2" || fail "line name is unset" +test "$(agg_get_line_name agg0 3)" = "test3" || fail "line name is unset" +agg_disable_chip agg0 +agg_remove_line agg0 line0 +agg_remove_line agg0 line1 +agg_remove_line agg0 line2 +agg_remove_line agg0 line3 +agg_remove_chip agg0 + +echo "1.1.3. Can't instantiate a chip without any line" +agg_create_chip agg0 +echo 1 > "$CONFIGFS_AGG_DIR/agg0/live" 2> /dev/null && fail "chip unexpectedly enabled" +test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 0 || fail "chip unexpectedly alive" +agg_remove_chip agg0 + +echo "1.1.4. Can't instantiate a chip with invalid configuration" +agg_create_chip agg0 +agg_create_line agg0 line0 +agg_set_key agg0 line0 "chipX_bankX" +agg_set_offset agg0 line0 99 +agg_set_line_name agg0 line0 test0 +echo 1 > "$CONFIGFS_AGG_DIR/agg0/live" 2> /dev/null && fail "chip unexpectedly enabled" +test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 0 || fail "chip unexpectedly alive" +agg_remove_line agg0 line0 +agg_remove_chip agg0 + +echo "1.1.5. Can't instantiate a chip asynchronously via deferred probe" +agg_create_chip agg0 +agg_create_line agg0 line0 +agg_set_key agg0 line0 "chip0_bank0" +agg_set_offset agg0 line0 5 +agg_set_line_name agg0 line0 test0 +sim_disable_chip chip0 +echo 1 > "$CONFIGFS_AGG_DIR/agg0/live" 2> /dev/null && fail "chip unexpectedly enabled" +test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 0 || fail "chip unexpectedly alive" +sim_enable_chip chip0 +sleep 1 +test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 0 || \ + fail "chip unexpectedly transitioned to 'live' state" +agg_remove_line agg0 line0 +agg_remove_chip agg0 + +echo "1.2. Creation/deletion via sysfs" + +echo "1.2.1. Minimum creation/deletion" +echo "chip0_bank0 0" > "$SYSFS_AGG_DIR/new_device" +CHIPNAME=$(agg_configfs_chip_name _sysfs.0) +test "$(cat "$CONFIGFS_AGG_DIR/_sysfs.0/live")" = 1 || fail "chip unexpectedly dead" +test "$(agg_get_chip_label _sysfs.0)" = "$(agg_configfs_dev_name _sysfs.0)" || \ + fail "label is inconsistent" +test "$(agg_get_chip_num_lines _sysfs.0)" = "1" || fail "number of lines is not 1" +test "$(agg_get_line_name _sysfs.0 0)" = "" || fail "line name is unset" +echo "$(agg_configfs_dev_name _sysfs.0)" > "$SYSFS_AGG_DIR/delete_device" +test -d $CONFIGFS_AGG_DIR/_sysfs.0 && fail "_sysfs.0 unexpectedly remains" +test -d /dev/${CHIPNAME} && fail "/dev/${CHIPNAME} unexpectedly remains" + +echo "1.2.2. Complex creation/deletion" +echo "chip0bank0_0 chip1_bank1 10-11" > "$SYSFS_AGG_DIR/new_device" +CHIPNAME=$(agg_configfs_chip_name _sysfs.0) +test "$(cat "$CONFIGFS_AGG_DIR/_sysfs.0/live")" = 1 || fail "chip unexpectedly dead" +test "$(agg_get_chip_label _sysfs.0)" = "$(agg_configfs_dev_name _sysfs.0)" || \ + fail "label is inconsistent" +test "$(agg_get_chip_num_lines _sysfs.0)" = "3" || fail "number of lines is not 3" +test "$(agg_get_line_name _sysfs.0 0)" = "" || fail "line name is unset" +test "$(agg_get_line_name _sysfs.0 1)" = "" || fail "line name is unset" +test "$(agg_get_line_name _sysfs.0 2)" = "" || fail "line name is unset" +echo "$(agg_configfs_dev_name _sysfs.0)" > "$SYSFS_AGG_DIR/delete_device" +test -d $CONFIGFS_AGG_DIR/_sysfs.0 && fail "_sysfs.0 unexpectedly remains" +test -d /dev/${CHIPNAME} && fail "/dev/${CHIPNAME} unexpectedly remains" + +echo "1.2.3. Asynchronous creation with deferred probe" +sim_disable_chip chip0 +echo 'chip0_bank0 0' > $SYSFS_AGG_DIR/new_device +sleep 1 +test "$(cat "$CONFIGFS_AGG_DIR/_sysfs.0/live")" = 0 || fail "chip unexpectedly alive" +sim_enable_chip chip0 +sleep 1 +CHIPNAME=$(agg_configfs_chip_name _sysfs.0) +test "$(cat "$CONFIGFS_AGG_DIR/_sysfs.0/live")" = 1 || fail "chip unexpectedly remains dead" +test "$(agg_get_chip_label _sysfs.0)" = "$(agg_configfs_dev_name _sysfs.0)" || \ + fail "label is inconsistent" +test "$(agg_get_chip_num_lines _sysfs.0)" = "1" || fail "number of lines is not 1" +test "$(agg_get_line_name _sysfs.0 0)" = "" || fail "line name unexpectedly set" +echo "$(agg_configfs_dev_name _sysfs.0)" > "$SYSFS_AGG_DIR/delete_device" +test -d $CONFIGFS_AGG_DIR/_sysfs.0 && fail "_sysfs.0 unexpectedly remains" +test -d /dev/${CHIPNAME} && fail "/dev/${CHIPNAME} unexpectedly remains" + +echo "1.2.4. Can't instantiate a chip with invalid configuration" +echo "xyz 0" > "$SYSFS_AGG_DIR/new_device" +test "$(cat $CONFIGFS_AGG_DIR/_sysfs.0/live)" = 0 || fail "chip unexpectedly alive" +echo "$(agg_configfs_dev_name _sysfs.0)" > "$SYSFS_AGG_DIR/delete_device" + +echo "2. GPIO aggregator configuration" + +echo "2.1. Configuring aggregators instantiated via configfs" +setup_2_1() { + agg_create_chip agg0 + agg_create_line agg0 line0 + agg_create_line agg0 line1 + agg_set_key agg0 line0 "$(sim_get_chip_label chip0 bank0)" + agg_set_key agg0 line1 "$(sim_get_chip_label chip1 bank0)" + agg_set_offset agg0 line0 1 + agg_set_offset agg0 line1 3 + agg_set_line_name agg0 line0 test0 + agg_set_line_name agg0 line1 test1 + agg_enable_chip agg0 +} +teardown_2_1() { + agg_configfs_cleanup +} + +echo "2.1.1. While offline" + +echo "2.1.1.1. Line can be added/removed" +setup_2_1 +agg_disable_chip agg0 +agg_create_line agg0 line2 +agg_set_key agg0 line2 "$(sim_get_chip_label chip0 bank1)" +agg_set_offset agg0 line2 5 +agg_enable_chip agg0 +test "$(agg_get_chip_num_lines agg0)" = "3" || fail "number of lines is not 1" +teardown_2_1 + +echo "2.1.1.2. Line key can be modified" +setup_2_1 +agg_disable_chip agg0 +agg_set_key agg0 line0 "$(sim_get_chip_label chip0 bank1)" +agg_set_key agg0 line1 "$(sim_get_chip_label chip1 bank1)" +agg_enable_chip agg0 +teardown_2_1 + +echo "2.1.1.3. Line name can be modified" +setup_2_1 +agg_disable_chip agg0 +agg_set_line_name agg0 line0 new0 +agg_set_line_name agg0 line1 new1 +agg_enable_chip agg0 +test "$(agg_get_line_name agg0 0)" = "new0" || fail "line name is unset" +test "$(agg_get_line_name agg0 1)" = "new1" || fail "line name is unset" +teardown_2_1 + +echo "2.1.1.4. Line offset can be modified" +setup_2_1 +agg_disable_chip agg0 +agg_set_offset agg0 line0 5 +agg_set_offset agg0 line1 7 +agg_enable_chip agg0 +teardown_2_1 + +echo "2.1.1.5. Can re-enable a chip after valid reconfiguration" +setup_2_1 +agg_disable_chip agg0 +agg_set_key agg0 line0 "$(sim_get_chip_label chip1 bank1)" +agg_set_offset agg0 line0 15 +agg_set_key agg0 line1 "$(sim_get_chip_label chip0 bank1)" +agg_set_offset agg0 line0 14 +agg_create_line agg0 line2 +agg_set_key agg0 line2 "$(sim_get_chip_label chip0 bank1)" +agg_set_offset agg0 line2 13 +agg_enable_chip agg0 +test "$(agg_get_chip_num_lines agg0)" = "3" || fail "number of lines is not 1" +teardown_2_1 + +echo "2.1.1.7. Can't re-enable a chip with invalid reconfiguration" +setup_2_1 +agg_disable_chip agg0 +agg_set_key agg0 line0 invalidkey +echo 1 > "$CONFIGFS_AGG_DIR/agg0/live" 2> /dev/null && fail "chip unexpectedly enabled" +teardown_2_1 +setup_2_1 +agg_disable_chip agg0 +agg_set_offset agg0 line0 99 +echo 1 > "$CONFIGFS_AGG_DIR/agg0/live" 2> /dev/null && fail "chip unexpectedly enabled" +teardown_2_1 + +echo "2.1.2. While online" + +echo "2.1.2.1. Can't add/remove line" +setup_2_1 +mkdir "$CONFIGFS_AGG_DIR/agg0/line2" 2> /dev/null && fail "line unexpectedly added" +rmdir "$CONFIGFS_AGG_DIR/agg0/line1" 2> /dev/null && fail "line unexpectedly removed" +teardown_2_1 + +echo "2.1.2.2. Can't modify line key" +setup_2_1 +echo "chip1_bank1" > "$CONFIGFS_AGG_DIR/agg0/line0/key" 2> /dev/null && \ + fail "lookup key unexpectedly updated" +teardown_2_1 + +echo "2.1.2.3. Can't modify line name" +setup_2_1 +echo "new0" > "$CONFIGFS_AGG_DIR/agg0/line0/name" 2> /dev/null && \ + fail "name unexpectedly updated" +teardown_2_1 + +echo "2.1.2.4. Can't modify line offset" +setup_2_1 +echo "5" > "$CONFIGFS_AGG_DIR/agg0/line0/offset" 2> /dev/null && \ + fail "offset unexpectedly updated" +teardown_2_1 + +echo "2.2. Configuring aggregators instantiated via sysfs" +setup_2_2() { + echo "chip0_bank0 1 chip1_bank0 3" > "$SYSFS_AGG_DIR/new_device" +} +teardown_2_2() { + echo "$(agg_configfs_dev_name _sysfs.0)" > "$SYSFS_AGG_DIR/delete_device" +} + +echo "2.2.1. While online" + +echo "2.2.1.1. Can toggle live" +setup_2_2 +agg_disable_chip _sysfs.0 +agg_enable_chip _sysfs.0 +teardown_2_2 + +echo "2.2.1.2. Can't add/remove line" +setup_2_2 +mkdir "$CONFIGFS_AGG_DIR/_sysfs.0/line2" 2> /dev/null && fail "line unexpectedly added" +rmdir "$CONFIGFS_AGG_DIR/_sysfs.0/line1" 2> /dev/null && fail "line unexpectedly removed" +teardown_2_2 + +echo "2.2.1.3. Can't modify line key" +setup_2_2 +echo "chip1_bank1" > "$CONFIGFS_AGG_DIR/_sysfs.0/line0/key" 2> /dev/null && \ + fail "lookup key unexpectedly updated" +teardown_2_2 + +echo "2.2.1.4. Can't modify line name" +setup_2_2 +echo "new0" > "$CONFIGFS_AGG_DIR/_sysfs.0/line0/name" 2> /dev/null && \ + fail "name unexpectedly updated" +teardown_2_2 + +echo "2.2.1.5. Can't modify line offset" +setup_2_2 +echo "5" > "$CONFIGFS_AGG_DIR/_sysfs.0/line0/offset" 2> /dev/null && \ + fail "offset unexpectedly updated" +teardown_2_2 + +echo "2.2.2. While waiting for deferred probe" + +echo "2.2.2.1. Can't add/remove line despite live = 0" +sim_disable_chip chip0 +setup_2_2 +mkdir "$CONFIGFS_AGG_DIR/_sysfs.0/line2" 2> /dev/null && fail "line unexpectedly added" +rmdir "$CONFIGFS_AGG_DIR/_sysfs.0/line1" 2> /dev/null && fail "line unexpectedly removed" +teardown_2_2 +sim_enable_chip chip0 + +echo "2.2.2.2. Can't modify line key" +sim_disable_chip chip0 +setup_2_2 +echo "chip1_bank1" > "$CONFIGFS_AGG_DIR/_sysfs.0/line0/key" 2> /dev/null && \ + fail "lookup key unexpectedly updated" +teardown_2_2 +sim_enable_chip chip0 + +echo "2.2.2.3. Can't modify line name" +sim_disable_chip chip0 +setup_2_2 +echo "new0" > "$CONFIGFS_AGG_DIR/_sysfs.0/line0/name" 2> /dev/null && \ + fail "name unexpectedly updated" +teardown_2_2 +sim_enable_chip chip0 + +echo "2.2.2.4. Can't modify line offset" +sim_disable_chip chip0 +setup_2_2 +echo 5 > "$CONFIGFS_AGG_DIR/_sysfs.0/line0/offset" 2> /dev/null && \ + fail "offset unexpectedly updated" +teardown_2_2 +sim_enable_chip chip0 + +echo "2.2.2.5. Can't toggle live" +sim_disable_chip chip0 +setup_2_2 +test "$(cat "$CONFIGFS_AGG_DIR/_sysfs.0/live")" = 0 || fail "chip unexpectedly alive" +echo 1 > "$CONFIGFS_AGG_DIR/_sysfs.0/live" 2> /dev/null && fail "chip unexpectedly enabled" +teardown_2_2 +sim_enable_chip chip0 + +echo "2.2.3. While offline" + +echo "2.2.3.1. Can't add/remove line despite live = 0" +setup_2_2 +agg_disable_chip _sysfs.0 +mkdir "$CONFIGFS_AGG_DIR/_sysfs.0/line2" 2> /dev/null && fail "line unexpectedly added" +rmdir "$CONFIGFS_AGG_DIR/_sysfs.0/line1" 2> /dev/null && fail "line unexpectedly removed" +teardown_2_2 + +echo "2.2.3.2. Line key can be modified" +setup_2_2 +agg_disable_chip _sysfs.0 +agg_set_key _sysfs.0 line0 "$(sim_get_chip_label chip0 bank1)" +agg_set_key _sysfs.0 line1 "$(sim_get_chip_label chip1 bank1)" +agg_enable_chip _sysfs.0 +teardown_2_2 + +echo "2.2.3.3. Line name can be modified" +setup_2_2 +agg_disable_chip _sysfs.0 +agg_set_line_name _sysfs.0 line0 new0 +agg_set_line_name _sysfs.0 line1 new1 +agg_enable_chip _sysfs.0 +test "$(agg_get_line_name _sysfs.0 0)" = "new0" || fail "line name is unset" +test "$(agg_get_line_name _sysfs.0 1)" = "new1" || fail "line name is unset" +teardown_2_2 + +echo "2.2.3.4. Line offset can be modified" +setup_2_2 +agg_disable_chip _sysfs.0 +agg_set_offset _sysfs.0 line0 5 +agg_set_offset _sysfs.0 line1 7 +agg_enable_chip _sysfs.0 +teardown_2_2 + +echo "2.2.3.5. Can re-enable a chip with valid reconfiguration" +setup_2_2 +agg_disable_chip _sysfs.0 +agg_set_key _sysfs.0 line0 "$(sim_get_chip_label chip1 bank1)" +agg_set_offset _sysfs.0 line0 15 +agg_set_key _sysfs.0 line1 "$(sim_get_chip_label chip0 bank1)" +agg_set_offset _sysfs.0 line0 14 +agg_enable_chip _sysfs.0 +teardown_2_2 + +echo "2.2.3.6. Can't re-enable a chip with invalid reconfiguration" +setup_2_2 +agg_disable_chip _sysfs.0 +agg_set_key _sysfs.0 line0 invalidkey +echo 1 > "$CONFIGFS_AGG_DIR/_sysfs.0/live" 2> /dev/null && fail "chip unexpectedly enabled" +teardown_2_2 +setup_2_2 +agg_disable_chip _sysfs.0 +agg_set_offset _sysfs.0 line0 99 +echo 1 > "$CONFIGFS_AGG_DIR/_sysfs.0/live" 2> /dev/null && fail "chip unexpectedly enabled" +teardown_2_2 + +echo "3. Module unload" + +echo "3.1. Can't unload module if there is at least one device created via configfs" +agg_create_chip agg0 +modprobe -r gpio-aggregator 2> /dev/null +test -d /sys/module/gpio_aggregator || fail "module unexpectedly unloaded" +agg_remove_chip agg0 + +echo "3.2. Can unload module if there is no device created via configfs" +echo "chip0_bank0 1 chip1_bank0 3" > "$SYSFS_AGG_DIR/new_device" +modprobe -r gpio-aggregator 2> /dev/null +test -d /sys/module/gpio_aggregator && fail "module unexpectedly remains to be loaded" +modprobe gpio-aggregator 2> /dev/null + +echo "4. GPIO forwarder functional" +SETTINGS="chip0:bank0:2 chip0:bank1:4 chip1:bank0:6 chip1:bank1:8" +setup_4() { + local OFFSET=0 + agg_create_chip agg0 + for SETTING in $SETTINGS; do + CHIP=$(echo "$SETTING" | cut -d: -f1) + BANK=$(echo "$SETTING" | cut -d: -f2) + LINE=$(echo "$SETTING" | cut -d: -f3) + agg_create_line agg0 "line${OFFSET}" + agg_set_key agg0 "line${OFFSET}" "$(sim_get_chip_label "$CHIP" "$BANK")" + agg_set_offset agg0 "line${OFFSET}" "$LINE" + OFFSET=$(expr $OFFSET + 1) + done + agg_enable_chip agg0 +} +teardown_4() { + agg_configfs_cleanup +} + +echo "4.1. Forwarding set values" +setup_4 +OFFSET=0 +for SETTING in $SETTINGS; do + CHIP=$(echo "$SETTING" | cut -d: -f1) + BANK=$(echo "$SETTING" | cut -d: -f2) + LINE=$(echo "$SETTING" | cut -d: -f3) + DEVNAME=$(cat "$CONFIGFS_SIM_DIR/$CHIP/dev_name") + CHIPNAME=$(cat "$CONFIGFS_SIM_DIR/$CHIP/$BANK/chip_name") + VAL_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio${LINE}/value" + test $(cat $VAL_PATH) = "0" || fail "incorrect value read from sysfs" + $BASE_DIR/gpio-mockup-cdev -s 1 "/dev/$(agg_configfs_chip_name agg0)" "$OFFSET" & + mock_pid=$! + sleep 0.1 # FIXME Any better way? + test "$(cat $VAL_PATH)" = "1" || fail "incorrect value read from sysfs" + kill "$mock_pid" + OFFSET=$(expr $OFFSET + 1) +done +teardown_4 + +echo "4.2. Forwarding set config" +setup_4 +OFFSET=0 +for SETTING in $SETTINGS; do + CHIP=$(echo "$SETTING" | cut -d: -f1) + BANK=$(echo "$SETTING" | cut -d: -f2) + LINE=$(echo "$SETTING" | cut -d: -f3) + DEVNAME=$(cat "$CONFIGFS_SIM_DIR/$CHIP/dev_name") + CHIPNAME=$(cat "$CONFIGFS_SIM_DIR/$CHIP/$BANK/chip_name") + VAL_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio${LINE}/value" + $BASE_DIR/gpio-mockup-cdev -b pull-up "/dev/$(agg_configfs_chip_name agg0)" "$OFFSET" + test $(cat "$VAL_PATH") = "1" || fail "incorrect value read from sysfs" + OFFSET=$(expr $OFFSET + 1) +done +teardown_4 + +echo "5. Race condition verification" + +echo "5.1. Stress test of new_device/delete_device and module load/unload" +for _ in $(seq 1000); do + { + echo "dummy 0" > "$SYSFS_AGG_DIR/new_device" + cat "$CONFIGFS_AGG_DIR/_sysfs.0/dev_name" > "$SYSFS_AGG_DIR/delete_device" + } 2> /dev/null +done & +writer_pid=$! +while kill -0 "$writer_pid" 2> /dev/null; do + { + modprobe gpio-aggregator + modprobe -r gpio-aggregator + } 2> /dev/null +done + +echo "GPIO $MODULE test PASS" From patchwork Tue Apr 15 06:14:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koichiro Den X-Patchwork-Id: 2072696 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcDRX2bnQz1yJH for ; Tue, 15 Apr 2025 16:15:36 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1u4ZaG-00083X-PF; Tue, 15 Apr 2025 06:15:48 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1u4ZaC-0007eN-J2 for kernel-team@lists.ubuntu.com; Tue, 15 Apr 2025 06:15:44 +0000 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 1383E3F1ED for ; Tue, 15 Apr 2025 06:15:44 +0000 (UTC) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-7398d70abbfso6641571b3a.2 for ; Mon, 14 Apr 2025 23:15:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744697742; x=1745302542; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JLP1CjVkmPz/FlR7hyVMTN7gM21HSw9cJrWdfMsG6ro=; b=vdS35J5y3GTmxI8nljqfaTRxMPj71BPdZl7gejK3Jz7PwC5cj9qL6nkoT6kAEiWFYf s6FbtPeokaHNjg7KJo+x/1yWPQgunn4GBfGSaTjGMsS0X1BIcx5zDyHcNwTVN6+c5UBi MvbwHD+8GMaV4PfUioC0iynjhL2hdoHfTF3VjmiXAp5Ibv5vF/UgzWQi50oWx+edile7 jPBljreax+wyyhsK1KpGNWLWNnjWtbGBp2/lq8vmzQ/A9pw2GCv46WhV3SXrLl+kw+Zg RkmljO6QwKRumvV93QJQTSyf6BzLamdmEDn3YnDnNFagz0+Wma++N56dqYSB0JZBiveW W2tA== X-Gm-Message-State: AOJu0YyRD2JJQyj1w6kYlKiYYl1IFR3CbF38wjRMgg+WWkagg1dxfj8p slaVCMHJem3Za1hQah3h8KmGerOjZ19eCrtOsDBoaoKEYI2/LPfcN3Necx9eUN5IM4oR2EoIFGS 9VEgV7nbefHadsOld/eVHCteU5XJoXQouFji7C0P5S4P8MbcmjTtINNneD1KswZaAeAET/wlFAZ atwDHxo4FCwA== X-Gm-Gg: ASbGncuk1AwoIrl9NcnoSDOlOmjKVg2sNj4GjgBii1ndqQIgL/0SCK/YmnaAxLohFn7 wQeXzWn0Ybe4XKNOJ4s2Ei2qadkcqgVS0uHX7gQwTeDwai/Kdr6qlQOlHkvQBJyvwDblJA0PyYc IbAb3w6/E7R50WgjnxjOgZimGuYCs8r0MfdkLQOeVHPgkJDCpSidCbkhejaQXg1G+LAH20TmRwh gCbg4EPWSL0NwIa/rL6Nfpyawp4OtL7JziOcQgQgPLaUUqbLi0A8AOqHvn8SSSmDltDz/De2f3D AC3/FvSIXgdO9Rcu7kr+EEIjVVWXTg== X-Received: by 2002:a05:6a00:1414:b0:72d:9cbc:730d with SMTP id d2e1a72fcca58-73bd11fb281mr19225508b3a.11.1744697742412; Mon, 14 Apr 2025 23:15:42 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEEB6+pP9fmLQrF7sirNKiub5iG4Kvi5bF+KXiAVVjAUKCGFH67uvHpDz8towv6ohFMHt53ug== X-Received: by 2002:a05:6a00:1414:b0:72d:9cbc:730d with SMTP id d2e1a72fcca58-73bd11fb281mr19225485b3a.11.1744697741999; Mon, 14 Apr 2025 23:15:41 -0700 (PDT) Received: from localhost.localdomain ([240f:74:7be:1:a31c:d1db:5e23:e8fb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230ddaasm7909286b3a.138.2025.04.14.23.15.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 23:15:41 -0700 (PDT) From: Koichiro Den To: kernel-team@lists.ubuntu.com Subject: [SRU][N][PATCH v2 20/20] UBUNTU: SAUCE: selftests: gpio: gpio-aggregator: add a test case for _sysfs prefix reservation Date: Tue, 15 Apr 2025 15:14:06 +0900 Message-ID: <3313cd3fa3719dad9a0560b22702130e22a052d3.1744694753.git.koichiro.den@canonical.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: <174469458477.3554672.3738856905360736202@z790sl> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2103496 The kernel doc for gpio-aggregator configfs interface, which was recently added, states that users should not be able to create an aggregator with a name prefixed by "_sysfs" via configfs. However, it was found that this guard does not function as expected (thanks to Dan Carpenter for identifying and fixing the issue). Add a test case to verify the guard. Signed-off-by: Koichiro Den Link: https://lore.kernel.org/r/20250412150119.1461023-1-koichiro.den@canonical.com Signed-off-by: Bartosz Golaszewski (cherry picked from commit 290ffcfe3042dcd5b701a98edd48d7962d35556b gpio/for-next) Signed-off-by: Koichiro Den --- tools/testing/selftests/gpio/gpio-aggregator.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/testing/selftests/gpio/gpio-aggregator.sh b/tools/testing/selftests/gpio/gpio-aggregator.sh index f1bab62c4cd2..9b6f80ad9f8a 100755 --- a/tools/testing/selftests/gpio/gpio-aggregator.sh +++ b/tools/testing/selftests/gpio/gpio-aggregator.sh @@ -335,6 +335,10 @@ test "$(cat "$CONFIGFS_AGG_DIR/agg0/live")" = 0 || \ agg_remove_line agg0 line0 agg_remove_chip agg0 +echo "1.1.6. Can't instantiate a chip with _sysfs prefix" +mkdir "$CONFIGFS_AGG_DIR/_sysfs" 2> /dev/null && fail "chip _sysfs unexpectedly created" +mkdir "$CONFIGFS_AGG_DIR/_sysfs.foo" 2> /dev/null && fail "chip _sysfs.foo unexpectedly created" + echo "1.2. Creation/deletion via sysfs" echo "1.2.1. Minimum creation/deletion"