MOS Source Code
Loading...
Searching...
No Matches
cow.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "mos/mm/cow.hpp"
4
5#include "mos/mm/mm.hpp"
6#include "mos/mm/mmstat.hpp"
9
10#include <mos/interrupt/ipi.hpp>
11#include <mos/mm/cow.hpp>
15#include <mos/syslog/printk.hpp>
16#include <mos/tasks/process.hpp>
18#include <mos/types.hpp>
19#include <mos_string.hpp>
20
22static phyframe_t *zero_page(void)
23{
24 if (unlikely(!_zero_page))
25 {
29 }
30
31 return _zero_page;
32}
33
35{
36 MOS_UNUSED(fault_addr);
37
38 if (info->is_present && info->is_write)
39 {
40 vmap_stat_dec(vmap, cow); // the faulting page is a CoW page
41 vmap_stat_inc(vmap, regular);
42 return mm_resolve_cow_fault(vmap, fault_addr, info);
43 }
44
45 MOS_ASSERT(!info->is_present); // we can't have (present && !write)
46
47 if (info->is_write)
48 {
49 // non-present and write, must be a ZoD page
51 vmap_stat_inc(vmap, regular);
53 }
54 else
55 {
56 info->backing_page = zero_page();
57 vmap_stat_inc(vmap, cow);
59 }
60}
61
63{
64 // remove that VM_WRITE flag
65 mm_flag_pages_locked(src_vmap->mmctx, src_vmap->vaddr, src_vmap->npages, src_vmap->vmflags & ~VM_WRITE);
66 src_vmap->stat.cow += src_vmap->stat.regular;
67 src_vmap->stat.regular = 0; // no longer private
68
69 auto dst_vmap = mm_clone_vmap_locked(src_vmap, target_mmctx);
70 if (dst_vmap.isErr())
71 return dst_vmap.getErr();
72
73 if (!src_vmap->on_fault)
75
76 dst_vmap->on_fault = src_vmap->on_fault;
77 dst_vmap->stat = dst_vmap->stat;
78 return dst_vmap;
79}
80
81PtrResult<vmap_t> cow_allocate_zeroed_pages(MMContext *mmctx, size_t npages, ptr_t vaddr, valloc_flags allocflags, vm_flags flags)
82{
84 auto vmap = mm_get_free_vaddr_locked(mmctx, npages, vaddr, allocflags);
86
87 if (vmap.isErr())
88 return vmap;
89
90 vmap->vmflags = flags;
91 vmap->on_fault = cow_zod_fault_handler;
92 return vmap;
93}
#define MOS_ASSERT(cond)
Definition assert.hpp:14
#define MOS_PAGE_SIZE
Definition autoconf.h:6
PtrResult< vmap_t > cow_clone_vmap_locked(MMContext *target_mmctx, vmap_t *src_vmap)
Copy-on-write a page range.
Definition cow.cpp:62
static vmfault_result_t cow_zod_fault_handler(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info)
Definition cow.cpp:34
static phyframe_t * zero_page(void)
Definition cow.cpp:22
static phyframe_t * _zero_page
Definition cow.cpp:21
PtrResult< vmap_t > cow_allocate_zeroed_pages(MMContext *mmctx, size_t npages, ptr_t vaddr, valloc_flags allocflags, vm_flags flags)
Allocate zero-on-demand pages at a specific address.
Definition cow.cpp:81
#define phyframe_va(frame)
Definition mm.hpp:80
vmfault_result_t
Definition mm.hpp:46
phyframe_t * mm_get_free_page(void)
Definition mm.cpp:39
vmfault_result_t mm_resolve_cow_fault(vmap_t *vmap, ptr_t fault_addr, pagefault_t *info)
Helper function to resolve a copy-on-write fault.
Definition mm.cpp:266
@ VMFAULT_MAP_BACKING_PAGE
the caller should map the backing page into the faulting address
Definition mm.hpp:49
@ VMFAULT_MAP_BACKING_PAGE_RO
the caller should map the backing page into the faulting address, and mark it non-writable
Definition mm.hpp:48
valloc_flags
Definition paging.hpp:20
void mm_flag_pages_locked(MMContext *mmctx, ptr_t vaddr, size_t npages, vm_flags flags)
Update the flags of a block of virtual memory.
Definition paging.cpp:172
PtrResult< vmap_t > mm_clone_vmap_locked(vmap_t *src_vmap, MMContext *dst_ctx)
Remap a block of virtual memory from one page table to another, i.e. copy the mappings.
Definition paging.cpp:133
PtrResult< vmap_t > mm_get_free_vaddr_locked(MMContext *mmctx, size_t n_pages, ptr_t base_vaddr, valloc_flags flags)
Gets npages unmapped free pages from a page table.
Definition paging.cpp:18
#define pmm_ref_one(thing)
Definition pmm.hpp:159
#define vmap_stat_inc(vmap, type)
Definition mmstat.hpp:70
#define vmap_stat_dec(vmap, type)
Definition mmstat.hpp:71
#define MOS_UNUSED(x)
Definition mos_global.h:65
#define unlikely(x)
Definition mos_global.h:40
#define NULL
Definition pb_syshdr.h:46
vm_flags
Definition platform.hpp:42
@ VM_WRITE
Definition platform.hpp:45
#define memzero(ptr, size)
#define spinlock_acquire(lock)
Definition spinlock.hpp:64
#define spinlock_release(lock)
Definition spinlock.hpp:65
spinlock_t mm_lock
protects [pgd] and the [mmaps] list (the list itself, not the vmap_t objects)
Definition platform.hpp:86
bool is_present
Definition mm.hpp:38
const phyframe_t * backing_page
the frame that contains the data for this page, the on_fault handler should set this
Definition mm.hpp:42
bool is_write
Definition mm.hpp:38
size_t cow
pages that are copy-on-write
Definition mmstat.hpp:67
size_t regular
regular pages with no special flags being set or unset
Definition mmstat.hpp:65
Definition mm.hpp:59
ptr_t vaddr
Definition mm.hpp:63
size_t npages
Definition mm.hpp:64
vmfault_handler_t on_fault
Definition mm.hpp:74
vm_flags vmflags
Definition mm.hpp:65
vmap_stat_t stat
Definition mm.hpp:73
MMContext * mmctx
Definition mm.hpp:66
unsigned long ptr_t
Definition types.h:21