Quellcode durchsuchen

Kernel: Protect InodeWatcher internals with spinlock instead of mutex

Andreas Kling vor 3 Jahren
Ursprung
Commit
0bebf013e3
2 geänderte Dateien mit 8 neuen und 8 gelöschten Zeilen
  1. 7 7
      Kernel/FileSystem/InodeWatcher.cpp
  2. 1 1
      Kernel/FileSystem/InodeWatcher.h

+ 7 - 7
Kernel/FileSystem/InodeWatcher.cpp

@@ -24,13 +24,13 @@ InodeWatcher::~InodeWatcher()
 
 bool InodeWatcher::can_read(const OpenFileDescription&, u64) const
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
     return !m_queue.is_empty();
 }
 
 ErrorOr<size_t> InodeWatcher::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t buffer_size)
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
     if (m_queue.is_empty())
         // can_read will catch the blocking case.
         return EAGAIN;
@@ -69,7 +69,7 @@ ErrorOr<size_t> InodeWatcher::read(OpenFileDescription&, u64, UserOrKernelBuffer
 
 ErrorOr<void> InodeWatcher::close()
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
 
     for (auto& entry : m_wd_to_watches) {
         auto& inode = const_cast<Inode&>(entry.value->inode);
@@ -88,7 +88,7 @@ ErrorOr<NonnullOwnPtr<KString>> InodeWatcher::pseudo_path(const OpenFileDescript
 
 void InodeWatcher::notify_inode_event(Badge<Inode>, InodeIdentifier inode_id, InodeWatcherEvent::Type event_type, StringView name)
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
 
     auto it = m_inode_to_watches.find(inode_id);
     if (it == m_inode_to_watches.end())
@@ -107,7 +107,7 @@ void InodeWatcher::notify_inode_event(Badge<Inode>, InodeIdentifier inode_id, In
 
 ErrorOr<int> InodeWatcher::register_inode(Inode& inode, unsigned event_mask)
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
 
     if (m_inode_to_watches.find(inode.identifier()) != m_inode_to_watches.end())
         return EEXIST;
@@ -142,7 +142,7 @@ ErrorOr<int> InodeWatcher::register_inode(Inode& inode, unsigned event_mask)
 
 ErrorOr<void> InodeWatcher::unregister_by_wd(int wd)
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
 
     auto it = m_wd_to_watches.find(wd);
     if (it == m_wd_to_watches.end())
@@ -159,7 +159,7 @@ ErrorOr<void> InodeWatcher::unregister_by_wd(int wd)
 
 void InodeWatcher::unregister_by_inode(Badge<Inode>, InodeIdentifier identifier)
 {
-    MutexLocker locker(m_lock);
+    SpinlockLocker locker(m_lock);
 
     auto it = m_inode_to_watches.find(identifier);
     if (it == m_inode_to_watches.end())

+ 1 - 1
Kernel/FileSystem/InodeWatcher.h

@@ -64,7 +64,7 @@ public:
 private:
     explicit InodeWatcher() { }
 
-    mutable Mutex m_lock;
+    mutable Spinlock m_lock;
 
     struct Event {
         int wd { 0 };