genirq/msi: Move descriptor list to struct msi_device_data
authorThomas Gleixner <tglx@linutronix.de>
Mon, 6 Dec 2021 22:51:04 +0000 (23:51 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 16 Dec 2021 21:22:16 +0000 (22:22 +0100)
It's only required when MSI is in use.

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/20211206210747.650487479@linutronix.de
drivers/base/core.c
include/linux/device.h
include/linux/msi.h
kernel/irq/msi.c

index f26c668..f898786 100644 (file)
@@ -2874,9 +2874,6 @@ void device_initialize(struct device *dev)
        INIT_LIST_HEAD(&dev->devres_head);
        device_pm_init(dev);
        set_dev_node(dev, NUMA_NO_NODE);
-#ifdef CONFIG_GENERIC_MSI_IRQ
-       INIT_LIST_HEAD(&dev->msi_list);
-#endif
        INIT_LIST_HEAD(&dev->links.consumers);
        INIT_LIST_HEAD(&dev->links.suppliers);
        INIT_LIST_HEAD(&dev->links.defer_sync);
index f0033cd..9345972 100644 (file)
@@ -423,7 +423,6 @@ struct dev_msi_info {
  * @pins:      For device pin management.
  *             See Documentation/driver-api/pin-control.rst for details.
  * @msi:       MSI related data
- * @msi_list:  Hosts MSI descriptors
  * @numa_node: NUMA node this device is close to.
  * @dma_ops:    DMA mapping operations for this device.
  * @dma_mask:  Dma mask (if dma'ble device).
@@ -519,9 +518,6 @@ struct device {
        struct dev_pin_info     *pins;
 #endif
        struct dev_msi_info     msi;
-#ifdef CONFIG_GENERIC_MSI_IRQ
-       struct list_head        msi_list;
-#endif
 #ifdef CONFIG_DMA_OPS
        const struct dma_map_ops *dma_ops;
 #endif
index 7593fc3..4223e47 100644 (file)
@@ -144,11 +144,13 @@ struct msi_desc {
  * @properties:                MSI properties which are interesting to drivers
  * @attrs:             Pointer to the sysfs attribute group
  * @platform_data:     Platform-MSI specific data
+ * @list:              List of MSI descriptors associated to the device
  */
 struct msi_device_data {
        unsigned long                   properties;
        const struct attribute_group    **attrs;
        struct platform_msi_priv_data   *platform_data;
+       struct list_head                list;
 };
 
 int msi_setup_device_data(struct device *dev);
@@ -157,7 +159,7 @@ unsigned int msi_get_virq(struct device *dev, unsigned int index);
 
 /* Helpers to hide struct msi_desc implementation details */
 #define msi_desc_to_dev(desc)          ((desc)->dev)
-#define dev_to_msi_list(dev)           (&(dev)->msi_list)
+#define dev_to_msi_list(dev)           (&(dev)->msi.data->list)
 #define first_msi_entry(dev)           \
        list_first_entry(dev_to_msi_list((dev)), struct msi_desc, list)
 #define for_each_msi_entry(desc, dev)  \
index ab5e83f..c66787d 100644 (file)
@@ -75,7 +75,9 @@ EXPORT_SYMBOL_GPL(get_cached_msi_msg);
 
 static void msi_device_data_release(struct device *dev, void *res)
 {
-       WARN_ON_ONCE(!list_empty(&dev->msi_list));
+       struct msi_device_data *md = res;
+
+       WARN_ON_ONCE(!list_empty(&md->list));
        dev->msi.data = NULL;
 }
 
@@ -100,6 +102,7 @@ int msi_setup_device_data(struct device *dev)
        if (!md)
                return -ENOMEM;
 
+       INIT_LIST_HEAD(&md->list);
        dev->msi.data = md;
        devres_add(dev, md);
        return 0;