@@ -3,18 +3,14 @@ use core::ops::{Deref, DerefMut};
3
3
use allocator:: linked_list:: LinkedList ;
4
4
use spin:: SpinGuard ;
5
5
6
- use crate :: {
7
- config:: PAGE_SIZE ,
8
- mem:: page:: { Page , Pageable } ,
9
- mm:: address:: PhyPageNum ,
10
- } ;
6
+ use crate :: { config:: PAGE_SIZE , mem:: page:: Page , mm:: address:: PhyPageNum } ;
11
7
12
8
/// One possible representation of metadata of page, when the page is used by slab allocator.
13
9
///
14
10
/// We need to guarantee that all operations toward it is atomic.
15
11
#[ derive( Debug ) ]
16
12
pub struct SlabPage {
17
- pa : usize ,
13
+ ppn : PhyPageNum ,
18
14
19
15
order : u8 ,
20
16
@@ -31,37 +27,27 @@ pub struct SlabPageGuard<'a> {
31
27
}
32
28
33
29
impl SlabPage {
34
- pub fn new ( pa : usize , order : u8 ) -> SlabPage {
30
+ pub fn alloc ( ppn : PhyPageNum , order : u8 ) {
35
31
let mut slab_page = Self {
36
- pa ,
32
+ ppn ,
37
33
order,
38
34
prev : PhyPageNum :: null ( ) ,
39
35
next : PhyPageNum :: null ( ) ,
40
36
free : LinkedList :: new ( ) ,
41
37
inuse : 0 ,
42
38
} ;
43
39
slab_page. init ( ) ;
44
- slab_page
45
- }
46
-
47
- pub fn alloc ( pa : usize , order : u8 ) {
48
- let mut slab_page = Self {
49
- pa,
50
- order,
51
- prev : PhyPageNum :: null ( ) ,
52
- next : PhyPageNum :: null ( ) ,
53
- free : LinkedList :: new ( ) ,
54
- inuse : 0 ,
55
- } ;
56
- slab_page. init ( ) ;
57
- * Page :: from_pa ( pa) . lock ( ) = Page :: Slab ( slab_page) ;
40
+ * Page :: from_ppn ( ppn) . lock ( ) = Page :: Slab ( slab_page) ;
58
41
}
59
42
60
43
pub fn init ( & mut self ) {
61
44
let size = 1 << self . order ;
62
45
self . free = LinkedList :: new ( ) ;
63
46
( 0 ..PAGE_SIZE / size) . rev ( ) . for_each ( |i| {
64
- unsafe { self . free . push_front ( ( self . pa + i * size) as * mut usize ) } ;
47
+ unsafe {
48
+ self . free
49
+ . push_front ( ( usize:: from ( self . ppn ) + i * size) as * mut usize )
50
+ } ;
65
51
} ) ;
66
52
}
67
53
@@ -89,12 +75,6 @@ impl SlabPage {
89
75
}
90
76
}
91
77
92
- impl Pageable for SlabPage {
93
- fn new_page ( pa : PhyPageNum ) -> Page {
94
- Page :: Slab ( SlabPage :: new ( pa. into ( ) , 0 ) )
95
- }
96
- }
97
-
98
78
impl < ' a > SlabPageGuard < ' a > {
99
79
pub fn new ( ppn : PhyPageNum ) -> Self {
100
80
let guard = Page :: from_ppn ( ppn) . lock ( ) ;
0 commit comments