lguest: restore boot speed
lguest is dumb and drops *all* the pagetables for set_pte (which is only used for kernel mapping manipulation, so it's OK without highmem). But it's used a lot in boot, too. As a guest optimization, we suppressed this flushing until the first page switch. Now we have initial_page_table, that happens much earlier, so extend the heuristic to wait until we switch to something other than the swapper_pg_dir or initial_page_table. As measured on my laptop under kvm, this dropped the time-to-mount-root from 48 seconds to 4.3 seconds. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
bb6f1d9a99
commit
bb4093deb2
|
@ -531,7 +531,10 @@ static void lguest_write_cr3(unsigned long cr3)
|
|||
{
|
||||
lguest_data.pgdir = cr3;
|
||||
lazy_hcall1(LHCALL_NEW_PGTABLE, cr3);
|
||||
cr3_changed = true;
|
||||
|
||||
/* These two page tables are simple, linear, and used during boot */
|
||||
if (cr3 != __pa(swapper_pg_dir) && cr3 != __pa(initial_page_table))
|
||||
cr3_changed = true;
|
||||
}
|
||||
|
||||
static unsigned long lguest_read_cr3(void)
|
||||
|
@ -703,9 +706,9 @@ static void lguest_set_pmd(pmd_t *pmdp, pmd_t pmdval)
|
|||
* to forget all of them. Fortunately, this is very rare.
|
||||
*
|
||||
* ... except in early boot when the kernel sets up the initial pagetables,
|
||||
* which makes booting astonishingly slow: 1.83 seconds! So we don't even tell
|
||||
* the Host anything changed until we've done the first page table switch,
|
||||
* which brings boot back to 0.25 seconds.
|
||||
* which makes booting astonishingly slow: 48 seconds! So we don't even tell
|
||||
* the Host anything changed until we've done the first real page table switch,
|
||||
* which brings boot back to 4.3 seconds.
|
||||
*/
|
||||
static void lguest_set_pte(pte_t *ptep, pte_t pteval)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue