1// SPDX-License-Identifier: GPL-3.0-or-later
2#pragma once
3
4#include <mos/types.h>
5
6typedef enum
7{
8 MEM_PAGETABLE, // page table pages
9 MEM_SLAB, // slab allocator
10 MEM_PAGECACHE, // page cache
11 MEM_KERNEL, // kernel memory (e.g. kernel stack)
12 MEM_USER, // user memory (e.g. user code, data, stack)
13
14 _MEM_MAX_TYPES,
15} mmstat_type_t;
16
17extern const char *mem_type_names[_MEM_MAX_TYPES];
18
19/**
20 * @brief Increment the memory usage statistics.
21 *
22 * @param type The type of memory.
23 * @param size The size of memory.
24 */
25void mmstat_inc(mmstat_type_t type, size_t size);
26#define mmstat_inc1(type) mmstat_inc(type, 1)
27
28/**
29 * @brief Decrement the memory usage statistics.
30 *
31 * @param type The type of memory.
32 * @param size The size of memory.
33 */
34void mmstat_dec(mmstat_type_t type, size_t size);
35#define mmstat_dec1(type) mmstat_dec(type, 1)
36
37/**
38 * @brief Memory usage statistics for a specific vmap area.
39 *
40 * @details Different types of memory:
41 * The metrics in this struct only describe what is 'mapped' in the vmap area.
42 * Unmapped pages are not counted.
43 *
44 * On a page fault, the page is mapped in and the following happens:
45 *
46 * Private File-backed:
47 * Read pagecache++, cow++,
48 * Written regular++,
49 * if the page is already mapped, pagecache--, cow-- (page is not in the page cache)
50 * Forked cow += regular, regular = 0 (regular pages now becomes cow pages, pagecache ones stay pagecache (read-only))
51 * Shared File-backed:
52 * Read pagecache++, regular++,
53 * Written if the page wasn't previously mapped, pagecache++, regular++ (a new pagecache page is now mapped)
54 * Private Anonymous:
55 * Read cow++,
56 * zero page is mapped
57 * Written regular++, cow--,
58 * Forked cow += regular, regular = 0 (regular pages now becomes cow pages)
59 * Shared Anonymous:
60 * NOT IMPLEMENTED (yet)
61 *
62 */
63typedef struct
64{
65 size_t regular; ///< regular pages with no special flags being set or unset
66 size_t pagecache; ///< pages that are in the page cache (file-backed only)
67 size_t cow; ///< pages that are copy-on-write
68} vmap_stat_t;
69
70#define vmap_stat_inc(vmap, type) (vmap)->stat.type += 1
71#define vmap_stat_dec(vmap, type) (vmap)->stat.type -= 1
72