mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-22 17:31:58 -05:00
3e9b269bcd
InodeVMObjects now track dirty and clean pages. This tracking of dirty and clean pages is used by the msync and purge syscalls. dirty page tracking works using the following rules: * when a new InodeVMObject is made, all pages are marked clean. * writes to clean InodeVMObject pages will cause a page fault, the fault handler will mark the page as dirty. * writes to dirty InodeVMObject pages do not cause page faults. * if msync is called, only dirty pages are flushed to storage (and marked clean). * if purge syscall is called, only clean pages are discarded.
38 lines
1.3 KiB
C++
38 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <Kernel/Memory/InodeVMObject.h>
|
|
#include <Kernel/UnixTypes.h>
|
|
|
|
namespace Kernel::Memory {
|
|
|
|
class SharedInodeVMObject final : public InodeVMObject {
|
|
AK_MAKE_NONMOVABLE(SharedInodeVMObject);
|
|
|
|
public:
|
|
static ErrorOr<NonnullLockRefPtr<SharedInodeVMObject>> try_create_with_inode(Inode&);
|
|
static ErrorOr<NonnullLockRefPtr<SharedInodeVMObject>> try_create_with_inode_and_range(Inode&, u64 offset, size_t range_size);
|
|
virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override;
|
|
|
|
ErrorOr<void> sync(off_t offset_in_pages, size_t pages);
|
|
ErrorOr<void> sync_before_destroying();
|
|
|
|
private:
|
|
virtual bool is_shared_inode() const override { return true; }
|
|
|
|
explicit SharedInodeVMObject(Inode&, FixedArray<RefPtr<PhysicalRAMPage>>&&, Bitmap dirty_pages);
|
|
explicit SharedInodeVMObject(SharedInodeVMObject const&, FixedArray<RefPtr<PhysicalRAMPage>>&&, Bitmap dirty_pages);
|
|
|
|
virtual StringView class_name() const override { return "SharedInodeVMObject"sv; }
|
|
|
|
SharedInodeVMObject& operator=(SharedInodeVMObject const&) = delete;
|
|
|
|
ErrorOr<void> sync_impl(off_t offset_in_pages, size_t pages, bool should_remap);
|
|
};
|
|
|
|
}
|