From b8493bf70f96b5ca1f6a473f9f39d2c35940ba28 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 6 May 2022 14:46:58 +0300 Subject: [PATCH] Kernel/Graphics: Protect the list of display connectors with a Spinlock This list could be updated in runtime if an hotplug event occurs, so we must protect it with a spin lock to avoid corruption of the list. --- Kernel/Graphics/GraphicsManagement.cpp | 22 ++++++++++++++-------- Kernel/Graphics/GraphicsManagement.h | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Kernel/Graphics/GraphicsManagement.cpp b/Kernel/Graphics/GraphicsManagement.cpp index 50ff928cdba..e212382ca1b 100644 --- a/Kernel/Graphics/GraphicsManagement.cpp +++ b/Kernel/Graphics/GraphicsManagement.cpp @@ -86,24 +86,30 @@ void GraphicsManagement::set_vga_text_mode_cursor(size_t console_width, size_t x void GraphicsManagement::deactivate_graphical_mode() { - for (auto& connector : m_display_connector_nodes) { - connector.set_display_mode({}, DisplayConnector::DisplayMode::Console); - } + return m_display_connector_nodes.with([&](auto& display_connectors) { + for (auto& connector : display_connectors) + connector.set_display_mode({}, DisplayConnector::DisplayMode::Console); + }); } void GraphicsManagement::activate_graphical_mode() { - for (auto& connector : m_display_connector_nodes) { - connector.set_display_mode({}, DisplayConnector::DisplayMode::Graphical); - } + return m_display_connector_nodes.with([&](auto& display_connectors) { + for (auto& connector : display_connectors) + connector.set_display_mode({}, DisplayConnector::DisplayMode::Graphical); + }); } void GraphicsManagement::attach_new_display_connector(Badge, DisplayConnector& connector) { - m_display_connector_nodes.append(connector); + return m_display_connector_nodes.with([&](auto& display_connectors) { + display_connectors.append(connector); + }); } void GraphicsManagement::detach_display_connector(Badge, DisplayConnector& connector) { - m_display_connector_nodes.remove(connector); + return m_display_connector_nodes.with([&](auto& display_connectors) { + display_connectors.remove(connector); + }); } static inline bool is_vga_compatible_pci_device(PCI::DeviceIdentifier const& device_identifier) diff --git a/Kernel/Graphics/GraphicsManagement.h b/Kernel/Graphics/GraphicsManagement.h index 6d05e36ef31..70937bbc99a 100644 --- a/Kernel/Graphics/GraphicsManagement.h +++ b/Kernel/Graphics/GraphicsManagement.h @@ -58,7 +58,7 @@ private: RefPtr m_vga_adapter; unsigned m_current_minor_number { 0 }; - IntrusiveList<&DisplayConnector::m_list_node> m_display_connector_nodes; + SpinlockProtected> m_display_connector_nodes; RecursiveSpinlock m_main_vga_lock; bool m_vga_access_is_disabled { false };