From: Leon Romanovsky <leon@kernel.org>
To: Tariq Toukan <tariqt@nvidia.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Danilo Krummrich <dakr@kernel.org>,
linux-kernel@vger.kernel.org, Mark Bloch <mbloch@nvidia.com>,
Gal Pressman <gal@nvidia.com>, Aya Levin <ayal@nvidia.com>,
Saeed Mahameed <saeedm@nvidia.com>,
Simon Horman <horms@kernel.org>, Shay Drory <shayd@nvidia.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Parav Pandit <parav@nvidia.com>, Amir Tzin <amirtz@nvidia.com>
Subject: Re: [PATCH net] driver core: auxiliary bus: Fix sysfs creation on bind
Date: Sun, 26 Oct 2025 09:15:08 +0200 [thread overview]
Message-ID: <20251026071508.GA12554@unreal> (raw)
In-Reply-To: <1761200367-922346-1-git-send-email-tariqt@nvidia.com>
On Thu, Oct 23, 2025 at 09:19:27AM +0300, Tariq Toukan wrote:
> From: Amir Tzin <amirtz@nvidia.com>
>
> In case an auxiliary device with IRQs directory is unbinded, the
> directory is released, but auxdev->sysfs.irq_dir_exists remains true.
> This leads to a failure recreating the directory on bind [1].
>
> Using the attributes group visibility interface, expose the IRQs
> attributes group if"f the xarray storing IRQs entries is not empty. Now
if"f -> if
> irq_dir_exists field is redundant and can be removed.
>
> [1]
> [] mlx5_core.sf mlx5_core.sf.2: mlx5_irq_affinity_request:167:(pid 1939):
> Failed to create sysfs entry for irq 56, ret = -2
> [] mlx5_core.sf mlx5_core.sf.2: mlx5_eq_table_create:1195:(pid 1939):
> Failed to create async EQs
> [] mlx5_core.sf mlx5_core.sf.2: mlx5_load:1362:(pid 1939):
> Failed to create EQs
>
> Fixes: a808878308a8 ("driver core: auxiliary bus: show auxiliary device IRQs")
> Signed-off-by: Amir Tzin <amirtz@nvidia.com>
> Reviewed-by: Mark Bloch <mbloch@nvidia.com>
> Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
> ---
> drivers/base/auxiliary.c | 13 +++-
> drivers/base/auxiliary_sysfs.c | 117 +++++++++++++++++++++++++--------
> include/linux/auxiliary_bus.h | 26 ++++++--
> 3 files changed, 118 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/base/auxiliary.c b/drivers/base/auxiliary.c
> index 04bdbff4dbe5..b0fb31279257 100644
> --- a/drivers/base/auxiliary.c
> +++ b/drivers/base/auxiliary.c
> @@ -225,7 +225,16 @@ static int auxiliary_bus_probe(struct device *dev)
> return ret;
> }
>
> - return auxdrv->probe(auxdev, auxiliary_match_id(auxdrv->id_table, auxdev));
> + ret = auxiliary_bus_irq_dir_res_probe(auxdev);
> + if (ret)
> + return ret;
> +
> + ret = auxdrv->probe(auxdev,
> + auxiliary_match_id(auxdrv->id_table, auxdev));
> + if (ret)
> + auxiliary_bus_irq_dir_res_remove(auxdev);
> +
> + return ret;
return 0;
> }
>
> static void auxiliary_bus_remove(struct device *dev)
> @@ -235,6 +244,7 @@ static void auxiliary_bus_remove(struct device *dev)
>
> if (auxdrv->remove)
> auxdrv->remove(auxdev);
> + auxiliary_bus_irq_dir_res_remove(auxdev);
> }
>
> static void auxiliary_bus_shutdown(struct device *dev)
> @@ -294,7 +304,6 @@ int auxiliary_device_init(struct auxiliary_device *auxdev)
>
> dev->bus = &auxiliary_bus_type;
> device_initialize(&auxdev->dev);
> - mutex_init(&auxdev->sysfs.lock);
> return 0;
> }
> EXPORT_SYMBOL_GPL(auxiliary_device_init);
> diff --git a/drivers/base/auxiliary_sysfs.c b/drivers/base/auxiliary_sysfs.c
> index 754f21730afd..8ae3ec62b3db 100644
> --- a/drivers/base/auxiliary_sysfs.c
> +++ b/drivers/base/auxiliary_sysfs.c
> @@ -13,30 +13,71 @@ struct auxiliary_irq_info {
> char name[AUXILIARY_MAX_IRQ_NAME];
> };
>
> +static struct attribute auxiliary_irq_attr = {
> + .mode = 0,
"static" variable is always initialized to 0, there is no need in .mode = 0 line.
> + .name = "DUMMY",
> +};
> +
> static struct attribute *auxiliary_irq_attrs[] = {
> - NULL
> + [0] = &auxiliary_irq_attr,
> + [1] = NULL,
Let's use more common pattern - without [x]
> };
>
> +static bool auxiliary_irq_dir_group_visible(struct kobject *kobj)
> +{
> + struct auxiliary_device *auxdev;
> + struct device *dev;
> +
> + dev = container_of(kobj, struct device, kobj);
> + auxdev = container_of(dev, struct auxiliary_device, dev);
> +
> + return !xa_empty(&auxdev->sysfs.irqs);
> +}
> +
> +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(auxiliary_irq_dir);
> +
> static const struct attribute_group auxiliary_irqs_group = {
> .name = "irqs",
> .attrs = auxiliary_irq_attrs,
> + .is_visible = SYSFS_GROUP_VISIBLE(auxiliary_irq_dir),
> };
>
> -static int auxiliary_irq_dir_prepare(struct auxiliary_device *auxdev)
> +void auxiliary_bus_irq_dir_res_remove(struct auxiliary_device *auxdev)
> {
> - int ret = 0;
> + struct device *dev = &auxdev->dev;
>
> - guard(mutex)(&auxdev->sysfs.lock);
> - if (auxdev->sysfs.irq_dir_exists)
> - return 0;
> + sysfs_remove_group(&dev->kobj, &auxiliary_irqs_group);
> + xa_destroy(&auxdev->sysfs.irqs);
> + mutex_destroy(&auxdev->sysfs.lock);
Actually you don't need extra sysfs.lock mutex and everything can be
protected through xarray lock. So instead of two locks, you will have
one with proper lifetime.
> +}
<...>
> @@ -146,7 +145,6 @@ struct auxiliary_device {
> struct {
> struct xarray irqs;
> struct mutex lock; /* Synchronize irq sysfs creation */
> - bool irq_dir_exists;
"struct mutex lock" can be replaced with xa_lock(&auxdev->sysfs.irqs).
Thanks
next prev parent reply other threads:[~2025-10-26 7:15 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-23 6:19 [PATCH net] driver core: auxiliary bus: Fix sysfs creation on bind Tariq Toukan
2025-10-23 6:46 ` Greg Kroah-Hartman
2025-10-23 7:14 ` Tariq Toukan
2025-10-23 8:03 ` Greg Kroah-Hartman
2025-10-23 6:47 ` Greg Kroah-Hartman
2025-10-23 7:08 ` Tariq Toukan
2025-10-26 7:15 ` Leon Romanovsky [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-03-17 10:32 Mark Bloch
2025-03-17 13:16 ` Greg Kroah-Hartman
2025-03-17 13:22 ` Mark Bloch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251026071508.GA12554@unreal \
--to=leon@kernel.org \
--cc=amirtz@nvidia.com \
--cc=ayal@nvidia.com \
--cc=dakr@kernel.org \
--cc=gal@nvidia.com \
--cc=gregkh@linuxfoundation.org \
--cc=horms@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mbloch@nvidia.com \
--cc=parav@nvidia.com \
--cc=przemyslaw.kitszel@intel.com \
--cc=rafael@kernel.org \
--cc=saeedm@nvidia.com \
--cc=shayd@nvidia.com \
--cc=tariqt@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.