Skip to content

Commit ee8d41e

Browse files
committed
pci/msi: Retrieve affinity for a vector
Add a helper to get the affinity mask for a given PCI irq vector. For MSI or MSI-X vectors these are stored by the IRQ core, while for legacy interrupts we will always return cpu_possible_map. [hch: updated to follow the style of pci_irq_vector()] Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Christoph Hellwig <hch@lst.de> Cc: axboe@fb.com Cc: keith.busch@intel.com Cc: agordeev@redhat.com Cc: linux-block@vger.kernel.org Link: http://lkml.kernel.org/r/1473862739-15032-6-git-send-email-hch@lst.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
1 parent 44082fd commit ee8d41e

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

drivers/pci/msi.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,37 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
12701270
}
12711271
EXPORT_SYMBOL(pci_irq_vector);
12721272

1273+
/**
1274+
* pci_irq_get_affinity - return the affinity of a particular msi vector
1275+
* @dev: PCI device to operate on
1276+
* @nr: device-relative interrupt vector index (0-based).
1277+
*/
1278+
const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
1279+
{
1280+
if (dev->msix_enabled) {
1281+
struct msi_desc *entry;
1282+
int i = 0;
1283+
1284+
for_each_pci_msi_entry(entry, dev) {
1285+
if (i == nr)
1286+
return entry->affinity;
1287+
i++;
1288+
}
1289+
WARN_ON_ONCE(1);
1290+
return NULL;
1291+
} else if (dev->msi_enabled) {
1292+
struct msi_desc *entry = first_pci_msi_entry(dev);
1293+
1294+
if (WARN_ON_ONCE(!entry || nr >= entry->nvec_used))
1295+
return NULL;
1296+
1297+
return &entry->affinity[nr];
1298+
} else {
1299+
return cpu_possible_mask;
1300+
}
1301+
}
1302+
EXPORT_SYMBOL(pci_irq_get_affinity);
1303+
12731304
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
12741305
{
12751306
return to_pci_dev(desc->dev);

include/linux/pci.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,7 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
13001300
unsigned int max_vecs, unsigned int flags);
13011301
void pci_free_irq_vectors(struct pci_dev *dev);
13021302
int pci_irq_vector(struct pci_dev *dev, unsigned int nr);
1303+
const struct cpumask *pci_irq_get_affinity(struct pci_dev *pdev, int vec);
13031304

13041305
#else
13051306
static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
@@ -1342,6 +1343,11 @@ static inline int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
13421343
return -EINVAL;
13431344
return dev->irq;
13441345
}
1346+
static inline const struct cpumask *pci_irq_get_affinity(struct pci_dev *pdev,
1347+
int vec)
1348+
{
1349+
return cpu_possible_mask;
1350+
}
13451351
#endif
13461352

13471353
#ifdef CONFIG_PCIEPORTBUS

0 commit comments

Comments
 (0)