2016-09-14 17:18:56 +03:00
/*
* Copyright ( c ) 2016 Christoph Hellwig .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*/
2016-09-19 08:50:16 +03:00
# include <linux/kobject.h>
# include <linux/blkdev.h>
2016-09-14 17:18:56 +03:00
# include <linux/blk-mq.h>
# include <linux/blk-mq-pci.h>
# include <linux/pci.h>
# include <linux/module.h>
/**
* blk_mq_pci_map_queues - provide a default queue mapping for PCI device
* @ set : tagset to provide the mapping for
* @ pdev : PCI device associated with @ set .
*
* 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 17:18:56 +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 .
*/
int blk_mq_pci_map_queues ( struct blk_mq_tag_set * set , struct pci_dev * pdev )
{
const struct cpumask * mask ;
unsigned int queue , cpu ;
for ( queue = 0 ; queue < set - > nr_hw_queues ; queue + + ) {
mask = pci_irq_get_affinity ( pdev , queue ) ;
if ( ! mask )
2017-08-17 13:24:47 +03:00
goto fallback ;
2016-09-14 17:18:56 +03:00
for_each_cpu ( cpu , mask )
set - > mq_map [ cpu ] = queue ;
}
return 0 ;
2017-08-17 13:24:47 +03:00
fallback :
WARN_ON_ONCE ( set - > nr_hw_queues > 1 ) ;
for_each_possible_cpu ( cpu )
set - > mq_map [ cpu ] = 0 ;
return 0 ;
2016-09-14 17:18:56 +03:00
}
EXPORT_SYMBOL_GPL ( blk_mq_pci_map_queues ) ;