genirq/msi: Add cpumask allocation to alloc_msi_entry
[cascardo/linux.git] / kernel / irq / msi.c
index 19e9dfb..8a3e872 100644 (file)
 /* Temparory solution for building, will be removed later */
 #include <linux/pci.h>
 
-struct msi_desc *alloc_msi_entry(struct device *dev)
+/**
+ * alloc_msi_entry - Allocate an initialize msi_entry
+ * @dev:       Pointer to the device for which this is allocated
+ * @nvec:      The number of vectors used in this entry
+ * @affinity:  Optional pointer to an affinity mask array size of @nvec
+ *
+ * If @affinity is not NULL then a an affinity array[@nvec] is allocated
+ * and the affinity masks from @affinity are copied.
+ */
+struct msi_desc *
+alloc_msi_entry(struct device *dev, int nvec, const struct cpumask *affinity)
 {
-       struct msi_desc *desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+       struct msi_desc *desc;
+
+       desc = kzalloc(sizeof(*desc), GFP_KERNEL);
        if (!desc)
                return NULL;
 
        INIT_LIST_HEAD(&desc->list);
        desc->dev = dev;
+       desc->nvec_used = nvec;
+       if (affinity) {
+               desc->affinity = kmemdup(affinity,
+                       nvec * sizeof(*desc->affinity), GFP_KERNEL);
+               if (!desc->affinity) {
+                       kfree(desc);
+                       return NULL;
+               }
+       }
 
        return desc;
 }
 
 void free_msi_entry(struct msi_desc *entry)
 {
+       kfree(entry->affinity);
        kfree(entry);
 }