Skip to content

Commit bbaba47

Browse files
Christoph Hellwigmstsirkin
authored andcommitted
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 <[email protected]> Reviewed-by: Jason Wang <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent fb5e31d commit bbaba47

File tree

5 files changed

+19
-0
lines changed

5 files changed

+19
-0
lines changed

drivers/virtio/virtio_pci_common.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,17 @@ int vp_set_vq_affinity(struct virtqueue *vq, int cpu)
361361
return 0;
362362
}
363363

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+
364375
#ifdef CONFIG_PM_SLEEP
365376
static int virtio_pci_freeze(struct device *dev)
366377
{

drivers/virtio/virtio_pci_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ const char *vp_bus_name(struct virtio_device *vdev);
108108
*/
109109
int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
110110

111+
const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index);
112+
111113
#if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
112114
int virtio_pci_legacy_probe(struct virtio_pci_device *);
113115
void virtio_pci_legacy_remove(struct virtio_pci_device *);

drivers/virtio/virtio_pci_legacy.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
190190
.finalize_features = vp_finalize_features,
191191
.bus_name = vp_bus_name,
192192
.set_vq_affinity = vp_set_vq_affinity,
193+
.get_vq_affinity = vp_get_vq_affinity,
193194
};
194195

195196
/* the PCI probing function */

drivers/virtio/virtio_pci_modern.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
437437
.finalize_features = vp_finalize_features,
438438
.bus_name = vp_bus_name,
439439
.set_vq_affinity = vp_set_vq_affinity,
440+
.get_vq_affinity = vp_get_vq_affinity,
440441
};
441442

442443
static const struct virtio_config_ops virtio_pci_config_ops = {
@@ -452,6 +453,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
452453
.finalize_features = vp_finalize_features,
453454
.bus_name = vp_bus_name,
454455
.set_vq_affinity = vp_set_vq_affinity,
456+
.get_vq_affinity = vp_get_vq_affinity,
455457
};
456458

457459
/**

include/linux/virtio_config.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ struct irq_affinity;
5858
* This returns a pointer to the bus name a la pci_name from which
5959
* the caller can then copy.
6060
* @set_vq_affinity: set the affinity for a virtqueue.
61+
* @get_vq_affinity: get the affinity for a virtqueue (optional).
6162
*/
6263
typedef void vq_callback_t(struct virtqueue *);
6364
struct virtio_config_ops {
@@ -77,6 +78,8 @@ struct virtio_config_ops {
7778
int (*finalize_features)(struct virtio_device *vdev);
7879
const char *(*bus_name)(struct virtio_device *vdev);
7980
int (*set_vq_affinity)(struct virtqueue *vq, int cpu);
81+
const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
82+
int index);
8083
};
8184

8285
/* If driver didn't advertise the feature, it will never appear. */

0 commit comments

Comments
 (0)