1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 12:57:35 +00:00

Kernel: Protect PCI access with spinlock instead of mutex

This commit is contained in:
Andreas Kling 2022-02-03 15:46:59 +01:00
parent 200589ba27
commit 64254b5df8
2 changed files with 11 additions and 12 deletions

View file

@ -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);