-
Notifications
You must be signed in to change notification settings - Fork 41
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'aux-sysfs-irqs' of git://git.kernel.org/pub/scm/linux/kern…
…el/git/mellanox/linux Saeed Mahameed says: ==================== aux-sysfs-irqs Shay Says: ========== Introduce auxiliary bus IRQs sysfs Today, PCI PFs and VFs, which are anchored on the PCI bus, display their IRQ information in the <pci_device>/msi_irqs/<irq_num> sysfs files. PCI subfunctions (SFs) are similar to PFs and VFs and these SFs are anchored on the auxiliary bus. However, these PCI SFs lack such IRQ information on the auxiliary bus, leaving users without visibility into which IRQs are used by the SFs. This absence makes it impossible to debug situations and to understand the source of interrupts/SFs for performance tuning and debug. Additionally, the SFs are multifunctional devices supporting RDMA, network devices, clocks, and more, similar to their peer PCI PFs and VFs. Therefore, it is desirable to have SFs' IRQ information available at the bus/device level. To overcome the above limitations, this short series extends the auxiliary bus to display IRQ information in sysfs, similar to that of PFs and VFs. It adds an 'irqs' directory under the auxiliary device and includes an <irq_num> sysfs file within it. For example: $ ls /sys/bus/auxiliary/devices/mlx5_core.sf.1/irqs/ 50 51 52 53 54 55 56 57 58 Patch summary: patch-1 adds auxiliary bus to support irqs used by auxiliary device patch-2 mlx5 driver using exposing irqs for PCI SF devices via auxiliary bus ========== * tag 'aux-sysfs-irqs' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux: net/mlx5: Expose SFs IRQs driver core: auxiliary bus: show auxiliary device IRQs RDMA/mlx5: Add Qcounters req_transport_retries_exceeded/req_rnr_retries_exceeded net/mlx5: Reimplement write combining test ==================== Link: https://patch.msgid.link/20240711213140.256997-1-saeed@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
- Loading branch information
Showing
20 changed files
with
651 additions
and
246 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
What: /sys/bus/auxiliary/devices/.../irqs/ | ||
Date: April, 2024 | ||
Contact: Shay Drory <shayd@nvidia.com> | ||
Description: | ||
The /sys/devices/.../irqs directory contains a variable set of | ||
files, with each file is named as irq number similar to PCI PF | ||
or VF's irq number located in msi_irqs directory. | ||
These irq files are added and removed dynamically when an IRQ | ||
is requested and freed respectively for the PCI SF. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES | ||
*/ | ||
|
||
#include <linux/auxiliary_bus.h> | ||
#include <linux/slab.h> | ||
|
||
#define AUXILIARY_MAX_IRQ_NAME 11 | ||
|
||
struct auxiliary_irq_info { | ||
struct device_attribute sysfs_attr; | ||
char name[AUXILIARY_MAX_IRQ_NAME]; | ||
}; | ||
|
||
static struct attribute *auxiliary_irq_attrs[] = { | ||
NULL | ||
}; | ||
|
||
static const struct attribute_group auxiliary_irqs_group = { | ||
.name = "irqs", | ||
.attrs = auxiliary_irq_attrs, | ||
}; | ||
|
||
static int auxiliary_irq_dir_prepare(struct auxiliary_device *auxdev) | ||
{ | ||
int ret = 0; | ||
|
||
guard(mutex)(&auxdev->sysfs.lock); | ||
if (auxdev->sysfs.irq_dir_exists) | ||
return 0; | ||
|
||
ret = devm_device_add_group(&auxdev->dev, &auxiliary_irqs_group); | ||
if (ret) | ||
return ret; | ||
|
||
auxdev->sysfs.irq_dir_exists = true; | ||
xa_init(&auxdev->sysfs.irqs); | ||
return 0; | ||
} | ||
|
||
/** | ||
* auxiliary_device_sysfs_irq_add - add a sysfs entry for the given IRQ | ||
* @auxdev: auxiliary bus device to add the sysfs entry. | ||
* @irq: The associated interrupt number. | ||
* | ||
* This function should be called after auxiliary device have successfully | ||
* received the irq. | ||
* The driver is responsible to add a unique irq for the auxiliary device. The | ||
* driver can invoke this function from multiple thread context safely for | ||
* unique irqs of the auxiliary devices. The driver must not invoke this API | ||
* multiple times if the irq is already added previously. | ||
* | ||
* Return: zero on success or an error code on failure. | ||
*/ | ||
int auxiliary_device_sysfs_irq_add(struct auxiliary_device *auxdev, int irq) | ||
{ | ||
struct auxiliary_irq_info *info __free(kfree) = NULL; | ||
struct device *dev = &auxdev->dev; | ||
int ret; | ||
|
||
ret = auxiliary_irq_dir_prepare(auxdev); | ||
if (ret) | ||
return ret; | ||
|
||
info = kzalloc(sizeof(*info), GFP_KERNEL); | ||
if (!info) | ||
return -ENOMEM; | ||
|
||
sysfs_attr_init(&info->sysfs_attr.attr); | ||
snprintf(info->name, AUXILIARY_MAX_IRQ_NAME, "%d", irq); | ||
|
||
ret = xa_insert(&auxdev->sysfs.irqs, irq, info, GFP_KERNEL); | ||
if (ret) | ||
return ret; | ||
|
||
info->sysfs_attr.attr.name = info->name; | ||
ret = sysfs_add_file_to_group(&dev->kobj, &info->sysfs_attr.attr, | ||
auxiliary_irqs_group.name); | ||
if (ret) | ||
goto sysfs_add_err; | ||
|
||
xa_store(&auxdev->sysfs.irqs, irq, no_free_ptr(info), GFP_KERNEL); | ||
return 0; | ||
|
||
sysfs_add_err: | ||
xa_erase(&auxdev->sysfs.irqs, irq); | ||
return ret; | ||
} | ||
EXPORT_SYMBOL_GPL(auxiliary_device_sysfs_irq_add); | ||
|
||
/** | ||
* auxiliary_device_sysfs_irq_remove - remove a sysfs entry for the given IRQ | ||
* @auxdev: auxiliary bus device to add the sysfs entry. | ||
* @irq: the IRQ to remove. | ||
* | ||
* This function should be called to remove an IRQ sysfs entry. | ||
* The driver must invoke this API when IRQ is released by the device. | ||
*/ | ||
void auxiliary_device_sysfs_irq_remove(struct auxiliary_device *auxdev, int irq) | ||
{ | ||
struct auxiliary_irq_info *info __free(kfree) = xa_load(&auxdev->sysfs.irqs, irq); | ||
struct device *dev = &auxdev->dev; | ||
|
||
if (!info) { | ||
dev_err(&auxdev->dev, "IRQ %d doesn't exist\n", irq); | ||
return; | ||
} | ||
sysfs_remove_file_from_group(&dev->kobj, &info->sysfs_attr.attr, | ||
auxiliary_irqs_group.name); | ||
xa_erase(&auxdev->sysfs.irqs, irq); | ||
} | ||
EXPORT_SYMBOL_GPL(auxiliary_device_sysfs_irq_remove); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.