mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
virtio: allow drivers to request IRQ affinity when creating VQs
Add a struct irq_affinity pointer to the find_vqs methods, which if set is used to tell the PCI layer to create the MSI-X vectors for our I/O virtqueues with the proper affinity from the start. Compared to after the fact affinity hints this gives us an instantly working setup and allows to allocate the irq descritors node-local and avoid interconnect traffic. Last but not least this will allow blk-mq queues are created based on the interrupt affinity for storage drivers. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
52a6151612
commit
fb5e31d970
20 changed files with 48 additions and 34 deletions
|
@ -7,6 +7,8 @@
|
|||
#include <linux/virtio_byteorder.h>
|
||||
#include <uapi/linux/virtio_config.h>
|
||||
|
||||
struct irq_affinity;
|
||||
|
||||
/**
|
||||
* virtio_config_ops - operations for configuring a virtio device
|
||||
* @get: read the value of a configuration field
|
||||
|
@ -68,9 +70,8 @@ struct virtio_config_ops {
|
|||
void (*set_status)(struct virtio_device *vdev, u8 status);
|
||||
void (*reset)(struct virtio_device *vdev);
|
||||
int (*find_vqs)(struct virtio_device *, unsigned nvqs,
|
||||
struct virtqueue *vqs[],
|
||||
vq_callback_t *callbacks[],
|
||||
const char * const names[]);
|
||||
struct virtqueue *vqs[], vq_callback_t *callbacks[],
|
||||
const char * const names[], struct irq_affinity *desc);
|
||||
void (*del_vqs)(struct virtio_device *);
|
||||
u64 (*get_features)(struct virtio_device *vdev);
|
||||
int (*finalize_features)(struct virtio_device *vdev);
|
||||
|
@ -169,7 +170,7 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
|
|||
vq_callback_t *callbacks[] = { c };
|
||||
const char *names[] = { n };
|
||||
struct virtqueue *vq;
|
||||
int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names);
|
||||
int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names, NULL);
|
||||
if (err < 0)
|
||||
return ERR_PTR(err);
|
||||
return vq;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue