From 0c5d6c6c474a1a33faa3f1a72beda5a904e7a07f Mon Sep 17 00:00:00 2001 From: Pankaj Raghav Date: Thu, 18 May 2023 13:19:14 +0200 Subject: [PATCH] Kernel: Move NVMeInterruptQueue initialization out of its constructor Add a helper initialize_interrupt_queue() helper to enable_irq instead of doing it as part of its object construction as it can fail. This is similar to how AHCI initializes its interrupt as well. --- Kernel/Storage/NVMe/NVMeInterruptQueue.cpp | 8 +++++++- Kernel/Storage/NVMe/NVMeInterruptQueue.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp b/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp index cdb803d4b9..d962a2686c 100644 --- a/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp +++ b/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp @@ -13,12 +13,18 @@ namespace Kernel { ErrorOr> NVMeInterruptQueue::try_create(PCI::Device& device, NonnullOwnPtr rw_dma_region, NonnullRefPtr rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, OwnPtr sq_dma_region, Memory::TypedMapping db_regs) { - return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) NVMeInterruptQueue(device, move(rw_dma_region), rw_dma_page, qid, irq, q_depth, move(cq_dma_region), move(sq_dma_region), move(db_regs)))); + auto queue = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) NVMeInterruptQueue(device, move(rw_dma_region), rw_dma_page, qid, irq, q_depth, move(cq_dma_region), move(sq_dma_region), move(db_regs)))); + queue->initialize_interrupt_queue(); + return queue; } UNMAP_AFTER_INIT NVMeInterruptQueue::NVMeInterruptQueue(PCI::Device& device, NonnullOwnPtr rw_dma_region, NonnullRefPtr rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, OwnPtr sq_dma_region, Memory::TypedMapping db_regs) : NVMeQueue(move(rw_dma_region), rw_dma_page, qid, q_depth, move(cq_dma_region), move(sq_dma_region), move(db_regs)) , PCIIRQHandler(device, irq) +{ +} + +void NVMeInterruptQueue::initialize_interrupt_queue() { enable_irq(); } diff --git a/Kernel/Storage/NVMe/NVMeInterruptQueue.h b/Kernel/Storage/NVMe/NVMeInterruptQueue.h index e442e6e6cf..4ca53913c8 100644 --- a/Kernel/Storage/NVMe/NVMeInterruptQueue.h +++ b/Kernel/Storage/NVMe/NVMeInterruptQueue.h @@ -18,6 +18,7 @@ public: void submit_sqe(NVMeSubmission& submission) override; virtual ~NVMeInterruptQueue() override {}; virtual StringView purpose() const override { return "NVMe"sv; }; + void initialize_interrupt_queue(); protected: NVMeInterruptQueue(PCI::Device& device, NonnullOwnPtr rw_dma_region, NonnullRefPtr rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, OwnPtr sq_dma_region, Memory::TypedMapping db_regs);