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

This commit is contained in:
Liav A 2021-07-02 11:03:40 +03:00 committed by Andreas Kling
parent 6282df3066
commit 32a4a4ac19
Notes: sideshowbarker 2024-07-18 11:08:01 +09:00
2 changed files with 35 additions and 11 deletions

View File

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

View File

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