From 0b6424d883c56aac63c6675a4766e6296259c0e1 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 18 Aug 2023 13:18:21 +0300 Subject: [PATCH] Kernel/Storage: Properly free unused NVMeIO AsyncBlockDeviceRequest This was the root cause of zombie processes showing up randomly and disappearing after some disk activity, such as running shell commands - The NVMeIO AsyncBlockDeviceRequest member simply held a pointer to a Process object, therefore it could keep it alive a for a long time after it ceased to actually function at all. --- Kernel/Devices/Storage/NVMe/NVMeInterruptQueue.cpp | 4 ++-- Kernel/Devices/Storage/NVMe/NVMePollQueue.cpp | 2 +- Kernel/Devices/Storage/NVMe/NVMeQueue.h | 6 ++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Kernel/Devices/Storage/NVMe/NVMeInterruptQueue.cpp b/Kernel/Devices/Storage/NVMe/NVMeInterruptQueue.cpp index 43780166a6..7d9924185f 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeInterruptQueue.cpp +++ b/Kernel/Devices/Storage/NVMe/NVMeInterruptQueue.cpp @@ -57,7 +57,7 @@ void NVMeInterruptQueue::complete_current_request(u16 cmdid, u16 status) request_pdu.request->complete(req_result); if (request_pdu.end_io_handler) request_pdu.end_io_handler(status); - request_pdu.used = false; + request_pdu.clear(); }; // There can be submission without any request associated with it such as with @@ -87,7 +87,7 @@ void NVMeInterruptQueue::complete_current_request(u16 cmdid, u16 status) current_request->complete(AsyncDeviceRequest::OutOfMemory); if (request_pdu.end_io_handler) request_pdu.end_io_handler(status); - request_pdu.used = false; + request_pdu.clear(); } } } diff --git a/Kernel/Devices/Storage/NVMe/NVMePollQueue.cpp b/Kernel/Devices/Storage/NVMe/NVMePollQueue.cpp index 677996a492..60cb17d843 100644 --- a/Kernel/Devices/Storage/NVMe/NVMePollQueue.cpp +++ b/Kernel/Devices/Storage/NVMe/NVMePollQueue.cpp @@ -42,7 +42,7 @@ void NVMePollQueue::complete_current_request(u16 cmdid, u16 status) request_pdu.request->complete(req_result); if (request_pdu.end_io_handler) request_pdu.end_io_handler(status); - request_pdu.used = false; + request_pdu.clear(); }; // There can be submission without any request associated with it such as with diff --git a/Kernel/Devices/Storage/NVMe/NVMeQueue.h b/Kernel/Devices/Storage/NVMe/NVMeQueue.h index 0afc18518d..73eb1d621f 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeQueue.h +++ b/Kernel/Devices/Storage/NVMe/NVMeQueue.h @@ -34,6 +34,12 @@ enum class QueueType { class AsyncBlockDeviceRequest; struct NVMeIO { + void clear() + { + used = false; + request = nullptr; + end_io_handler = nullptr; + } RefPtr request; bool used = false; Function end_io_handler;