Skip to content

Commit 7d0abef

Browse files
committed
Merge tag 'nvme-7.0-2026-03-12' of git://git.infradead.org/nvme into block-7.0
Pull NVMe fixes from Keith: "- Fix nvme-pci IRQ race and slab-out-of-bounds access (Sungwoo Kim) - Fix recursive workqueue locking for target async events (Chaitanya) - Various cleanups (Maurizio Lombardi, Thorsten Blum)" * tag 'nvme-7.0-2026-03-12' of git://git.infradead.org/nvme: nvme: Annotate struct nvme_dhchap_key with __counted_by nvme-core: do not pass empty queue_limits to blk_mq_alloc_queue() nvme-pci: Fix race bug in nvme_poll_irqdisable() nvmet: move async event work off nvmet-wq nvme-pci: Fix slab-out-of-bounds in nvme_dbbuf_set
2 parents 4c527c7 + fa655a9 commit 7d0abef

7 files changed

Lines changed: 22 additions & 9 deletions

File tree

drivers/nvme/host/core.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4834,7 +4834,6 @@ EXPORT_SYMBOL_GPL(nvme_complete_async_event);
48344834
int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
48354835
const struct blk_mq_ops *ops, unsigned int cmd_size)
48364836
{
4837-
struct queue_limits lim = {};
48384837
int ret;
48394838

48404839
memset(set, 0, sizeof(*set));
@@ -4861,7 +4860,7 @@ int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
48614860
if (ctrl->admin_q)
48624861
blk_put_queue(ctrl->admin_q);
48634862

4864-
ctrl->admin_q = blk_mq_alloc_queue(set, &lim, NULL);
4863+
ctrl->admin_q = blk_mq_alloc_queue(set, NULL, NULL);
48654864
if (IS_ERR(ctrl->admin_q)) {
48664865
ret = PTR_ERR(ctrl->admin_q);
48674866
goto out_free_tagset;

drivers/nvme/host/pci.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ static void nvme_dbbuf_set(struct nvme_dev *dev)
544544
/* Free memory and continue on */
545545
nvme_dbbuf_dma_free(dev);
546546

547-
for (i = 1; i <= dev->online_queues; i++)
547+
for (i = 1; i < dev->online_queues; i++)
548548
nvme_dbbuf_free(&dev->queues[i]);
549549
}
550550
}
@@ -1625,14 +1625,16 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
16251625
static void nvme_poll_irqdisable(struct nvme_queue *nvmeq)
16261626
{
16271627
struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
1628+
int irq;
16281629

16291630
WARN_ON_ONCE(test_bit(NVMEQ_POLLED, &nvmeq->flags));
16301631

1631-
disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
1632+
irq = pci_irq_vector(pdev, nvmeq->cq_vector);
1633+
disable_irq(irq);
16321634
spin_lock(&nvmeq->cq_poll_lock);
16331635
nvme_poll_cq(nvmeq, NULL);
16341636
spin_unlock(&nvmeq->cq_poll_lock);
1635-
enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
1637+
enable_irq(irq);
16361638
}
16371639

16381640
static int nvme_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)

drivers/nvme/target/admin-cmd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1586,7 +1586,7 @@ void nvmet_execute_async_event(struct nvmet_req *req)
15861586
ctrl->async_event_cmds[ctrl->nr_async_event_cmds++] = req;
15871587
mutex_unlock(&ctrl->lock);
15881588

1589-
queue_work(nvmet_wq, &ctrl->async_event_work);
1589+
queue_work(nvmet_aen_wq, &ctrl->async_event_work);
15901590
}
15911591

15921592
void nvmet_execute_keep_alive(struct nvmet_req *req)

drivers/nvme/target/core.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ static DEFINE_IDA(cntlid_ida);
2727

2828
struct workqueue_struct *nvmet_wq;
2929
EXPORT_SYMBOL_GPL(nvmet_wq);
30+
struct workqueue_struct *nvmet_aen_wq;
31+
EXPORT_SYMBOL_GPL(nvmet_aen_wq);
3032

3133
/*
3234
* This read/write semaphore is used to synchronize access to configuration
@@ -206,7 +208,7 @@ void nvmet_add_async_event(struct nvmet_ctrl *ctrl, u8 event_type,
206208
list_add_tail(&aen->entry, &ctrl->async_events);
207209
mutex_unlock(&ctrl->lock);
208210

209-
queue_work(nvmet_wq, &ctrl->async_event_work);
211+
queue_work(nvmet_aen_wq, &ctrl->async_event_work);
210212
}
211213

212214
static void nvmet_add_to_changed_ns_log(struct nvmet_ctrl *ctrl, __le32 nsid)
@@ -1959,9 +1961,14 @@ static int __init nvmet_init(void)
19591961
if (!nvmet_wq)
19601962
goto out_free_buffered_work_queue;
19611963

1964+
nvmet_aen_wq = alloc_workqueue("nvmet-aen-wq",
1965+
WQ_MEM_RECLAIM | WQ_UNBOUND, 0);
1966+
if (!nvmet_aen_wq)
1967+
goto out_free_nvmet_work_queue;
1968+
19621969
error = nvmet_init_debugfs();
19631970
if (error)
1964-
goto out_free_nvmet_work_queue;
1971+
goto out_free_nvmet_aen_work_queue;
19651972

19661973
error = nvmet_init_discovery();
19671974
if (error)
@@ -1977,6 +1984,8 @@ static int __init nvmet_init(void)
19771984
nvmet_exit_discovery();
19781985
out_exit_debugfs:
19791986
nvmet_exit_debugfs();
1987+
out_free_nvmet_aen_work_queue:
1988+
destroy_workqueue(nvmet_aen_wq);
19801989
out_free_nvmet_work_queue:
19811990
destroy_workqueue(nvmet_wq);
19821991
out_free_buffered_work_queue:
@@ -1994,6 +2003,7 @@ static void __exit nvmet_exit(void)
19942003
nvmet_exit_discovery();
19952004
nvmet_exit_debugfs();
19962005
ida_destroy(&cntlid_ida);
2006+
destroy_workqueue(nvmet_aen_wq);
19972007
destroy_workqueue(nvmet_wq);
19982008
destroy_workqueue(buffered_io_wq);
19992009
destroy_workqueue(zbd_wq);

drivers/nvme/target/nvmet.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ extern struct kmem_cache *nvmet_bvec_cache;
501501
extern struct workqueue_struct *buffered_io_wq;
502502
extern struct workqueue_struct *zbd_wq;
503503
extern struct workqueue_struct *nvmet_wq;
504+
extern struct workqueue_struct *nvmet_aen_wq;
504505

505506
static inline void nvmet_set_result(struct nvmet_req *req, u32 result)
506507
{

drivers/nvme/target/rdma.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,6 +2088,7 @@ static void nvmet_rdma_remove_one(struct ib_device *ib_device, void *client_data
20882088
mutex_unlock(&nvmet_rdma_queue_mutex);
20892089

20902090
flush_workqueue(nvmet_wq);
2091+
flush_workqueue(nvmet_aen_wq);
20912092
}
20922093

20932094
static struct ib_client nvmet_rdma_ib_client = {

include/linux/nvme-auth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
struct nvme_dhchap_key {
1212
size_t len;
1313
u8 hash;
14-
u8 key[];
14+
u8 key[] __counted_by(len);
1515
};
1616

1717
u32 nvme_auth_get_seqnum(void);

0 commit comments

Comments
 (0)