|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] slightly consolidate code in free_domheap_pages()
... to combine the three scrubbing paths into a single one.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
v2: Add a comment to an ASSERT() deemed unclear/non-obvious otherwise.
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -1724,47 +1724,52 @@ void free_domheap_pages(struct page_info
spin_unlock_recursive(&d->page_alloc_lock);
}
- else if ( likely(d != NULL) && likely(d != dom_cow) )
+ else
{
- /* NB. May recursively lock from relinquish_memory(). */
- spin_lock_recursive(&d->page_alloc_lock);
+ bool_t scrub;
- for ( i = 0; i < (1 << order); i++ )
+ if ( likely(d) && likely(d != dom_cow) )
{
- BUG_ON((pg[i].u.inuse.type_info & PGT_count_mask) != 0);
- page_list_del2(&pg[i], &d->page_list, &d->arch.relmem_list);
- }
+ /* NB. May recursively lock from relinquish_memory(). */
+ spin_lock_recursive(&d->page_alloc_lock);
- drop_dom_ref = !domain_adjust_tot_pages(d, -(1 << order));
-
- spin_unlock_recursive(&d->page_alloc_lock);
+ for ( i = 0; i < (1 << order); i++ )
+ {
+ BUG_ON((pg[i].u.inuse.type_info & PGT_count_mask) != 0);
+ page_list_del2(&pg[i], &d->page_list, &d->arch.relmem_list);
+ }
+
+ drop_dom_ref = !domain_adjust_tot_pages(d, -(1 << order));
+
+ spin_unlock_recursive(&d->page_alloc_lock);
+
+ /*
+ * Normally we expect a domain to clear pages before freeing them,
+ * if it cares about the secrecy of their contents. However, after
+ * a domain has died we assume responsibility for erasure.
+ */
+ scrub = !!d->is_dying;
+ }
+ else
+ {
+ /*
+ * All we need to check is that on dom_cow only order-0 chunks
+ * make it here. Due to the if() above, the only two possible
+ * cases right now are d == NULL and d == dom_cow. To protect
+ * against relaxation of that if() condition without updating the
+ * check here, don't check d != dom_cow for now.
+ */
+ ASSERT(!d || !order);
+ drop_dom_ref = 0;
+ scrub = 1;
+ }
- /*
- * Normally we expect a domain to clear pages before freeing them, if
- * it cares about the secrecy of their contents. However, after a
- * domain has died we assume responsibility for erasure.
- */
- if ( unlikely(d->is_dying) )
+ if ( unlikely(scrub) )
for ( i = 0; i < (1 << order); i++ )
scrub_one_page(&pg[i]);
free_heap_pages(pg, order);
}
- else if ( unlikely(d == dom_cow) )
- {
- ASSERT(order == 0);
- scrub_one_page(pg);
- free_heap_pages(pg, 0);
- drop_dom_ref = 0;
- }
- else
- {
- /* Freeing anonymous domain-heap pages. */
- for ( i = 0; i < (1 << order); i++ )
- scrub_one_page(&pg[i]);
- free_heap_pages(pg, order);
- drop_dom_ref = 0;
- }
if ( drop_dom_ref )
put_domain(d);
Attachment:
free-domheap-pages-consolidate.patch _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |