@@ -1554,6 +1554,28 @@ static void nvme_init_queue(struct nvme_queue *nvmeq, u16 qid)
1554
1554
wmb (); /* ensure the first interrupt sees the initialization */
1555
1555
}
1556
1556
1557
+ /*
1558
+ * Try getting shutdown_lock while setting up IO queues.
1559
+ */
1560
+ static int nvme_setup_io_queues_trylock (struct nvme_dev * dev )
1561
+ {
1562
+ /*
1563
+ * Give up if the lock is being held by nvme_dev_disable.
1564
+ */
1565
+ if (!mutex_trylock (& dev -> shutdown_lock ))
1566
+ return - ENODEV ;
1567
+
1568
+ /*
1569
+ * Controller is in wrong state, fail early.
1570
+ */
1571
+ if (dev -> ctrl .state != NVME_CTRL_CONNECTING ) {
1572
+ mutex_unlock (& dev -> shutdown_lock );
1573
+ return - ENODEV ;
1574
+ }
1575
+
1576
+ return 0 ;
1577
+ }
1578
+
1557
1579
static int nvme_create_queue (struct nvme_queue * nvmeq , int qid , bool polled )
1558
1580
{
1559
1581
struct nvme_dev * dev = nvmeq -> dev ;
@@ -1582,19 +1604,24 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid, bool polled)
1582
1604
goto release_cq ;
1583
1605
1584
1606
nvmeq -> cq_vector = vector ;
1585
- nvme_init_queue (nvmeq , qid );
1586
1607
1608
+ result = nvme_setup_io_queues_trylock (dev );
1609
+ if (result )
1610
+ return result ;
1611
+ nvme_init_queue (nvmeq , qid );
1587
1612
if (!polled ) {
1588
1613
result = queue_request_irq (nvmeq );
1589
1614
if (result < 0 )
1590
1615
goto release_sq ;
1591
1616
}
1592
1617
1593
1618
set_bit (NVMEQ_ENABLED , & nvmeq -> flags );
1619
+ mutex_unlock (& dev -> shutdown_lock );
1594
1620
return result ;
1595
1621
1596
1622
release_sq :
1597
1623
dev -> online_queues -- ;
1624
+ mutex_unlock (& dev -> shutdown_lock );
1598
1625
adapter_delete_sq (dev , qid );
1599
1626
release_cq :
1600
1627
adapter_delete_cq (dev , qid );
@@ -2167,7 +2194,18 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
2167
2194
if (nr_io_queues == 0 )
2168
2195
return 0 ;
2169
2196
2170
- clear_bit (NVMEQ_ENABLED , & adminq -> flags );
2197
+ /*
2198
+ * Free IRQ resources as soon as NVMEQ_ENABLED bit transitions
2199
+ * from set to unset. If there is a window to it is truely freed,
2200
+ * pci_free_irq_vectors() jumping into this window will crash.
2201
+ * And take lock to avoid racing with pci_free_irq_vectors() in
2202
+ * nvme_dev_disable() path.
2203
+ */
2204
+ result = nvme_setup_io_queues_trylock (dev );
2205
+ if (result )
2206
+ return result ;
2207
+ if (test_and_clear_bit (NVMEQ_ENABLED , & adminq -> flags ))
2208
+ pci_free_irq (pdev , 0 , adminq );
2171
2209
2172
2210
if (dev -> cmb_use_sqes ) {
2173
2211
result = nvme_cmb_qdepth (dev , nr_io_queues ,
@@ -2183,14 +2221,17 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
2183
2221
result = nvme_remap_bar (dev , size );
2184
2222
if (!result )
2185
2223
break ;
2186
- if (!-- nr_io_queues )
2187
- return - ENOMEM ;
2224
+ if (!-- nr_io_queues ) {
2225
+ result = - ENOMEM ;
2226
+ goto out_unlock ;
2227
+ }
2188
2228
} while (1 );
2189
2229
adminq -> q_db = dev -> dbs ;
2190
2230
2191
2231
retry :
2192
2232
/* Deregister the admin queue's interrupt */
2193
- pci_free_irq (pdev , 0 , adminq );
2233
+ if (test_and_clear_bit (NVMEQ_ENABLED , & adminq -> flags ))
2234
+ pci_free_irq (pdev , 0 , adminq );
2194
2235
2195
2236
/*
2196
2237
* If we enable msix early due to not intx, disable it again before
@@ -2199,8 +2240,10 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
2199
2240
pci_free_irq_vectors (pdev );
2200
2241
2201
2242
result = nvme_setup_irqs (dev , nr_io_queues );
2202
- if (result <= 0 )
2203
- return - EIO ;
2243
+ if (result <= 0 ) {
2244
+ result = - EIO ;
2245
+ goto out_unlock ;
2246
+ }
2204
2247
2205
2248
dev -> num_vecs = result ;
2206
2249
result = max (result - 1 , 1 );
@@ -2214,8 +2257,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
2214
2257
*/
2215
2258
result = queue_request_irq (adminq );
2216
2259
if (result )
2217
- return result ;
2260
+ goto out_unlock ;
2218
2261
set_bit (NVMEQ_ENABLED , & adminq -> flags );
2262
+ mutex_unlock (& dev -> shutdown_lock );
2219
2263
2220
2264
result = nvme_create_io_queues (dev );
2221
2265
if (result || dev -> online_queues < 2 )
@@ -2224,6 +2268,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
2224
2268
if (dev -> online_queues - 1 < dev -> max_qid ) {
2225
2269
nr_io_queues = dev -> online_queues - 1 ;
2226
2270
nvme_disable_io_queues (dev );
2271
+ result = nvme_setup_io_queues_trylock (dev );
2272
+ if (result )
2273
+ return result ;
2227
2274
nvme_suspend_io_queues (dev );
2228
2275
goto retry ;
2229
2276
}
@@ -2232,6 +2279,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
2232
2279
dev -> io_queues [HCTX_TYPE_READ ],
2233
2280
dev -> io_queues [HCTX_TYPE_POLL ]);
2234
2281
return 0 ;
2282
+ out_unlock :
2283
+ mutex_unlock (& dev -> shutdown_lock );
2284
+ return result ;
2235
2285
}
2236
2286
2237
2287
static void nvme_del_queue_end (struct request * req , blk_status_t error )
@@ -2962,7 +3012,6 @@ static void nvme_remove(struct pci_dev *pdev)
2962
3012
if (!pci_device_is_present (pdev )) {
2963
3013
nvme_change_ctrl_state (& dev -> ctrl , NVME_CTRL_DEAD );
2964
3014
nvme_dev_disable (dev , true);
2965
- nvme_dev_remove_admin (dev );
2966
3015
}
2967
3016
2968
3017
flush_work (& dev -> ctrl .reset_work );
0 commit comments