From ddde9e7ee52b6d5c955ce3bbd4bc46eff5e0ed94 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 3 Feb 2022 01:41:01 +0100 Subject: [PATCH] Kernel: Protect global device map with spinlock instead of mutx --- Kernel/Devices/Device.h | 1 - Kernel/Devices/DeviceManagement.cpp | 8 ++++---- Kernel/Devices/DeviceManagement.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h index 383584885c..7e9df0186d 100644 --- a/Kernel/Devices/Device.h +++ b/Kernel/Devices/Device.h @@ -23,7 +23,6 @@ #include #include #include -#include #include namespace Kernel { diff --git a/Kernel/Devices/DeviceManagement.cpp b/Kernel/Devices/DeviceManagement.cpp index 3315c80e21..cf107a0f68 100644 --- a/Kernel/Devices/DeviceManagement.cpp +++ b/Kernel/Devices/DeviceManagement.cpp @@ -49,7 +49,7 @@ DeviceManagement& DeviceManagement::the() Device* DeviceManagement::get_device(MajorNumber major, MinorNumber minor) { - return m_devices.with_exclusive([&](auto& map) -> Device* { + return m_devices.with([&](auto& map) -> Device* { auto it = map.find(encoded_device(major.value(), minor.value())); if (it == map.end()) return nullptr; @@ -68,7 +68,7 @@ Optional DeviceManagement::dequeue_top_device_event(Badge, Device& device) { u64 device_id = encoded_device(device.major(), device.minor()); - m_devices.with_exclusive([&](auto& map) -> void { + m_devices.with([&](auto& map) -> void { VERIFY(map.contains(device_id)); map.remove(encoded_device(device.major(), device.minor())); }); @@ -85,7 +85,7 @@ void DeviceManagement::before_device_removal(Badge, Device& device) void DeviceManagement::after_inserting_device(Badge, Device& device) { u64 device_id = encoded_device(device.major(), device.minor()); - m_devices.with_exclusive([&](auto& map) -> void { + m_devices.with([&](auto& map) -> void { if (map.contains(device_id)) { dbgln("Already registered {},{}: {}", device.major(), device.minor(), device.class_name()); VERIFY_NOT_REACHED(); @@ -108,7 +108,7 @@ void DeviceManagement::after_inserting_device(Badge, Device& device) void DeviceManagement::for_each(Function callback) { - m_devices.with_exclusive([&](auto& map) -> void { + m_devices.with([&](auto& map) -> void { for (auto& entry : map) callback(*entry.value); }); diff --git a/Kernel/Devices/DeviceManagement.h b/Kernel/Devices/DeviceManagement.h index cd9746e6e8..0e849d72bd 100644 --- a/Kernel/Devices/DeviceManagement.h +++ b/Kernel/Devices/DeviceManagement.h @@ -77,7 +77,7 @@ private: RefPtr m_device_control_device; // FIXME: Once we have a singleton for managing many sound cards, remove this from here NonnullRefPtrVector m_audio_devices; - MutexProtected> m_devices; + SpinlockProtected> m_devices; mutable Spinlock m_event_queue_lock; CircularQueue m_event_queue;