mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen: do not merge reserved pages in free_heap_pages()
The code in free_heap_pages() will try to merge pages with the successor/predecessor if pages are suitably aligned. So if the pages reserved are right next to the pages given to the heap allocator, free_heap_pages() will merge them, and give the reserved pages to heap allocator accidentally as a result. So in order to avoid the above scenario, this commit updates free_heap_pages() to check whether the predecessor and/or successor has PGC_static set, when trying to merge the about-to-be-freed chunk with the predecessor and/or successor. Suggested-by: Julien Grall <jgrall@amazon.com> Signed-off-by: Penny Zheng <penny.zheng@arm.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
1 parent
fc151829ba
commit
7d3f8a2a26
1 file changed
+2
@@ -1483,6 +1483,7 @@ static void free_heap_pages(
|
||||
/* Merge with predecessor block? */
|
||||
if ( !mfn_valid(page_to_mfn(predecessor)) ||
|
||||
!page_state_is(predecessor, free) ||
|
||||
(predecessor->count_info & PGC_static) ||
|
||||
(PFN_ORDER(predecessor) != order) ||
|
||||
(phys_to_nid(page_to_maddr(predecessor)) != node) )
|
||||
break;
|
||||
@@ -1506,6 +1507,7 @@ static void free_heap_pages(
|
||||
/* Merge with successor block? */
|
||||
if ( !mfn_valid(page_to_mfn(successor)) ||
|
||||
!page_state_is(successor, free) ||
|
||||
(successor->count_info & PGC_static) ||
|
||||
(PFN_ORDER(successor) != order) ||
|
||||
(phys_to_nid(page_to_maddr(successor)) != node) )
|
||||
break;
|
||||
|
||||