Преглед на файлове

Kernel/ProcFS: Lazily allocate all sub components of a PID folder

Liav A преди 4 години
родител
ревизия
32a4a4ac19
променени са 2 файла, в които са добавени 35 реда и са изтрити 11 реда
  1. 3 0
      Kernel/ProcessExposed.h
  2. 32 11
      Kernel/ProcessSpecificExposed.cpp

+ 3 - 0
Kernel/ProcessExposed.h

@@ -159,8 +159,11 @@ public:
 
     virtual uid_t owner_user() const override { return m_associated_process->uid(); }
     virtual gid_t owner_group() const override { return m_associated_process->gid(); }
+    virtual KResult refresh_data(FileDescription&) const override;
+    virtual RefPtr<ProcFSExposedComponent> lookup(StringView name) override;
 
 private:
+    void on_attach();
     IntrusiveListNode<ProcFSProcessFolder, RefPtr<ProcFSProcessFolder>> m_list_node;
 
     explicit ProcFSProcessFolder(const Process&);

+ 32 - 11
Kernel/ProcessSpecificExposed.cpp

@@ -509,19 +509,40 @@ private:
     WeakPtr<ProcFSProcessFolder> m_parent_process_directory;
 };
 
+void ProcFSProcessFolder::on_attach()
+{
+    VERIFY(m_components.size() == 0);
+    m_components.append(ProcFSProcessUnveil::create(*this));
+    m_components.append(ProcFSProcessPerformanceEvents::create(*this));
+    m_components.append(ProcFSProcessFileDescriptions::create(*this));
+    m_components.append(ProcFSProcessOverallFileDescriptions::create(*this));
+    m_components.append(ProcFSProcessRoot::create(*this));
+    m_components.append(ProcFSProcessVirtualMemory::create(*this));
+    m_components.append(ProcFSProcessCurrentWorkDirectory::create(*this));
+    m_components.append(ProcFSProcessBinary::create(*this));
+    m_components.append(ProcFSProcessStacks::create(*this));
+}
+
+RefPtr<ProcFSExposedComponent> ProcFSProcessFolder::lookup(StringView name)
+{
+    // Note: we need to allocate all sub components when doing a lookup, because
+    // for some reason, the caller may not call ProcFSInode::attach method before calling this.
+    if (m_components.size() == 0)
+        on_attach();
+    return ProcFSExposedFolder::lookup(name);
+}
+
+KResult ProcFSProcessFolder::refresh_data(FileDescription&) const
+{
+    if (m_components.size() != 0)
+        return KSuccess;
+    const_cast<ProcFSProcessFolder&>(*this).on_attach();
+    return KSuccess;
+}
+
 NonnullRefPtr<ProcFSProcessFolder> ProcFSProcessFolder::create(const Process& process)
 {
-    auto folder = adopt_ref_if_nonnull(new (nothrow) ProcFSProcessFolder(process)).release_nonnull();
-    folder->m_components.append(ProcFSProcessUnveil::create(folder));
-    folder->m_components.append(ProcFSProcessPerformanceEvents::create(folder));
-    folder->m_components.append(ProcFSProcessFileDescriptions::create(folder));
-    folder->m_components.append(ProcFSProcessOverallFileDescriptions::create(folder));
-    folder->m_components.append(ProcFSProcessRoot::create(folder));
-    folder->m_components.append(ProcFSProcessVirtualMemory::create(folder));
-    folder->m_components.append(ProcFSProcessCurrentWorkDirectory::create(folder));
-    folder->m_components.append(ProcFSProcessBinary::create(folder));
-    folder->m_components.append(ProcFSProcessStacks::create(folder));
-    return folder;
+    return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessFolder(process)).release_nonnull();
 }
 
 ProcFSProcessFolder::ProcFSProcessFolder(const Process& process)