Skip to content

Commit

Permalink
genirq/msi: Remove the original sysfs interfaces
Browse files Browse the repository at this point in the history
No more users. Refactor the core code accordingly and move the global
interface under CONFIG_PCI_MSI_ARCH_FALLBACKS.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Michael Kelley <mikelley@microsoft.com>
Tested-by: Nishanth Menon <nm@ti.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20211210221814.168362229@linutronix.de
  • Loading branch information
KAGA-KOKO committed Dec 16, 2021
1 parent 25ce693 commit 24cff37
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 48 deletions.
18 changes: 3 additions & 15 deletions include/linux/msi.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,22 +249,10 @@ void pci_msi_unmask_irq(struct irq_data *data);
#ifdef CONFIG_SYSFS
int msi_device_populate_sysfs(struct device *dev);
void msi_device_destroy_sysfs(struct device *dev);

const struct attribute_group **msi_populate_sysfs(struct device *dev);
void msi_destroy_sysfs(struct device *dev,
const struct attribute_group **msi_irq_groups);
#else
#else /* CONFIG_SYSFS */
static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
static inline void msi_device_destroy_sysfs(struct device *dev) { }

static inline const struct attribute_group **msi_populate_sysfs(struct device *dev)
{
return NULL;
}
static inline void msi_destroy_sysfs(struct device *dev, const struct attribute_group **msi_irq_groups)
{
}
#endif
#endif /* !CONFIG_SYSFS */

/*
* The arch hooks to setup up msi irqs. Default functions are implemented
Expand All @@ -279,7 +267,7 @@ int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
void arch_teardown_msi_irq(unsigned int irq);
int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void arch_teardown_msi_irqs(struct pci_dev *dev);
#endif
#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */

/*
* The restore hook is still available even for fully irq domain based
Expand Down
53 changes: 20 additions & 33 deletions kernel/irq/msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,8 @@ static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
/**
* msi_populate_sysfs - Populate msi_irqs sysfs entries for devices
* @dev: The device(PCI, platform etc) who will get sysfs entries
*
* Return attribute_group ** so that specific bus MSI can save it to
* somewhere during initilizing msi irqs. If devices has no MSI irq,
* return NULL; if it fails to populate sysfs, return ERR_PTR
*/
const struct attribute_group **msi_populate_sysfs(struct device *dev)
static const struct attribute_group **msi_populate_sysfs(struct device *dev)
{
const struct attribute_group **msi_irq_groups;
struct attribute **msi_attrs, *msi_attr;
Expand Down Expand Up @@ -213,42 +209,33 @@ int msi_device_populate_sysfs(struct device *dev)
return 0;
}

/**
* msi_destroy_sysfs - Destroy msi_irqs sysfs entries for devices
* @dev: The device(PCI, platform etc) who will remove sysfs entries
* @msi_irq_groups: attribute_group for device msi_irqs entries
*/
void msi_destroy_sysfs(struct device *dev, const struct attribute_group **msi_irq_groups)
{
struct device_attribute *dev_attr;
struct attribute **msi_attrs;
int count = 0;

if (msi_irq_groups) {
sysfs_remove_groups(&dev->kobj, msi_irq_groups);
msi_attrs = msi_irq_groups[0]->attrs;
while (msi_attrs[count]) {
dev_attr = container_of(msi_attrs[count],
struct device_attribute, attr);
kfree(dev_attr->attr.name);
kfree(dev_attr);
++count;
}
kfree(msi_attrs);
kfree(msi_irq_groups[0]);
kfree(msi_irq_groups);
}
}

/**
* msi_device_destroy_sysfs - Destroy msi_irqs sysfs entries for a device
* @dev: The device (PCI, platform etc) for which to remove
* sysfs entries
*/
void msi_device_destroy_sysfs(struct device *dev)
{
msi_destroy_sysfs(dev, dev->msi.data->attrs);
const struct attribute_group **msi_irq_groups = dev->msi.data->attrs;
struct device_attribute *dev_attr;
struct attribute **msi_attrs;
int count = 0;

dev->msi.data->attrs = NULL;
if (!msi_irq_groups)
return;

sysfs_remove_groups(&dev->kobj, msi_irq_groups);
msi_attrs = msi_irq_groups[0]->attrs;
while (msi_attrs[count]) {
dev_attr = container_of(msi_attrs[count], struct device_attribute, attr);
kfree(dev_attr->attr.name);
kfree(dev_attr);
++count;
}
kfree(msi_attrs);
kfree(msi_irq_groups[0]);
kfree(msi_irq_groups);
}
#endif

Expand Down

0 comments on commit 24cff37

Please sign in to comment.