diff options
-rw-r--r-- | drivers/virtio/virtio_pci_common.c | 11 | ||||
-rw-r--r-- | drivers/virtio/virtio_pci_common.h | 2 | ||||
-rw-r--r-- | drivers/virtio/virtio_pci_legacy.c | 1 | ||||
-rw-r--r-- | drivers/virtio/virtio_pci_modern.c | 2 | ||||
-rw-r--r-- | include/linux/virtio_config.h | 3 |
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 | ||
364 | const 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 |
365 | static int virtio_pci_freeze(struct device *dev) | 376 | static 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 | */ |
109 | int vp_set_vq_affinity(struct virtqueue *vq, int cpu); | 109 | int vp_set_vq_affinity(struct virtqueue *vq, int cpu); |
110 | 110 | ||
111 | const 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) |
112 | int virtio_pci_legacy_probe(struct virtio_pci_device *); | 114 | int virtio_pci_legacy_probe(struct virtio_pci_device *); |
113 | void virtio_pci_legacy_remove(struct virtio_pci_device *); | 115 | void 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 | ||
442 | static const struct virtio_config_ops virtio_pci_config_ops = { | 443 | static 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 | */ |
62 | typedef void vq_callback_t(struct virtqueue *); | 63 | typedef void vq_callback_t(struct virtqueue *); |
63 | struct virtio_config_ops { | 64 | struct 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. */ |