|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/balloon: don't alloc page while non-preemptible
On Thu, 19 Sep 2013, David Vrabel wrote:
> From: David Vrabel <david.vrabel@xxxxxxxxxx>
>
> get_balloon_scratch_page() disables preemption so we cannot call
> alloc_page() in between get/put_balloon_scratch_page(). Shuffle bits
> around in decrease_reservation() to avoid this.
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
> drivers/xen/balloon.c | 23 +++++++++++------------
> 1 files changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
> index a50c6e3..b232908 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -398,8 +398,6 @@ static enum bp_state decrease_reservation(unsigned long
> nr_pages, gfp_t gfp)
> if (nr_pages > ARRAY_SIZE(frame_list))
> nr_pages = ARRAY_SIZE(frame_list);
>
> - scratch_page = get_balloon_scratch_page();
> -
> for (i = 0; i < nr_pages; i++) {
> page = alloc_page(gfp);
> if (page == NULL) {
> @@ -413,6 +411,12 @@ static enum bp_state decrease_reservation(unsigned long
> nr_pages, gfp_t gfp)
>
> scrub_page(page);
>
> + /*
> + * Ballooned out frames are effectively replaced with
> + * a scratch frame. Ensure direct mappings and the
> + * p2m are consistent.
> + */
> + scratch_page = get_balloon_scratch_page();
> #ifdef CONFIG_XEN_HAVE_PVMMU
> if (xen_pv_domain() && !PageHighMem(page)) {
> ret = HYPERVISOR_update_va_mapping(
> @@ -422,24 +426,19 @@ static enum bp_state decrease_reservation(unsigned long
> nr_pages, gfp_t gfp)
> BUG_ON(ret);
> }
> #endif
> - }
> -
> - /* Ensure that ballooned highmem pages don't have kmaps. */
> - kmap_flush_unused();
> - flush_tlb_all();
> -
> - /* No more mappings: invalidate P2M and add to balloon. */
> - for (i = 0; i < nr_pages; i++) {
> - pfn = mfn_to_pfn(frame_list[i]);
> if (!xen_feature(XENFEAT_auto_translated_physmap)) {
> unsigned long p;
> p = page_to_pfn(scratch_page);
> __set_phys_to_machine(pfn, pfn_to_mfn(p));
> }
> + put_balloon_scratch_page();
> +
> balloon_append(pfn_to_page(pfn));
> }
>
> - put_balloon_scratch_page();
> + /* Ensure that ballooned highmem pages don't have kmaps. */
> + kmap_flush_unused();
> + flush_tlb_all();
The change with possible side effects in this patch is that
kmap_flush_unused and flush_tlb_all are now called after setting the p2m
and after calling balloon_append instead of before.
However they are still called before the XENMEM_decrease_reservation
hypercall, so I think it's OK.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |