2019-04-30 21:42:39 +03:00
// SPDX-License-Identifier: GPL-2.0
2017-02-05 20:15:24 +03:00
/*
* Copyright ( c ) 2016 Christoph Hellwig .
*/
# include <linux/device.h>
# include <linux/blk-mq-virtio.h>
# include <linux/virtio_config.h>
# include <linux/module.h>
# include "blk-mq.h"
/**
* blk_mq_virtio_map_queues - provide a default queue mapping for virtio device
2019-05-31 03:00:49 +03:00
* @ qmap : CPU to hardware queue map .
* @ vdev : virtio device to provide a mapping for .
2017-02-05 20:15:24 +03:00
* @ first_vec : first interrupt vectors to use for queues ( usually 0 )
*
* This function assumes the virtio device @ vdev has at least as many available
2019-10-30 01:35:56 +03:00
* interrupt vectors as @ set has queues . It will then query the vector
2017-02-05 20:15:24 +03:00
* corresponding to each queue for it ' s affinity mask and built queue mapping
* that maps a queue to the CPUs that have irq affinity for the corresponding
* vector .
*/
2022-08-15 20:00:43 +03:00
void blk_mq_virtio_map_queues ( struct blk_mq_queue_map * qmap ,
2017-02-05 20:15:24 +03:00
struct virtio_device * vdev , int first_vec )
{
const struct cpumask * mask ;
unsigned int queue , cpu ;
if ( ! vdev - > config - > get_vq_affinity )
goto fallback ;
2018-10-29 22:06:14 +03:00
for ( queue = 0 ; queue < qmap - > nr_queues ; queue + + ) {
2017-02-05 20:15:24 +03:00
mask = vdev - > config - > get_vq_affinity ( vdev , first_vec + queue ) ;
if ( ! mask )
goto fallback ;
for_each_cpu ( cpu , mask )
2018-10-24 22:16:11 +03:00
qmap - > mq_map [ cpu ] = qmap - > queue_offset + queue ;
2017-02-05 20:15:24 +03:00
}
2022-08-15 20:00:43 +03:00
return ;
2017-02-05 20:15:24 +03:00
fallback :
2022-08-15 20:00:43 +03:00
blk_mq_map_queues ( qmap ) ;
2017-02-05 20:15:24 +03:00
}
EXPORT_SYMBOL_GPL ( blk_mq_virtio_map_queues ) ;