From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andres Lagar-Cavilla Subject: [PATCH] x86/mem sharing: Take care of domain reference for shared pages Date: Wed, 04 Apr 2012 11:48:32 -0400 Message-ID: <6a3e651ee3b6123eca9c.1333554512@xdev.gridcentric.ca> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: 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.xen.org Cc: andres@gridcentric.ca, tim@xen.org, adin@gridcentric.ca List-Id: xen-devel@lists.xenproject.org xen/arch/x86/mm/mem_sharing.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) Making a page sharable removes it from the previous owner's list. Making it private adds it. These actions are similar to freeing or allocating a page. Except that they were not minding the domain reference that is taken/dropped when the first/last page is allocated/freed. Without fixing this, a domain might remain zombie when destroyed if all its pages are shared. Signed-off-by: Andres Lagar-Cavilla diff -r 48763a117b2a -r 6a3e651ee3b6 xen/arch/x86/mm/mem_sharing.c --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -401,6 +401,7 @@ static int page_make_sharable(struct dom struct page_info *page, int expected_refcnt) { + int drop_dom_ref; spin_lock(&d->page_alloc_lock); /* Change page type and count atomically */ @@ -430,8 +431,12 @@ static int page_make_sharable(struct dom page_set_owner(page, dom_cow); d->tot_pages--; + drop_dom_ref = (d->tot_pages == 0); page_list_del(page, &d->page_list); spin_unlock(&d->page_alloc_lock); + + if ( drop_dom_ref ) + put_domain(d); return 0; } @@ -466,7 +471,8 @@ static int page_make_private(struct doma ASSERT(page_get_owner(page) == dom_cow); page_set_owner(page, d); - d->tot_pages++; + if ( d->tot_pages++ == 0 ) + get_domain(d); page_list_add_tail(page, &d->page_list); spin_unlock(&d->page_alloc_lock);