Skip to content

Commit 1898c26

Browse files
committed
pmm: get_free_frames() returns frame_t pointer instead of mfn
Signed-off-by: Pawel Wieczorkiewicz <wipawel@amazon.de>
1 parent 5a6413f commit 1898c26

4 files changed

Lines changed: 20 additions & 11 deletions

File tree

arch/x86/pagetables.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ static mfn_t get_cr3_mfn(cr3_t *cr3_entry) {
118118
void *cr3_mapped = NULL;
119119

120120
if (mfn_invalid(cr3_entry->mfn)) {
121-
cr3_entry->mfn = get_free_frame();
121+
frame_t *frame = get_free_frame();
122+
BUG_ON(!frame);
123+
124+
cr3_entry->mfn = frame->mfn;
122125
cr3_mapped = init_map_mfn(cr3_entry->mfn);
123126
memset(cr3_mapped, 0, PAGE_SIZE);
124127
}
@@ -137,7 +140,10 @@ static mfn_t get_pgentry_mfn(mfn_t tab_mfn, pt_index_t index, unsigned long flag
137140

138141
mfn = mfn_from_pgentry(*entry);
139142
if (mfn_invalid(mfn)) {
140-
set_pgentry(entry, get_free_frame(), flags);
143+
frame_t *frame = get_free_frame();
144+
BUG_ON(!frame);
145+
146+
set_pgentry(entry, frame->mfn, flags);
141147
mfn = mfn_from_pgentry(*entry);
142148
tab = init_map_mfn(mfn);
143149
memset(tab, 0, PAGE_SIZE);

include/mm/pmm.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extern void display_frames_count(void);
4848
extern void init_pmm(void);
4949

5050
extern frame_t *get_free_frames_cond(free_frames_cond_t cb);
51-
extern mfn_t get_free_frames(unsigned int order);
51+
extern frame_t *get_free_frames(unsigned int order);
5252
extern void put_frame(mfn_t mfn, unsigned int order);
5353
extern void reclaim_frame(mfn_t mfn, unsigned int order);
5454

@@ -62,7 +62,7 @@ static inline bool paddr_invalid(paddr_t pa) {
6262

6363
static inline bool mfn_invalid(mfn_t mfn) { return paddr_invalid(mfn_to_paddr(mfn)); }
6464

65-
static inline mfn_t get_free_frame(void) { return get_free_frames(PAGE_ORDER_4K); }
65+
static inline frame_t *get_free_frame(void) { return get_free_frames(PAGE_ORDER_4K); }
6666

6767
#endif /* __ASSEMBLY__ */
6868

mm/pmm.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2020 Amazon.com, Inc. or its affiliates.
2+
* Copyright © 2021 Amazon.com, Inc. or its affiliates.
33
* All Rights Reserved.
44
*
55
* Redistribution and use in source and binary forms, with or without
@@ -188,22 +188,22 @@ frame_t *get_free_frames_cond(free_frames_cond_t cb) {
188188
return NULL;
189189
}
190190

191-
mfn_t get_free_frames(unsigned int order) {
191+
frame_t *get_free_frames(unsigned int order) {
192192
frame_t *frame;
193193

194194
if (order > MAX_PAGE_ORDER)
195-
return MFN_INVALID;
195+
return NULL;
196196

197197
if (list_is_empty(&free_frames[order])) {
198198
/* FIXME: Add page split */
199-
return MFN_INVALID;
199+
return NULL;
200200
}
201201

202202
frame = list_first_entry(&free_frames[order], frame_t, list);
203203

204204
frame = reserve_frame(frame, order);
205205

206-
return frame->mfn;
206+
return frame;
207207
}
208208

209209
void put_frame(mfn_t mfn, unsigned int order) {

mm/vmm.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@
3030
#include <mm/vmm.h>
3131

3232
void *get_free_pages(unsigned int order, uint32_t flags) {
33-
mfn_t mfn = get_free_frames(order);
33+
frame_t *frame = get_free_frames(order);
3434
void *va = NULL;
35+
mfn_t mfn;
3536

36-
if (mfn_invalid(mfn))
37+
if (!frame)
3738
return NULL;
3839

40+
mfn = frame->mfn;
41+
3942
if (flags & GFP_IDENT)
4043
va = vmap(mfn_to_virt(mfn), mfn, order, L4_PROT, L3_PROT, L2_PROT, L1_PROT);
4144
if (flags & GFP_USER)

0 commit comments

Comments
 (0)