Sfoglia il codice sorgente

Kernel: Protect FramebufferDevice with spinlock instead of mutex

Andreas Kling 3 anni fa
parent
commit
ca42621be1

+ 9 - 9
Kernel/Graphics/FramebufferDevice.cpp

@@ -130,7 +130,7 @@ ErrorOr<size_t> FramebufferDevice::buffer_length(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     auto adapter = m_graphics_adapter.strong_ref();
     auto adapter = m_graphics_adapter.strong_ref();
     if (!adapter)
     if (!adapter)
         return Error::from_errno(EIO);
         return Error::from_errno(EIO);
@@ -145,7 +145,7 @@ ErrorOr<size_t> FramebufferDevice::pitch(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return m_framebuffer_pitch;
     return m_framebuffer_pitch;
 }
 }
 ErrorOr<size_t> FramebufferDevice::height(size_t head) const
 ErrorOr<size_t> FramebufferDevice::height(size_t head) const
@@ -154,7 +154,7 @@ ErrorOr<size_t> FramebufferDevice::height(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return m_framebuffer_height;
     return m_framebuffer_height;
 }
 }
 ErrorOr<size_t> FramebufferDevice::width(size_t head) const
 ErrorOr<size_t> FramebufferDevice::width(size_t head) const
@@ -163,7 +163,7 @@ ErrorOr<size_t> FramebufferDevice::width(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return m_framebuffer_width;
     return m_framebuffer_width;
 }
 }
 ErrorOr<size_t> FramebufferDevice::vertical_offset(size_t head) const
 ErrorOr<size_t> FramebufferDevice::vertical_offset(size_t head) const
@@ -172,7 +172,7 @@ ErrorOr<size_t> FramebufferDevice::vertical_offset(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_buffer_offset_lock);
+    SpinlockLocker locker(m_buffer_offset_lock);
     return m_y_offset;
     return m_y_offset;
 }
 }
 ErrorOr<bool> FramebufferDevice::vertical_offsetted(size_t head) const
 ErrorOr<bool> FramebufferDevice::vertical_offsetted(size_t head) const
@@ -181,7 +181,7 @@ ErrorOr<bool> FramebufferDevice::vertical_offsetted(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_buffer_offset_lock);
+    SpinlockLocker locker(m_buffer_offset_lock);
     return m_y_offset == 0 ? 0 : 1;
     return m_y_offset == 0 ? 0 : 1;
 }
 }
 
 
