|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/balloon: set ballooned out pages as invalid in p2m
On Tue, Jul 01, 2014 at 02:37:48PM +0100, David Vrabel wrote:
> Since cd9151e26d31048b2b5e00fd02e110e07d2200c9 (xen/balloon: set a
> mapping for ballooned out pages), a ballooned out page had its entry
> in the p2m set to the MFN of one of the scratch pages. This means
> that the p2m will contain many entries pointing to the same MFN.
>
> During a domain save, these many-to-one entries are not identified as
> such and the scratch page is saved multiple times. On restore the
> ballooned pages are populated with new frames and the domain may use
> up its allocation before all pages can be restored.
>
> Set ballooned out pages as INVALID_P2M_ENTRY in the p2m (as they were
> before), preventing them from being saved and re-populated on restore.
>
Won't that invalide the primal purpose of the scratch page code?
That is cd9151e26d31048b2b5e00fd02e110e07d2200c9
xen/balloon: set a mapping for ballooned out pages
" Allocate a page per cpu and map all the ballooned out pages to the
corresponding mfn. Set the p2m accordingly. This way reading from a
ballooned out page won't cause a kernel crash (see
http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html).
"
?
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> Reported-by: Marek Marczykowski <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> Tested-by: Marek Marczykowski <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> ---
> drivers/xen/balloon.c | 12 +++++-------
> 1 file changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
> index b7a506f..5c660c7 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -426,20 +426,18 @@ static enum bp_state decrease_reservation(unsigned long
> nr_pages, gfp_t gfp)
> * p2m are consistent.
> */
> if (!xen_feature(XENFEAT_auto_translated_physmap)) {
> - unsigned long p;
> - struct page *scratch_page =
> get_balloon_scratch_page();
> -
> if (!PageHighMem(page)) {
> + struct page *scratch_page =
> get_balloon_scratch_page();
> +
> ret = HYPERVISOR_update_va_mapping(
> (unsigned long)__va(pfn <<
> PAGE_SHIFT),
>
> pfn_pte(page_to_pfn(scratch_page),
> PAGE_KERNEL_RO), 0);
> BUG_ON(ret);
> - }
> - p = page_to_pfn(scratch_page);
> - __set_phys_to_machine(pfn, pfn_to_mfn(p));
>
> - put_balloon_scratch_page();
> + put_balloon_scratch_page();
> + }
> + __set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
> }
> #endif
>
> --
> 1.7.10.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |