From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: [PATCH 2/3] xen/arm: implement domain_relinquish_resources Date: Tue, 22 Jan 2013 13:04:03 +0000 Message-ID: <1358859844-14056-2-git-send-email-stefano.stabellini@eu.citrix.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: tim@xen.org, Ian.Campbell@citrix.com, Stefano Stabellini List-Id: xen-devel@lists.xenproject.org put_page on every entry in xenpage_list and page_list Signed-off-by: Stefano Stabellini --- xen/arch/arm/domain.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 44 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 17713f8..3e9a690 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -517,11 +518,51 @@ void arch_vcpu_reset(struct vcpu *v) vcpu_end_shutdown_deferral(v); } +static int relinquish_memory(struct domain *d, struct page_list_head *list) +{ + struct page_info *page, *tmp; + int ret = 0; + + /* Use a recursive lock, as we may enter 'free_domheap_page'. */ + spin_lock_recursive(&d->page_alloc_lock); + + page_list_for_each_safe( page, tmp, list ) + { + /* Grab a reference to the page so it won't disappear from under us. */ + if ( unlikely(!get_page(page, d)) ) + /* Couldn't get a reference -- someone is freeing this page. */ + BUG(); + + if ( test_and_clear_bit(_PGC_allocated, &page->count_info) ) + put_page(page); + + put_page(page); + + if ( hypercall_preempt_check() ) + { + ret = -EAGAIN; + goto out; + } + } + + out: + spin_unlock_recursive(&d->page_alloc_lock); + return ret; +} + int domain_relinquish_resources(struct domain *d) { - /* XXX teardown pagetables, free pages etc */ - ASSERT(0); - return 0; + int ret = 0; + + ret = relinquish_memory(d, &d->xenpage_list); + if ( ret ) + return ret; + + ret = relinquish_memory(d, &d->page_list); + if ( ret ) + return ret; + + return ret; } void arch_dump_domain_info(struct domain *d) -- 1.7.2.5