On 21/09/2021 08:17, Jan Beulich wrote: > Leaving shadow setup just to the L1TF tasklet means running Dom0 on a > minimally acceptable shadow memory pool, rather than what normally > would be used (also, for example, for PVH). Populate the pool before > triggering the tasklet, on a best effort basis (again like done for > PVH). > > Signed-off-by: Jan Beulich <[email protected]> > Acked-by: Tim Deegan <[email protected]> > --- > v2: Latch dom0_paging_pages() result. > > --- 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 > { > struct page_info *sp; > > - ASSERT(paging_locked_by_me(d)); > + ASSERT(paging_locked_by_me(d) || system_state < SYS_STATE_active); > > if ( pages > 0 ) > { > --- a/xen/arch/x86/pv/dom0_build.c > +++ b/xen/arch/x86/pv/dom0_build.c > @@ -21,6 +21,7 @@ > #include <asm/page.h> > #include <asm/pv/mm.h> > #include <asm/setup.h> > +#include <asm/shadow.h> > > /* Allow ring-3 access in long mode as guest cannot use ring 1 ... */ > #define BASE_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER) > @@ -933,7 +934,18 @@ int __init dom0_construct_pv(struct doma > #ifdef CONFIG_SHADOW_PAGING > if ( opt_dom0_shadow ) > { > + bool preempted; > + > printk("Switching dom0 to using shadow paging\n"); > + > + 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 );
This is still broken. The loop setting the shadow allocation needs to be outside of this conditional, because it is not related to early activation of the l1tf tasklet. ~Andrew
