diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index de09ef5cae..6221630fc2 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -1298,7 +1298,7 @@ int shadow_set_allocation(struct domain *d, unsigned int pages, bool *preempted) { struct page_info *sp; - ASSERT(paging_locked_by_me(d)); + ASSERT(paging_locked_by_me(d) || system_state < SYS_STATE_active); if ( pages > 0 ) { diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c index cb68da75c1..e501979a86 100644 --- a/xen/arch/x86/pv/dom0_build.c +++ b/xen/arch/x86/pv/dom0_build.c @@ -21,6 +21,7 @@ #include #include #include +#include /* Allow ring-3 access in long mode as guest cannot use ring 1 ... */ #define BASE_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER) @@ -928,8 +929,22 @@ int __init dom0_construct_pv(struct domain *d, if ( d->domain_id == hardware_domid ) iommu_hwdom_init(d); - /* Activate shadow mode, if requested. Reuse the pv_l1tf tasklet. */ #ifdef CONFIG_SHADOW_PAGING + /* Fill the shadow pool if necessary. */ + if ( opt_dom0_shadow || opt_pv_l1tf_hwdom ) + { + bool preempted; + + nr_pt_pages = dom0_paging_pages(d, nr_pages); + + do { + preempted = false; + shadow_set_allocation(d, nr_pt_pages, &preempted); + process_pending_softirqs(); + } while ( preempted ); + } + + /* Activate shadow mode, if requested. Reuse the pv_l1tf tasklet. */ if ( opt_dom0_shadow ) { printk("Switching dom0 to using shadow paging\n");