File tree Expand file tree Collapse file tree 2 files changed +38
-7
lines changed Expand file tree Collapse file tree 2 files changed +38
-7
lines changed Original file line number Diff line number Diff line change @@ -83,6 +83,8 @@ typedef struct frame frame_t;
83
83
84
84
#define for_each_order (order ) for (int order = 0; order < MAX_PAGE_ORDER + 1; order++)
85
85
86
+ typedef bool (* free_frames_cond_t )(frame_t * free_frame );
87
+
86
88
/* External definitions */
87
89
88
90
extern void display_memory_map (void );
@@ -96,6 +98,7 @@ extern bool paddr_invalid(paddr_t pa);
96
98
97
99
extern void init_pmm (void );
98
100
101
+ extern frame_t * get_free_frames_cond (free_frames_cond_t cb );
99
102
extern mfn_t get_free_frames (unsigned int order );
100
103
extern void put_frame (mfn_t mfn , unsigned int order );
101
104
extern void reclaim_frame (mfn_t mfn , unsigned int order );
Original file line number Diff line number Diff line change @@ -245,6 +245,40 @@ void init_pmm(void) {
245
245
}
246
246
}
247
247
248
+ static frame_t * reserve_frame (frame_t * frame , unsigned int order ) {
249
+ BUG_ON (!frame );
250
+ BUG_ON (!frame -> free );
251
+ frame -> free = false;
252
+
253
+ BUG_ON (frame -> refcount > 0 );
254
+ frame -> refcount ++ ;
255
+
256
+ list_unlink (& frame -> list );
257
+ list_add (& frame -> list , & busy_frames [order ]);
258
+
259
+ return frame ;
260
+ }
261
+
262
+ /* Reserves and returns the first free frame
263
+ * fulfilling the condition specified by
264
+ * the callback
265
+ */
266
+ frame_t * get_free_frames_cond (free_frames_cond_t cb ) {
267
+ frame_t * frame ;
268
+
269
+ for_each_order (order ) {
270
+ if (list_is_empty (& free_frames [order ]))
271
+ continue ;
272
+
273
+ list_for_each_entry (frame , & free_frames [order ], list ) {
274
+ if (cb (frame )) {
275
+ return reserve_frame (frame , order );
276
+ }
277
+ }
278
+ }
279
+ return NULL ;
280
+ }
281
+
248
282
mfn_t get_free_frames (unsigned int order ) {
249
283
frame_t * frame ;
250
284
@@ -257,14 +291,8 @@ mfn_t get_free_frames(unsigned int order) {
257
291
}
258
292
259
293
frame = list_first_entry (& free_frames [order ], frame_t , list );
260
- BUG_ON (!frame -> free );
261
- frame -> free = false;
262
294
263
- BUG_ON (frame -> refcount > 0 );
264
- frame -> refcount ++ ;
265
-
266
- list_unlink (& frame -> list );
267
- list_add (& frame -> list , & busy_frames [order ]);
295
+ frame = reserve_frame (frame , order );
268
296
269
297
return frame -> mfn ;
270
298
}
You can’t perform that action at this time.
0 commit comments