From nobody Fri Jun 12 15:49:37 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A80C73BA239; Thu, 14 May 2026 06:31:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778740276; cv=none; b=tDE/78UvRKjudhTcLe0U2RrV5O2/GiTuQOvQZ2Z45KzKl8yFtEBrJOPcoWuMSN+UIGG+TlF+LztGrvqKrPib63T0AZUpXbbapQC3feg/FGmg8ZFM2zgDM9CItH1V6AIAZ3nUkK2vC2EWZKxSRk5G2kQNnLTN9WY4MX8FIldsxy8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778740276; c=relaxed/simple; bh=37gkrudc3UZ+P4Z9TUfyE6f275CQW1zKf1om7jujkkA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YKukkUJc509sMffT0i+oyG5k4SwJzJaNRBoy8fFV2aBtnCXp4ls7/ATeasURtJYr5C8Jov6FX85LZNV/T5aBTJFP+0AWJ+ilEQBwIrLqiSIaAJ76HyqoHpBFeJp3BHx/4SbG4GOyJa9mdphyvNJ0ej4P17VUqrVYt8xKJrZbsT0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=Y3S5tj0S; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="Y3S5tj0S" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1778740266; bh=37gkrudc3UZ+P4Z9TUfyE6f275CQW1zKf1om7jujkkA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Y3S5tj0St6ewOtfjbo/XMvPKGAnK4tl/0AMLy3wrSSgQd3FI0Z3IvWRU8tdiEb/gu MKI3hm2uIfEquhKS0WtZ9enq3v/7w7UfUbWNWvAX60XAgtUh4BYeWlr2VMobE0xKHF rK3nbOxG6zFAJIXnpsAIWxlDqwQp0lErg0yAg33E= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Thu, 14 May 2026 08:31:00 +0200 Subject: [PATCH 1/2] PCI: hotplug: Manage hotplug slot attributes as group Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260514-sysfs-const-pci-hotplug-v1-1-3b0b6c6f7481@weissschuh.net> References: <20260514-sysfs-const-pci-hotplug-v1-0-3b0b6c6f7481@weissschuh.net> In-Reply-To: <20260514-sysfs-const-pci-hotplug-v1-0-3b0b6c6f7481@weissschuh.net> To: Bjorn Helgaas Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778740266; l=4449; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=37gkrudc3UZ+P4Z9TUfyE6f275CQW1zKf1om7jujkkA=; b=x/D6c/aYPI+vvgn24OJU9BB/FDavVLQUDSBnw33a1KszZg7B1mTKRIM6hES4jp9l6fUtOd3Bq gsuS5hzT+eFA1yTxwzP4JIQOwHWVCj1q3AQeCQMpULXbmWZxyuz983h X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= Make use of 'struct attribute_group' to manage all attribute together, simplifying the lifecycle management. Signed-off-by: Thomas Wei=C3=9Fschuh --- drivers/pci/hotplug/pci_hotplug_core.c | 114 +++++++++++++----------------= ---- 1 file changed, 43 insertions(+), 71 deletions(-) diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/p= ci_hotplug_core.c index fadcf98a8a66..7c4e197f5581 100644 --- a/drivers/pci/hotplug/pci_hotplug_core.c +++ b/drivers/pci/hotplug/pci_hotplug_core.c @@ -239,10 +239,46 @@ static bool has_test_file(struct hotplug_slot *slot) return false; } =20 +static struct attribute *hotplug_slot_attrs[] =3D { + &hotplug_slot_attr_power.attr, + &hotplug_slot_attr_attention.attr, + &hotplug_slot_attr_latch.attr, + &hotplug_slot_attr_presence.attr, + &hotplug_slot_attr_test.attr, + NULL +}; + +static umode_t hotplug_slot_attr_is_visible(struct kobject *kobj, struct a= ttribute *attr, int idx) +{ + struct hotplug_slot *slot =3D to_pci_slot(kobj)->hotplug; + + if (attr =3D=3D &hotplug_slot_attr_power.attr && !has_power_file(slot)) + return 0; + + if (attr =3D=3D &hotplug_slot_attr_attention.attr && !has_attention_file(= slot)) + return 0; + + if (attr =3D=3D &hotplug_slot_attr_latch.attr && !has_latch_file(slot)) + return 0; + + if (attr =3D=3D &hotplug_slot_attr_presence.attr && !has_adapter_file(slo= t)) + return 0; + + if (attr =3D=3D &hotplug_slot_attr_test.attr && !has_test_file(slot)) + return 0; + + return attr->mode; +} + +static const struct attribute_group hotplug_slot_group =3D { + .is_visible =3D hotplug_slot_attr_is_visible, + .attrs =3D hotplug_slot_attrs, +}; + static int fs_add_slot(struct hotplug_slot *slot, struct pci_slot *pci_slo= t) { struct kobject *kobj; - int retval =3D 0; + int retval; =20 /* Create symbolic link to the hotplug driver module */ kobj =3D kset_find_obj(module_kset, slot->mod_name); @@ -254,82 +290,18 @@ static int fs_add_slot(struct hotplug_slot *slot, str= uct pci_slot *pci_slot) kobject_put(kobj); } =20 - if (has_power_file(slot)) { - retval =3D sysfs_create_file(&pci_slot->kobj, - &hotplug_slot_attr_power.attr); - if (retval) - goto exit_power; - } - - if (has_attention_file(slot)) { - retval =3D sysfs_create_file(&pci_slot->kobj, - &hotplug_slot_attr_attention.attr); - if (retval) - goto exit_attention; - } - - if (has_latch_file(slot)) { - retval =3D sysfs_create_file(&pci_slot->kobj, - &hotplug_slot_attr_latch.attr); - if (retval) - goto exit_latch; - } - - if (has_adapter_file(slot)) { - retval =3D sysfs_create_file(&pci_slot->kobj, - &hotplug_slot_attr_presence.attr); - if (retval) - goto exit_adapter; - } - - if (has_test_file(slot)) { - retval =3D sysfs_create_file(&pci_slot->kobj, - &hotplug_slot_attr_test.attr); - if (retval) - goto exit_test; + retval =3D sysfs_create_group(&pci_slot->kobj, &hotplug_slot_group); + if (retval) { + sysfs_remove_link(&pci_slot->kobj, "module"); + return retval; } =20 - goto exit; - -exit_test: - if (has_adapter_file(slot)) - sysfs_remove_file(&pci_slot->kobj, - &hotplug_slot_attr_presence.attr); -exit_adapter: - if (has_latch_file(slot)) - sysfs_remove_file(&pci_slot->kobj, &hotplug_slot_attr_latch.attr); -exit_latch: - if (has_attention_file(slot)) - sysfs_remove_file(&pci_slot->kobj, - &hotplug_slot_attr_attention.attr); -exit_attention: - if (has_power_file(slot)) - sysfs_remove_file(&pci_slot->kobj, &hotplug_slot_attr_power.attr); -exit_power: - sysfs_remove_link(&pci_slot->kobj, "module"); -exit: - return retval; + return 0; } =20 static void fs_remove_slot(struct hotplug_slot *slot, struct pci_slot *pci= _slot) { - if (has_power_file(slot)) - sysfs_remove_file(&pci_slot->kobj, &hotplug_slot_attr_power.attr); - - if (has_attention_file(slot)) - sysfs_remove_file(&pci_slot->kobj, - &hotplug_slot_attr_attention.attr); - - if (has_latch_file(slot)) - sysfs_remove_file(&pci_slot->kobj, &hotplug_slot_attr_latch.attr); - - if (has_adapter_file(slot)) - sysfs_remove_file(&pci_slot->kobj, - &hotplug_slot_attr_presence.attr); - - if (has_test_file(slot)) - sysfs_remove_file(&pci_slot->kobj, &hotplug_slot_attr_test.attr); - + sysfs_remove_group(&pci_slot->kobj, &hotplug_slot_group); sysfs_remove_link(&pci_slot->kobj, "module"); } =20 --=20 2.54.0 From nobody Fri Jun 12 15:49:37 2026 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 64F2B3C1966; Thu, 14 May 2026 06:31:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.126.157 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778740276; cv=none; b=YgsVmtsguRAbffneNy8Tnx9QZPk7Z8vYlW3WQvtY2m9Cu/51buE7b05OGDek0Sdq6bq4mM/3IaU5kwZ54v2dA3gLLzZyTx3QX5oXhbKqmWaWbGSyKbDCfv0tTYVFFZZ8xM/SYzMUyXwyl9QNoYC7D+9qBFa7z0JA662GVYPQUcc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778740276; c=relaxed/simple; bh=0Igx9aTadXmb6OTo5npSkahdkSVxYqTYgPLzf5KhhnA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Nw2rjvCZ2FqxCgqiSB5/4RItz6do1c2/7q4oWvZfOCc3jiS0olkLEzOxmm5dp1VHXxOXUasux7bwK0IeDqax+ktDMzrcTWfYmAupY8KmlEf8655ZyAfTiLo8/peME1HuPgx8xEsSQexQop5EJ+eMz92LVJCgseVbCAEeMPFUENg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net; spf=pass smtp.mailfrom=weissschuh.net; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b=BSSK308O; arc=none smtp.client-ip=159.69.126.157 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=weissschuh.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=weissschuh.net header.i=@weissschuh.net header.b="BSSK308O" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1778740266; bh=0Igx9aTadXmb6OTo5npSkahdkSVxYqTYgPLzf5KhhnA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BSSK308OtzshEfGUjri04Beo/brEnTtxkAnD7TQC16atzT79rTFClLIGRsdEnV+Ys nJ5Fzu7BTdmMudQ5pBs1INI0siqsQ+Fc4lvgWcfCH/SdaT8iF5nOks0ZK06DWxK+n5 y5hzOEmUJtMeXtN5P2U0V0CTLszG52PpOf4mw4QI= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= Date: Thu, 14 May 2026 08:31:01 +0200 Subject: [PATCH 2/2] PCI: Constify slot attributes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260514-sysfs-const-pci-hotplug-v1-2-3b0b6c6f7481@weissschuh.net> References: <20260514-sysfs-const-pci-hotplug-v1-0-3b0b6c6f7481@weissschuh.net> In-Reply-To: <20260514-sysfs-const-pci-hotplug-v1-0-3b0b6c6f7481@weissschuh.net> To: Bjorn Helgaas Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778740266; l=6227; i=linux@weissschuh.net; s=20221212; h=from:subject:message-id; bh=0Igx9aTadXmb6OTo5npSkahdkSVxYqTYgPLzf5KhhnA=; b=0YtG52XP33yk798JhJr0WqbYZ5DSo2ZexwjuNFWk10veO/cpNjlwtWvyT3l/k6ItClZavHczN mPHzpJp7xJfAxCSDiRhaJiI8ZjjxNvfR7DqTpXCozWdW6lvitJWs7YZ X-Developer-Key: i=linux@weissschuh.net; a=ed25519; pk=KcycQgFPX2wGR5azS7RhpBqedglOZVgRPfdFSPB1LNw= The attribute struct are never modified, mark them as const. Signed-off-by: Thomas Wei=C3=9Fschuh --- drivers/pci/hotplug/pci_hotplug_core.c | 19 ++++++++++--------- drivers/pci/pci.h | 2 +- drivers/pci/slot.c | 14 +++++++------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/p= ci_hotplug_core.c index 7c4e197f5581..cdf3293aade7 100644 --- a/drivers/pci/hotplug/pci_hotplug_core.c +++ b/drivers/pci/hotplug/pci_hotplug_core.c @@ -97,7 +97,7 @@ static ssize_t power_write_file(struct pci_slot *pci_slot= , const char *buf, return count; } =20 -static struct pci_slot_attribute hotplug_slot_attr_power =3D { +static const struct pci_slot_attribute hotplug_slot_attr_power =3D { .attr =3D {.name =3D "power", .mode =3D S_IFREG | S_IRUGO | S_IWUSR}, .show =3D power_read_file, .store =3D power_write_file @@ -136,7 +136,7 @@ static ssize_t attention_write_file(struct pci_slot *pc= i_slot, const char *buf, return count; } =20 -static struct pci_slot_attribute hotplug_slot_attr_attention =3D { +static const struct pci_slot_attribute hotplug_slot_attr_attention =3D { .attr =3D {.name =3D "attention", .mode =3D S_IFREG | S_IRUGO | S_IWUSR}, .show =3D attention_read_file, .store =3D attention_write_file @@ -154,7 +154,7 @@ static ssize_t latch_read_file(struct pci_slot *pci_slo= t, char *buf) return sysfs_emit(buf, "%d\n", value); } =20 -static struct pci_slot_attribute hotplug_slot_attr_latch =3D { +static const struct pci_slot_attribute hotplug_slot_attr_latch =3D { .attr =3D {.name =3D "latch", .mode =3D S_IFREG | S_IRUGO}, .show =3D latch_read_file, }; @@ -171,7 +171,7 @@ static ssize_t presence_read_file(struct pci_slot *pci_= slot, char *buf) return sysfs_emit(buf, "%d\n", value); } =20 -static struct pci_slot_attribute hotplug_slot_attr_presence =3D { +static const struct pci_slot_attribute hotplug_slot_attr_presence =3D { .attr =3D {.name =3D "adapter", .mode =3D S_IFREG | S_IRUGO}, .show =3D presence_read_file, }; @@ -196,7 +196,7 @@ static ssize_t test_write_file(struct pci_slot *pci_slo= t, const char *buf, return count; } =20 -static struct pci_slot_attribute hotplug_slot_attr_test =3D { +static const struct pci_slot_attribute hotplug_slot_attr_test =3D { .attr =3D {.name =3D "test", .mode =3D S_IFREG | S_IRUGO | S_IWUSR}, .store =3D test_write_file }; @@ -239,7 +239,7 @@ static bool has_test_file(struct hotplug_slot *slot) return false; } =20 -static struct attribute *hotplug_slot_attrs[] =3D { +static const struct attribute *const hotplug_slot_attrs[] =3D { &hotplug_slot_attr_power.attr, &hotplug_slot_attr_attention.attr, &hotplug_slot_attr_latch.attr, @@ -248,7 +248,8 @@ static struct attribute *hotplug_slot_attrs[] =3D { NULL }; =20 -static umode_t hotplug_slot_attr_is_visible(struct kobject *kobj, struct a= ttribute *attr, int idx) +static umode_t hotplug_slot_attr_is_visible(struct kobject *kobj, const st= ruct attribute *attr, + int idx) { struct hotplug_slot *slot =3D to_pci_slot(kobj)->hotplug; =20 @@ -271,8 +272,8 @@ static umode_t hotplug_slot_attr_is_visible(struct kobj= ect *kobj, struct attribu } =20 static const struct attribute_group hotplug_slot_group =3D { - .is_visible =3D hotplug_slot_attr_is_visible, - .attrs =3D hotplug_slot_attrs, + .is_visible_const =3D hotplug_slot_attr_is_visible, + .attrs_const =3D hotplug_slot_attrs, }; =20 static int fs_add_slot(struct hotplug_slot *slot, struct pci_slot *pci_slo= t) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 4a14f88e543a..3ca3832c7267 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -478,7 +478,7 @@ struct pci_slot_attribute { ssize_t (*show)(struct pci_slot *, char *); ssize_t (*store)(struct pci_slot *, const char *, size_t); }; -#define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, att= r) +#define to_pci_slot_attr(s) container_of_const(s, struct pci_slot_attribut= e, attr) =20 enum pci_bar_type { pci_bar_unknown, /* Standard PCI BAR probe */ diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c index 6d5cd37bfb1e..7929bb87b195 100644 --- a/drivers/pci/slot.c +++ b/drivers/pci/slot.c @@ -18,7 +18,7 @@ static ssize_t pci_slot_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) { struct pci_slot *slot =3D to_pci_slot(kobj); - struct pci_slot_attribute *attribute =3D to_pci_slot_attr(attr); + const struct pci_slot_attribute *attribute =3D to_pci_slot_attr(attr); return attribute->show ? attribute->show(slot, buf) : -EIO; } =20 @@ -26,7 +26,7 @@ static ssize_t pci_slot_attr_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t len) { struct pci_slot *slot =3D to_pci_slot(kobj); - struct pci_slot_attribute *attribute =3D to_pci_slot_attr(attr); + const struct pci_slot_attribute *attribute =3D to_pci_slot_attr(attr); return attribute->store ? attribute->store(slot, buf, len) : -EIO; } =20 @@ -93,14 +93,14 @@ static void pci_slot_release(struct kobject *kobj) kfree(slot); } =20 -static struct pci_slot_attribute pci_slot_attr_address =3D +static const struct pci_slot_attribute pci_slot_attr_address =3D __ATTR(address, S_IRUGO, address_read_file, NULL); -static struct pci_slot_attribute pci_slot_attr_max_speed =3D +static const struct pci_slot_attribute pci_slot_attr_max_speed =3D __ATTR(max_bus_speed, S_IRUGO, max_speed_read_file, NULL); -static struct pci_slot_attribute pci_slot_attr_cur_speed =3D +static const struct pci_slot_attribute pci_slot_attr_cur_speed =3D __ATTR(cur_bus_speed, S_IRUGO, cur_speed_read_file, NULL); =20 -static struct attribute *pci_slot_default_attrs[] =3D { +static const struct attribute *const pci_slot_default_attrs[] =3D { &pci_slot_attr_address.attr, &pci_slot_attr_max_speed.attr, &pci_slot_attr_cur_speed.attr, @@ -108,7 +108,7 @@ static struct attribute *pci_slot_default_attrs[] =3D { }; =20 static const struct attribute_group pci_slot_default_group =3D { - .attrs =3D pci_slot_default_attrs, + .attrs_const =3D pci_slot_default_attrs, }; =20 static const struct attribute_group *pci_slot_default_groups[] =3D { --=20 2.54.0