mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:42:44 +00:00 
			
		
		
		
	Kernel: Protect FramebufferDevice with spinlock instead of mutex
This commit is contained in:
		
							parent
							
								
									ddde9e7ee5
								
							
						
					
					
						commit
						ca42621be1
					
				
					 5 changed files with 18 additions and 19 deletions
				
			
		|  | @ -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); |     SpinlockLocker buffer_offset_locker(m_buffer_offset_lock); | ||||||
|     MutexLocker resolution_locker(m_resolution_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); | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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 Spinlock m_flushing_lock; | ||||||
|     mutable Mutex m_flushing_lock; |     mutable Spinlock m_resolution_lock; | ||||||
|     mutable Mutex m_resolution_lock; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling