diff options
author | Andreas Kling <kling@serenityos.org> | 2022-02-03 15:46:59 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-02-03 16:11:26 +0100 |
commit | 64254b5df8c24141fa75038078b3bcdab49b1751 (patch) | |
tree | 5459ca48877b4c8fb281b6bb9ccf3331fd8b8fe8 /Kernel/Bus | |
parent | 200589ba279d20db81a8de5f2ed0f8587e42c2d6 (diff) | |
download | serenity-64254b5df8c24141fa75038078b3bcdab49b1751.zip |
Kernel: Protect PCI access with spinlock instead of mutex
Diffstat (limited to 'Kernel/Bus')
-rw-r--r-- | Kernel/Bus/PCI/Access.cpp | 18 | ||||
-rw-r--r-- | Kernel/Bus/PCI/Access.h | 5 |
2 files changed, 11 insertions, 12 deletions
diff --git a/Kernel/Bus/PCI/Access.cpp b/Kernel/Bus/PCI/Access.cpp index 01f60168a0..bd4ee02a18 100644 --- a/Kernel/Bus/PCI/Access.cpp +++ b/Kernel/Bus/PCI/Access.cpp @@ -110,7 +110,7 @@ UNMAP_AFTER_INIT bool Access::initialize_for_one_pci_domain() void Access::add_host_controller_and_enumerate_attached_devices(NonnullOwnPtr<HostController> controller, Function<void(DeviceIdentifier const&)> callback) { - MutexLocker locker(m_access_lock); + SpinlockLocker locker(m_access_lock); SpinlockLocker scan_locker(m_scan_lock); auto domain_number = controller->domain_number(); @@ -137,7 +137,7 @@ UNMAP_AFTER_INIT Access::Access() UNMAP_AFTER_INIT void Access::rescan_hardware() { - MutexLocker locker(m_access_lock); + SpinlockLocker locker(m_access_lock); SpinlockLocker scan_locker(m_scan_lock); VERIFY(m_device_identifiers.is_empty()); for (auto it = m_host_controllers.begin(); it != m_host_controllers.end(); ++it) { @@ -149,7 +149,7 @@ UNMAP_AFTER_INIT void Access::rescan_hardware() void Access::fast_enumerate(Function<void(DeviceIdentifier const&)>& callback) const { - MutexLocker locker(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(!m_device_identifiers.is_empty()); for (auto const& device_identifier : m_device_identifiers) { callback(device_identifier); @@ -171,21 +171,21 @@ DeviceIdentifier Access::get_device_identifier(Address address) const void Access::write8_field(Address address, u32 field, u8 value) { - MutexLocker lock(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(m_host_controllers.contains(address.domain())); auto& controller = *m_host_controllers.get(address.domain()).value(); controller.write8_field(address.bus(), address.device(), address.function(), field, value); } void Access::write16_field(Address address, u32 field, u16 value) { - MutexLocker lock(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(m_host_controllers.contains(address.domain())); auto& controller = *m_host_controllers.get(address.domain()).value(); controller.write16_field(address.bus(), address.device(), address.function(), field, value); } void Access::write32_field(Address address, u32 field, u32 value) { - MutexLocker lock(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(m_host_controllers.contains(address.domain())); auto& controller = *m_host_controllers.get(address.domain()).value(); controller.write32_field(address.bus(), address.device(), address.function(), field, value); @@ -202,21 +202,21 @@ u16 Access::read16_field(Address address, RegisterOffset field) u8 Access::read8_field(Address address, u32 field) { - MutexLocker lock(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(m_host_controllers.contains(address.domain())); auto& controller = *m_host_controllers.get(address.domain()).value(); return controller.read8_field(address.bus(), address.device(), address.function(), field); } u16 Access::read16_field(Address address, u32 field) { - MutexLocker lock(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(m_host_controllers.contains(address.domain())); auto& controller = *m_host_controllers.get(address.domain()).value(); return controller.read16_field(address.bus(), address.device(), address.function(), field); } u32 Access::read32_field(Address address, u32 field) { - MutexLocker lock(m_access_lock); + SpinlockLocker locker(m_access_lock); VERIFY(m_host_controllers.contains(address.domain())); auto& controller = *m_host_controllers.get(address.domain()).value(); return controller.read32_field(address.bus(), address.device(), address.function(), field); diff --git a/Kernel/Bus/PCI/Access.h b/Kernel/Bus/PCI/Access.h index 0c9be8c064..f5c42c625c 100644 --- a/Kernel/Bus/PCI/Access.h +++ b/Kernel/Bus/PCI/Access.h @@ -36,7 +36,7 @@ public: DeviceIdentifier get_device_identifier(Address address) const; Spinlock const& scan_lock() const { return m_scan_lock; } - Mutex const& access_lock() const { return m_access_lock; } + RecursiveSpinlock const& access_lock() const { return m_access_lock; } void add_host_controller_and_enumerate_attached_devices(NonnullOwnPtr<HostController>, Function<void(DeviceIdentifier const&)> callback); @@ -51,8 +51,7 @@ private: Vector<Capability> get_capabilities(Address); Optional<u8> get_capabilities_pointer(Address address); - // General Data-members - mutable Mutex m_access_lock; + mutable RecursiveSpinlock m_access_lock; mutable Spinlock m_scan_lock; HashMap<u32, NonnullOwnPtr<HostController>> m_host_controllers; |