[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[patch V2 01/31] genirq/msi: Move descriptor list to struct msi_device_data



It's only required when MSI is in use.

Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 drivers/base/core.c    |    3 ---
 include/linux/device.h |    4 ----
 include/linux/msi.h    |    4 +++-
 kernel/irq/msi.c       |    5 ++++-
 4 files changed, 7 insertions(+), 9 deletions(-)

--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2874,9 +2874,6 @@ void device_initialize(struct device *de
        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);
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -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
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -145,11 +145,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);
@@ -174,7 +176,7 @@ unsigned int msi_get_virq(struct device
 
 /* 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)  \
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -99,7 +99,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;
 }
 
@@ -124,6 +126,7 @@ int msi_setup_device_data(struct device
        if (!md)
                return -ENOMEM;
 
+       INIT_LIST_HEAD(&md->list);
        dev->msi.data = md;
        devres_add(dev, md);
        return 0;




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.