@@ -191,8 +191,8 @@ ErrorOr<void> FramebufferDevice::set_head_resolution(size_t head, size_t width,
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker buffer_offset_locker(m_buffer_offset_lock);
-    MutexLocker resolution_locker(m_resolution_lock);
+    SpinlockLocker buffer_offset_locker(m_buffer_offset_lock);
+    SpinlockLocker resolution_locker(m_resolution_lock);
     auto adapter = m_graphics_adapter.strong_ref();
     auto adapter = m_graphics_adapter.strong_ref();
     if (!adapter)
     if (!adapter)
         return Error::from_errno(EIO);
         return Error::from_errno(EIO);
@@ -211,7 +211,7 @@ ErrorOr<void> FramebufferDevice::set_head_buffer(size_t head, bool second_buffer
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_buffer_offset_lock);
+    SpinlockLocker locker(m_buffer_offset_lock);
     auto adapter = m_graphics_adapter.strong_ref();
     auto adapter = m_graphics_adapter.strong_ref();
     if (!adapter)
     if (!adapter)
         return Error::from_errno(EIO);
         return Error::from_errno(EIO);

+ 1 - 1
Kernel/Graphics/FramebufferDevice.h

@@ -56,7 +56,7 @@ private:
     size_t m_framebuffer_height { 0 };
     size_t m_framebuffer_height { 0 };
 
 
     Spinlock m_activation_lock;
     Spinlock m_activation_lock;
-    mutable Mutex m_buffer_offset_lock;
+    mutable Spinlock m_buffer_offset_lock;
 
 
     RefPtr<Memory::AnonymousVMObject> m_real_framebuffer_vmobject;
     RefPtr<Memory::AnonymousVMObject> m_real_framebuffer_vmobject;
     RefPtr<Memory::AnonymousVMObject> m_swapped_framebuffer_vmobject;
     RefPtr<Memory::AnonymousVMObject> m_swapped_framebuffer_vmobject;

+ 1 - 1
Kernel/Graphics/GenericFramebufferDevice.cpp

@@ -124,7 +124,7 @@ ErrorOr<void> GenericFramebufferDevice::ioctl(OpenFileDescription&, unsigned req
         auto flush_rects = TRY(copy_typed_from_user(user_flush_rects));
         auto flush_rects = TRY(copy_typed_from_user(user_flush_rects));
         if (Checked<unsigned>::multiplication_would_overflow(flush_rects.count, sizeof(FBRect)))
         if (Checked<unsigned>::multiplication_would_overflow(flush_rects.count, sizeof(FBRect)))
             return Error::from_errno(EFAULT);
             return Error::from_errno(EFAULT);
-        MutexLocker locker(m_flushing_lock);
+        SpinlockLocker locker(m_flushing_lock);
         if (flush_rects.count > 0) {
         if (flush_rects.count > 0) {
             for (unsigned i = 0; i < flush_rects.count; i++) {
             for (unsigned i = 0; i < flush_rects.count; i++) {
                 FBRect user_dirty_rect;
                 FBRect user_dirty_rect;

+ 3 - 4
Kernel/Graphics/GenericFramebufferDevice.h

@@ -10,7 +10,7 @@
 #include <AK/Types.h>
 #include <AK/Types.h>
 #include <Kernel/Devices/BlockDevice.h>
 #include <Kernel/Devices/BlockDevice.h>
 #include <Kernel/Graphics/GenericGraphicsAdapter.h>
 #include <Kernel/Graphics/GenericGraphicsAdapter.h>
-#include <Kernel/Locking/Mutex.h>
+#include <Kernel/Locking/Spinlock.h>
 #include <LibC/sys/ioctl_numbers.h>
 #include <LibC/sys/ioctl_numbers.h>
 
 
 namespace Kernel {
 namespace Kernel {
@@ -63,9 +63,8 @@ protected:
 
 
     GenericFramebufferDevice(const GenericGraphicsAdapter&);
     GenericFramebufferDevice(const GenericGraphicsAdapter&);
     mutable WeakPtr<GenericGraphicsAdapter> m_graphics_adapter;
     mutable WeakPtr<GenericGraphicsAdapter> m_graphics_adapter;
-    mutable Mutex m_heads_lock;
-    mutable Mutex m_flushing_lock;
-    mutable Mutex m_resolution_lock;
+    mutable Spinlock m_flushing_lock;
+    mutable Spinlock m_resolution_lock;
 };
 };
 
 
 }
 }

+ 4 - 4
Kernel/Graphics/VirtIOGPU/FramebufferDevice.cpp

@@ -25,7 +25,7 @@ ErrorOr<size_t> FramebufferDevice::buffer_length(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return display_info().rect.width * display_info().rect.height * 4;
     return display_info().rect.width * display_info().rect.height * 4;
 }
 }
 ErrorOr<size_t> FramebufferDevice::pitch(size_t head) const
 ErrorOr<size_t> FramebufferDevice::pitch(size_t head) const
@@ -34,7 +34,7 @@ ErrorOr<size_t> FramebufferDevice::pitch(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return display_info().rect.width * 4;
     return display_info().rect.width * 4;
 }
 }
 ErrorOr<size_t> FramebufferDevice::height(size_t head) const
 ErrorOr<size_t> FramebufferDevice::height(size_t head) const
@@ -43,7 +43,7 @@ ErrorOr<size_t> FramebufferDevice::height(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return display_info().rect.height;
     return display_info().rect.height;
 }
 }
 ErrorOr<size_t> FramebufferDevice::width(size_t head) const
 ErrorOr<size_t> FramebufferDevice::width(size_t head) const
@@ -52,7 +52,7 @@ ErrorOr<size_t> FramebufferDevice::width(size_t head) const
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // We take care to verify this at the GenericFramebufferDevice::ioctl method
     // so if we happen to accidentally have a value different than 0, assert.
     // so if we happen to accidentally have a value different than 0, assert.
     VERIFY(head == 0);
     VERIFY(head == 0);
-    MutexLocker locker(m_resolution_lock);
+    SpinlockLocker locker(m_resolution_lock);
     return display_info().rect.width;
     return display_info().rect.width;
 }
 }
 ErrorOr<size_t> FramebufferDevice::vertical_offset(size_t head) const
 ErrorOr<size_t> FramebufferDevice::vertical_offset(size_t head) const