... - get IRQ affinity mask for device Return the CPU affinity mask for @dev and @irq_vec. With the above changes, Acked-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > + */ > +static const struct cpumask *pci_device_irq_get_affinity(struct device *dev, > + unsigned int irq_vec) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + > + return pci_irq_get_affinity(pdev, irq_vec); > +} > + > const struct bus_type pci_bus_type = { > .name = "pci", > .match = pci_bus_match, > @@ -1677,6 +1692,7 @@ const struct bus_type pci_bus_type = { > .probe = pci_device_probe, > .remove = pci_device_remove, > .shutdown = pci_device_shutdown, > + .irq_get_affinity = pci_device_irq_get_affinity, > .dev_groups = pci_dev_groups, > .bus_groups = pci_bus_groups, > .drv_groups = pci_drv_groups, > diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c > index b9095751e43bb7db5fc991b0cc0979d2e86f7b9b..86390db7e74befa17c9fa146ab6b454bbae3b7f5 100644 > --- a/drivers/virtio/virtio.c > +++ b/drivers/virtio/virtio.c > @@ -377,6 +377,17 @@ static void virtio_dev_remove(struct device *_d) > of_node_put(dev->dev.of_node); > } > > +static const struct cpumask *virtio_irq_get_affinity(struct device *_d, > + unsigned int irq_veq) > +{ > + struct virtio_device *dev = dev_to_virtio(_d); > + > + if (!dev->config->get_vq_affinity) > + return NULL; > + > + return dev->config->get_vq_affinity(dev, irq_veq); > +} > + > static const struct bus_type virtio_bus = { > .name = "virtio", > .match = virtio_dev_match, > @@ -384,6 +395,7 @@ static const struct bus_type virtio_bus = { > .uevent = virtio_uevent, > .probe = virtio_dev_probe, > .remove = virtio_dev_remove, > + .irq_get_affinity = virtio_irq_get_affinity, > }; > > int __register_virtio_driver(struct virtio_driver *driver, struct module *owner) > diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h > index 2035fad3131fb60781957095ce8a3a941dd104be..6b40af77bf44afa7112d274b731b591f2a67d68c 100644 > --- a/include/linux/blk-mq.h > +++ b/include/linux/blk-mq.h > @@ -922,7 +922,12 @@ int blk_mq_freeze_queue_wait_timeout(struct request_queue *q, > void blk_mq_unfreeze_queue_non_owner(struct request_queue *q); > void blk_freeze_queue_start_non_owner(struct request_queue *q); > > +typedef const struct cpumask *(get_queue_affinity_fn)(struct device *dev, > + unsigned int queue); > void blk_mq_map_queues(struct blk_mq_queue_map *qmap); > +void blk_mq_hctx_map_queues(struct blk_mq_queue_map *qmap, > + struct device *dev, unsigned int offset, > + get_queue_affinity_fn *get_queue_affinity); > void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues); > > void blk_mq_quiesce_queue_nowait(struct request_queue *q); > diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h > index cdc4757217f9bb4b36b5c3b8a48bab45737e44c5..b18658bce2c3819fc1cbeb38fb98391d56ec3317 100644 > --- a/include/linux/device/bus.h > +++ b/include/linux/device/bus.h > @@ -48,6 +48,7 @@ struct fwnode_handle; > * will never get called until they do. > * @remove: Called when a device removed from this bus. > * @shutdown: Called at shut-down time to quiesce the device. > + * @irq_get_affinity: Get IRQ affinity mask for the device on this bus. > * > * @online: Called to put the device back online (after offlining it). > * @offline: Called to put the device offline for hot-removal. May fail. > @@ -87,6 +88,8 @@ struct bus_type { > void (*sync_state)(struct device *dev); > void (*remove)(struct device *dev); > void (*shutdown)(struct device *dev); > + const struct cpumask *(*irq_get_affinity)(struct device *dev, > + unsigned int irq_vec); > > int (*online)(struct device *dev); > int (*offline)(struct device *dev); > > -- > 2.47.0 >