2019-04-30 14:42:39 -04:00
// SPDX-License-Identifier: GPL-2.0
2016-09-14 16:18:56 +02:00
/*
* Copyright ( c ) 2016 Christoph Hellwig .
*/
2016-09-19 15:50:16 +10:00
# include <linux/kobject.h>
# include <linux/blkdev.h>
2016-09-14 16:18:56 +02:00
# include <linux/blk-mq.h>
# include <linux/blk-mq-pci.h>
# include <linux/pci.h>
# include <linux/module.h>
2018-07-02 23:46:43 +09:00
# include "blk-mq.h"
2016-09-14 16:18:56 +02:00
/**
* blk_mq_pci_map_queues - provide a default queue mapping for PCI device
2019-05-30 17:00:49 -07:00
* @ qmap : CPU to hardware queue map .
2016-09-14 16:18:56 +02:00
* @ pdev : PCI device associated with @ set .
2018-03-27 09:39:06 -06:00
* @ offset : Offset to use for the pci irq vector
2016-09-14 16:18:56 +02:00
*
* This function assumes the PCI device @ pdev has at least as many available
2017-03-29 20:04:36 +03:00
* interrupt vectors as @ set has queues . It will then query the vector
2016-09-14 16:18:56 +02: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 .
*/
2018-10-29 13:06:14 -06:00
int blk_mq_pci_map_queues ( struct blk_mq_queue_map * qmap , struct pci_dev * pdev ,
2018-03-27 09:39:06 -06:00
int offset )
2016-09-14 16:18:56 +02:00
{
const struct cpumask * mask ;
unsigned int queue , cpu ;
2018-10-29 13:06:14 -06:00
for ( queue = 0 ; queue < qmap - > nr_queues ; queue + + ) {
2018-03-27 09:39:06 -06:00
mask = pci_irq_get_affinity ( pdev , queue + offset ) ;
2016-09-14 16:18:56 +02:00
if ( ! mask )
2017-08-17 12:24:47 +02:00
goto fallback ;
2016-09-14 16:18:56 +02:00
for_each_cpu ( cpu , mask )
2018-10-24 13:16:11 -06:00
qmap - > mq_map [ cpu ] = qmap - > queue_offset + queue ;
2016-09-14 16:18:56 +02:00
}
return 0 ;
2017-08-17 12:24:47 +02:00
fallback :
2018-10-29 13:06:14 -06:00
WARN_ON_ONCE ( qmap - > nr_queues > 1 ) ;
blk_mq_clear_mq_map ( qmap ) ;
2017-08-17 12:24:47 +02:00
return 0 ;
2016-09-14 16:18:56 +02:00
}
EXPORT_SYMBOL_GPL ( blk_mq_pci_map_queues ) ;