@@ -2030,60 +2030,40 @@ static int nvme_setup_host_mem(struct nvme_dev *dev)
2030
2030
return ret ;
2031
2031
}
2032
2032
2033
- static void nvme_calc_io_queues (struct nvme_dev * dev , unsigned int nr_io_queues )
2033
+ static void nvme_calc_io_queues (struct nvme_dev * dev , unsigned int irq_queues )
2034
2034
{
2035
2035
unsigned int this_w_queues = write_queues ;
2036
- unsigned int this_p_queues = poll_queues ;
2037
2036
2038
2037
/*
2039
2038
* Setup read/write queue split
2040
2039
*/
2041
- if (nr_io_queues == 1 ) {
2040
+ if (irq_queues == 1 ) {
2042
2041
dev -> io_queues [HCTX_TYPE_DEFAULT ] = 1 ;
2043
2042
dev -> io_queues [HCTX_TYPE_READ ] = 0 ;
2044
- dev -> io_queues [HCTX_TYPE_POLL ] = 0 ;
2045
2043
return ;
2046
2044
}
2047
2045
2048
- /*
2049
- * Configure number of poll queues, if set
2050
- */
2051
- if (this_p_queues ) {
2052
- /*
2053
- * We need at least one queue left. With just one queue, we'll
2054
- * have a single shared read/write set.
2055
- */
2056
- if (this_p_queues >= nr_io_queues ) {
2057
- this_w_queues = 0 ;
2058
- this_p_queues = nr_io_queues - 1 ;
2059
- }
2060
-
2061
- dev -> io_queues [HCTX_TYPE_POLL ] = this_p_queues ;
2062
- nr_io_queues -= this_p_queues ;
2063
- } else
2064
- dev -> io_queues [HCTX_TYPE_POLL ] = 0 ;
2065
-
2066
2046
/*
2067
2047
* If 'write_queues' is set, ensure it leaves room for at least
2068
2048
* one read queue
2069
2049
*/
2070
- if (this_w_queues >= nr_io_queues )
2071
- this_w_queues = nr_io_queues - 1 ;
2050
+ if (this_w_queues >= irq_queues )
2051
+ this_w_queues = irq_queues - 1 ;
2072
2052
2073
2053
/*
2074
2054
* If 'write_queues' is set to zero, reads and writes will share
2075
2055
* a queue set.
2076
2056
*/
2077
2057
if (!this_w_queues ) {
2078
- dev -> io_queues [HCTX_TYPE_DEFAULT ] = nr_io_queues ;
2058
+ dev -> io_queues [HCTX_TYPE_DEFAULT ] = irq_queues ;
2079
2059
dev -> io_queues [HCTX_TYPE_READ ] = 0 ;
2080
2060
} else {
2081
2061
dev -> io_queues [HCTX_TYPE_DEFAULT ] = this_w_queues ;
2082
- dev -> io_queues [HCTX_TYPE_READ ] = nr_io_queues - this_w_queues ;
2062
+ dev -> io_queues [HCTX_TYPE_READ ] = irq_queues - this_w_queues ;
2083
2063
}
2084
2064
}
2085
2065
2086
- static int nvme_setup_irqs (struct nvme_dev * dev , int nr_io_queues )
2066
+ static int nvme_setup_irqs (struct nvme_dev * dev , unsigned int nr_io_queues )
2087
2067
{
2088
2068
struct pci_dev * pdev = to_pci_dev (dev -> dev );
2089
2069
int irq_sets [2 ];
@@ -2093,14 +2073,28 @@ static int nvme_setup_irqs(struct nvme_dev *dev, int nr_io_queues)
2093
2073
.sets = irq_sets ,
2094
2074
};
2095
2075
int result = 0 ;
2076
+ unsigned int irq_queues , this_p_queues ;
2077
+
2078
+ /*
2079
+ * Poll queues don't need interrupts, but we need at least one IO
2080
+ * queue left over for non-polled IO.
2081
+ */
2082
+ this_p_queues = poll_queues ;
2083
+ if (this_p_queues >= nr_io_queues ) {
2084
+ this_p_queues = nr_io_queues - 1 ;
2085
+ irq_queues = 1 ;
2086
+ } else {
2087
+ irq_queues = nr_io_queues - this_p_queues ;
2088
+ }
2089
+ dev -> io_queues [HCTX_TYPE_POLL ] = this_p_queues ;
2096
2090
2097
2091
/*
2098
2092
* For irq sets, we have to ask for minvec == maxvec. This passes
2099
2093
* any reduction back to us, so we can adjust our queue counts and
2100
2094
* IRQ vector needs.
2101
2095
*/
2102
2096
do {
2103
- nvme_calc_io_queues (dev , nr_io_queues );
2097
+ nvme_calc_io_queues (dev , irq_queues );
2104
2098
irq_sets [0 ] = dev -> io_queues [HCTX_TYPE_DEFAULT ];
2105
2099
irq_sets [1 ] = dev -> io_queues [HCTX_TYPE_READ ];
2106
2100
if (!irq_sets [1 ])
@@ -2111,11 +2105,11 @@ static int nvme_setup_irqs(struct nvme_dev *dev, int nr_io_queues)
2111
2105
* 1 + 1 queues, just ask for a single vector. We'll share
2112
2106
* that between the single IO queue and the admin queue.
2113
2107
*/
2114
- if (!( result < 0 && nr_io_queues == 1 ) )
2115
- nr_io_queues = irq_sets [0 ] + irq_sets [1 ] + 1 ;
2108
+ if (result >= 0 && irq_queues > 1 )
2109
+ irq_queues = irq_sets [0 ] + irq_sets [1 ] + 1 ;
2116
2110
2117
- result = pci_alloc_irq_vectors_affinity (pdev , nr_io_queues ,
2118
- nr_io_queues ,
2111
+ result = pci_alloc_irq_vectors_affinity (pdev , irq_queues ,
2112
+ irq_queues ,
2119
2113
PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY , & affd );
2120
2114
2121
2115
/*
@@ -2125,12 +2119,12 @@ static int nvme_setup_irqs(struct nvme_dev *dev, int nr_io_queues)
2125
2119
* likely does not. Back down to ask for just one vector.
2126
2120
*/
2127
2121
if (result == - ENOSPC ) {
2128
- nr_io_queues -- ;
2129
- if (!nr_io_queues )
2122
+ irq_queues -- ;
2123
+ if (!irq_queues )
2130
2124
return result ;
2131
2125
continue ;
2132
2126
} else if (result == - EINVAL ) {
2133
- nr_io_queues = 1 ;
2127
+ irq_queues = 1 ;
2134
2128
continue ;
2135
2129
} else if (result <= 0 )
2136
2130
return - EIO ;
0 commit comments