aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-02-05 12:15:23 -0500
committerMichael S. Tsirkin <mst@redhat.com>2017-02-27 13:54:05 -0500
commitbbaba479563910aaa51e59bb9027a09e396d3a3c (patch)
tree0c67858d20c8a87b3abfc8cd4baf4f68ce84165c
parentfb5e31d970ce8b4941f03ed765d7dbefc39f22d9 (diff)
virtio: provide a method to get the IRQ affinity mask for a virtqueue
This basically passed up the pci_irq_get_affinity information through virtio through an optional get_vq_affinity method. It is only implemented by the PCI backend for now, and only when we use per-virtqueue IRQs. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--drivers/virtio/virtio_pci_common.c11
-rw-r--r--drivers/virtio/virtio_pci_common.h2
-rw-r--r--drivers/virtio/virtio_pci_legacy.c1
-rw-r--r--drivers/virtio/virtio_pci_modern.c2
-rw-r--r--include/linux/virtio_config.h3
5 files changed, 19 insertions, 0 deletions
diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index 7902e920fc73..df548a6fb844 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -361,6 +361,17 @@ int vp_set_vq_affinity(struct virtqueue *vq, int cpu)
361 return 0; 361 return 0;
362} 362}
363 363
364const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index)
365{
366 struct virtio_pci_device *vp_dev = to_vp_device(vdev);
367 unsigned int *map = vp_dev->msix_vector_map;
368
369 if (!map || map[index] == VIRTIO_MSI_NO_VECTOR)
370 return NULL;
371
372 return pci_irq_get_affinity(vp_dev->pci_dev, map[index]);
373}
374
364#ifdef CONFIG_PM_SLEEP 375#ifdef CONFIG_PM_SLEEP
365static int virtio_pci_freeze(struct device *dev) 376static int virtio_pci_freeze(struct device *dev)
366{ 377{
diff --git a/drivers/virtio/virtio_pci_common.h b/drivers/virtio/virtio_pci_common.h
index a6ad9ec6baef..ac8c9d788964 100644
--- a/drivers/virtio/virtio_pci_common.h
+++ b/drivers/virtio/virtio_pci_common.h
@@ -108,6 +108,8 @@ const char *vp_bus_name(struct virtio_device *vdev);
108 */ 108 */
109int vp_set_vq_affinity(struct virtqueue *vq, int cpu); 109int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
110 110
111const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index);
112
111#if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY) 113#if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
112int virtio_pci_legacy_probe(struct virtio_pci_device *); 114int virtio_pci_legacy_probe(struct virtio_pci_device *);
113void virtio_pci_legacy_remove(struct virtio_pci_device *); 115void virtio_pci_legacy_remove(struct virtio_pci_device *);
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index 2ab6aee51bf6..f7362c5fe18a 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -190,6 +190,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
190 .finalize_features = vp_finalize_features, 190 .finalize_features = vp_finalize_features,
191 .bus_name = vp_bus_name, 191 .bus_name = vp_bus_name,
192 .set_vq_affinity = vp_set_vq_affinity, 192 .set_vq_affinity = vp_set_vq_affinity,
193 .get_vq_affinity = vp_get_vq_affinity,
193}; 194};
194 195
195/* the PCI probing function */ 196/* the PCI probing function */
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index a7a0981e441c..7bc3004b840e 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -437,6 +437,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
437 .finalize_features = vp_finalize_features, 437 .finalize_features = vp_finalize_features,
438 .bus_name = vp_bus_name, 438 .bus_name = vp_bus_name,
439 .set_vq_affinity = vp_set_vq_affinity, 439 .set_vq_affinity = vp_set_vq_affinity,
440 .get_vq_affinity = vp_get_vq_affinity,
440}; 441};
441 442
442static const struct virtio_config_ops virtio_pci_config_ops = { 443static const struct virtio_config_ops virtio_pci_config_ops = {
@@ -452,6 +453,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
452 .finalize_features = vp_finalize_features, 453 .finalize_features = vp_finalize_features,
453 .bus_name = vp_bus_name, 454 .bus_name = vp_bus_name,
454 .set_vq_affinity = vp_set_vq_affinity, 455 .set_vq_affinity = vp_set_vq_affinity,
456 .get_vq_affinity = vp_get_vq_affinity,
455}; 457};
456 458
457/** 459/**
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 2ebe506fe41a..8355bab175e1 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -58,6 +58,7 @@ struct irq_affinity;
58 * This returns a pointer to the bus name a la pci_name from which 58 * This returns a pointer to the bus name a la pci_name from which
59 * the caller can then copy. 59 * the caller can then copy.
60 * @set_vq_affinity: set the affinity for a virtqueue. 60 * @set_vq_affinity: set the affinity for a virtqueue.
61 * @get_vq_affinity: get the affinity for a virtqueue (optional).
61 */ 62 */
62typedef void vq_callback_t(struct virtqueue *); 63typedef void vq_callback_t(struct virtqueue *);
63struct virtio_config_ops { 64struct virtio_config_ops {
@@ -77,6 +78,8 @@ struct virtio_config_ops {
77 int (*finalize_features)(struct virtio_device *vdev); 78 int (*finalize_features)(struct virtio_device *vdev);
78 const char *(*bus_name)(struct virtio_device *vdev); 79 const char *(*bus_name)(struct virtio_device *vdev);
79 int (*set_vq_affinity)(struct virtqueue *vq, int cpu); 80 int (*set_vq_affinity)(struct virtqueue *vq, int cpu);
81 const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
82 int index);
80}; 83};
81 84
82/* If driver didn't advertise the feature, it will never appear. */ 85/* If driver didn't advertise the feature, it will never appear. */