aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vfio
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2016-09-11 09:31:26 -0400
committerAlex Williamson <alex.williamson@redhat.com>2016-09-29 15:36:38 -0400
commit61771468e0a567f007fc450725063bb9cf7eb199 (patch)
tree5065da5efca34a18e5cb0b0d9f7418e533444981 /drivers/vfio
parentc93a97ee0583cd65adaf872e7cc402493eae92a7 (diff)
vfio_pci: use pci_alloc_irq_vectors
Simplify the interrupt setup by using the new PCI layer helpers. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'drivers/vfio')
-rw-r--r--drivers/vfio/pci/vfio_pci_intrs.c45
-rw-r--r--drivers/vfio/pci/vfio_pci_private.h1
2 files changed, 10 insertions, 36 deletions
diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
index aa23e9a4a22f..c2e60893cd09 100644
--- a/drivers/vfio/pci/vfio_pci_intrs.c
+++ b/drivers/vfio/pci/vfio_pci_intrs.c
@@ -250,6 +250,7 @@ static irqreturn_t vfio_msihandler(int irq, void *arg)
250static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix) 250static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)
251{ 251{
252 struct pci_dev *pdev = vdev->pdev; 252 struct pci_dev *pdev = vdev->pdev;
253 unsigned int flag = msix ? PCI_IRQ_MSIX : PCI_IRQ_MSI;
253 int ret; 254 int ret;
254 255
255 if (!is_irq_none(vdev)) 256 if (!is_irq_none(vdev))
@@ -259,35 +260,13 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)
259 if (!vdev->ctx) 260 if (!vdev->ctx)
260 return -ENOMEM; 261 return -ENOMEM;
261 262
262 if (msix) { 263 /* return the number of supported vectors if we can't get all: */
263 int i; 264 ret = pci_alloc_irq_vectors(pdev, 1, nvec, flag);
264 265 if (ret < nvec) {
265 vdev->msix = kzalloc(nvec * sizeof(struct msix_entry), 266 if (ret > 0)
266 GFP_KERNEL); 267 pci_free_irq_vectors(pdev);
267 if (!vdev->msix) { 268 kfree(vdev->ctx);
268 kfree(vdev->ctx); 269 return ret;
269 return -ENOMEM;
270 }
271
272 for (i = 0; i < nvec; i++)
273 vdev->msix[i].entry = i;
274
275 ret = pci_enable_msix_range(pdev, vdev->msix, 1, nvec);
276 if (ret < nvec) {
277 if (ret > 0)
278 pci_disable_msix(pdev);
279 kfree(vdev->msix);
280 kfree(vdev->ctx);
281 return ret;
282 }
283 } else {
284 ret = pci_enable_msi_range(pdev, 1, nvec);
285 if (ret < nvec) {
286 if (ret > 0)
287 pci_disable_msi(pdev);
288 kfree(vdev->ctx);
289 return ret;
290 }
291 } 270 }
292 271
293 vdev->num_ctx = nvec; 272 vdev->num_ctx = nvec;
@@ -315,7 +294,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
315 if (vector < 0 || vector >= vdev->num_ctx) 294 if (vector < 0 || vector >= vdev->num_ctx)
316 return -EINVAL; 295 return -EINVAL;
317 296
318 irq = msix ? vdev->msix[vector].vector : pdev->irq + vector; 297 irq = pci_irq_vector(pdev, vector);
319 298
320 if (vdev->ctx[vector].trigger) { 299 if (vdev->ctx[vector].trigger) {
321 free_irq(irq, vdev->ctx[vector].trigger); 300 free_irq(irq, vdev->ctx[vector].trigger);
@@ -408,11 +387,7 @@ static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix)
408 387
409 vfio_msi_set_block(vdev, 0, vdev->num_ctx, NULL, msix); 388 vfio_msi_set_block(vdev, 0, vdev->num_ctx, NULL, msix);
410 389
411 if (msix) { 390 pci_free_irq_vectors(pdev);
412 pci_disable_msix(vdev->pdev);
413 kfree(vdev->msix);
414 } else
415 pci_disable_msi(pdev);
416 391
417 /* 392 /*
418 * Both disable paths above use pci_intx_for_msi() to clear DisINTx 393 * Both disable paths above use pci_intx_for_msi() to clear DisINTx
diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h
index 2128de86c80d..f561ac1c78a0 100644
--- a/drivers/vfio/pci/vfio_pci_private.h
+++ b/drivers/vfio/pci/vfio_pci_private.h
@@ -72,7 +72,6 @@ struct vfio_pci_device {
72 struct perm_bits *msi_perm; 72 struct perm_bits *msi_perm;
73 spinlock_t irqlock; 73 spinlock_t irqlock;
74 struct mutex igate; 74 struct mutex igate;
75 struct msix_entry *msix;
76 struct vfio_pci_irq_ctx *ctx; 75 struct vfio_pci_irq_ctx *ctx;
77 int num_ctx; 76 int num_ctx;
78 int irq_type; 77 int irq_type;