source: trunk/kernel/mm/page.h @ 631

Last change on this file since 631 was 625, checked in by alain, 6 years ago

Fix a bug in the vmm_remove_vseg() function: the physical pages
associated to an user DATA vseg were released to the kernel when
the target process descriptor was in the reference cluster.
This physical pages release should be done only when the page
forks counter value is zero.
All other modifications are cosmetic.

File size: 6.5 KB
Line 
1/*
2 * page.h - physical page descriptor and related operations
3 *
4 * Authors Ghassan Almalles (2008,2009,2010,2011,2012)
5 *         Alain Greiner    (2016)
6 *
7 * Copyright (c) UPMC Sorbonne Universites
8 *
9 * This file is part of ALMOS-MKH.
10 *
11 * ALMOS-MKH is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; version 2.0 of the License.
14 *
15 * ALMOS-MKH is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25#ifndef _PAGE_H_
26#define _PAGE_H_
27
28#include <kernel_config.h>
29#include <hal_kernel_types.h>
30#include <remote_busylock.h>
31#include <list.h>
32
33/***   Forward declarations   ***/
34
35struct mapper_s;
36
37/*************************************************************************************
38 * This  defines the flags that can be attached to a physical page.
39 ************************************************************************************/
40
41#define PG_INIT             0x0001     // page descriptor has been initialised
42#define PG_RESERVED         0x0002     // cannot be allocated by PPM
43#define PG_FREE             0x0004     // page not yet allocated by PPM
44#define PG_DIRTY            0x0040     // page has been written
45#define PG_COW          0x0080     // page is copy-on-write
46
47/*************************************************************************************
48 * This structure defines a physical page descriptor.
49 * - The remote_busylock is used to allows any remote thread to atomically
50 *   test/modify the forks counter or the page flags.
51 * - The list entry is used to register the page in a free list or in dirty list.
52 *   The refcount is used for page release to KMEM.
53 * NOTE: the size is 48 bytes for a 32 bits core.
54 ************************************************************************************/
55
56typedef struct page_s
57{
58    uint32_t          flags;          /*! flags defined above                  (4)  */
59    uint32_t          order;          /*! log2( number of small pages)         (4)  */
60    struct mapper_s * mapper;         /*! local pointer on associated mapper   (4)  */
61    uint32_t          index;          /*! page index in mapper                 (4)  */
62        list_entry_t      list;           /*! for both dirty pages and free pages  (8)  */
63        int32_t           refcount;       /*! references counter for page release  (4)  */
64        uint32_t          forks;          /*! number of pending forks              (4)  */
65        remote_busylock_t lock;           /*! protect forks or flags modifs        (16) */
66}
67page_t;
68
69/*************************************************************************************
70 * This function initializes one page descriptor.
71 *************************************************************************************
72 * @ page    : pointer to page descriptor
73 ************************************************************************************/
74inline void page_init( page_t * page );
75
76/*************************************************************************************
77 * This function atomically set one or several flags in page descriptor flags.
78 *************************************************************************************
79 * @ page    : pointer to page descriptor.
80 * @ value   : all non zero bits in value will be set.
81 ************************************************************************************/
82inline void page_set_flag( page_t   * page,
83                           uint32_t   value );
84
85/*************************************************************************************
86 * This function atomically reset one or several flags in page descriptor flags.
87 *************************************************************************************
88 * @ page    : pointer to page descriptor.
89 * @ value   : all non zero bits in value will be cleared.
90 ************************************************************************************/
91inline void page_clear_flag( page_t   * page,
92                             uint32_t   value );
93
94/*************************************************************************************
95 * This function tests the value of one or several flags in page descriptor flags.
96 *************************************************************************************
97 * @ page    : pointer to page descriptor.
98 * @ value   : all non zero bits will be tested.
99 * @ returns true if at least one non zero bit in value is set / false otherwise.
100 ************************************************************************************/
101inline bool_t page_is_flag( page_t   * page,
102                            uint32_t   value );
103
104/*************************************************************************************
105 * This function resets to 0 all bytes in a given page.
106 *************************************************************************************
107 * @ page     : pointer on page descriptor.
108 ************************************************************************************/
109void page_zero( page_t * page );
110
111/*************************************************************************************
112 * This blocking function atomically increments the page refcount.
113 *************************************************************************************
114 * @ page     : pointer on page descriptor.
115 ************************************************************************************/
116inline void page_refcount_up( page_t * page );
117
118/*************************************************************************************
119 * This blocking function atomically decrements the page refcount.
120 *************************************************************************************
121 * @ page     : pointer on page descriptor.
122 ************************************************************************************/
123inline void page_refcount_down( page_t * page );
124
125/*************************************************************************************
126 * This function display the values contained in a page descriptor.
127 *************************************************************************************
128 * @ page     : pointer on page descriptor.
129 ************************************************************************************/
130void page_print( page_t * page );
131
132
133#endif  /* _PAGE_H_ */
Note: See TracBrowser for help on using the repository browser.