1
1
use super :: super :: SpaceId ;
2
2
use super :: PageResource ;
3
3
use crate :: util:: freelist:: page_freelist:: PageFreeList ;
4
+ use crate :: util:: heap:: HEAP ;
4
5
use crate :: util:: memory:: RawMemory ;
5
6
use crate :: util:: * ;
6
7
use spin:: mutex:: Mutex ;
@@ -21,19 +22,22 @@ pub struct FreelistPageResource {
21
22
freelist : Mutex < PageFreeList < { NUM_SIZE_CLASS } > , Yield > ,
22
23
reserved_bytes : AtomicUsize ,
23
24
meta : RwLock < Vec < AtomicU32 > , Yield > ,
25
+ base : Address ,
24
26
}
25
27
26
28
impl FreelistPageResource {
27
29
pub fn new ( id : SpaceId ) -> Self {
28
30
debug_assert ! ( id. 0 < 0b0000_1111 ) ;
29
- let base = id. address_space ( ) . start ;
31
+ let range = HEAP . get_space_range ( id) ;
32
+ let base = range. start ;
30
33
let mut freelist = PageFreeList :: new ( base) ;
31
34
freelist. release_cell ( base, 1 << ( NUM_SIZE_CLASS - 1 ) ) ;
32
35
Self {
33
36
id,
34
37
freelist : Mutex :: new ( freelist) ,
35
38
reserved_bytes : AtomicUsize :: new ( 0 ) ,
36
39
meta : RwLock :: new ( unsafe { std:: mem:: transmute ( vec ! [ 0u32 ; 1 << 20 ] ) } ) ,
40
+ base,
37
41
}
38
42
}
39
43
@@ -63,7 +67,7 @@ impl FreelistPageResource {
63
67
64
68
fn set_meta < S : PageSize > ( & self , start : Page < S > , pages : usize ) {
65
69
debug_assert ! ( pages <= u32 :: MAX as usize ) ;
66
- let index = ( start. start ( ) - self . id . address_space ( ) . start ) >> Page :: < Size4K > :: LOG_BYTES ;
70
+ let index = ( start. start ( ) - self . base ) >> Page :: < Size4K > :: LOG_BYTES ;
67
71
let meta = self . meta . upgradeable_read ( ) ;
68
72
if unlikely ( index >= meta. len ( ) ) {
69
73
let mut meta = meta. upgrade ( ) ;
@@ -76,7 +80,7 @@ impl FreelistPageResource {
76
80
}
77
81
78
82
fn get_meta < S : PageSize > ( & self , start : Page < S > ) -> usize {
79
- let index = ( start. start ( ) - self . id . address_space ( ) . start ) >> Page :: < Size4K > :: LOG_BYTES ;
83
+ let index = ( start. start ( ) - self . base ) >> Page :: < Size4K > :: LOG_BYTES ;
80
84
self . meta . read ( ) [ index] . load ( Ordering :: Relaxed ) as _
81
85
}
82
86
}
0 commit comments