提交 bb4093de 编写于 作者: R Rusty Russell

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: NRusty Russell <rusty@rustcorp.com.au>
上级 bb6f1d9a
...@@ -531,7 +531,10 @@ static void lguest_write_cr3(unsigned long cr3) ...@@ -531,7 +531,10 @@ static void lguest_write_cr3(unsigned long cr3)
{ {
lguest_data.pgdir = cr3; lguest_data.pgdir = cr3;
lazy_hcall1(LHCALL_NEW_PGTABLE, 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) static unsigned long lguest_read_cr3(void)
...@@ -703,9 +706,9 @@ static void lguest_set_pmd(pmd_t *pmdp, pmd_t pmdval) ...@@ -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. * to forget all of them. Fortunately, this is very rare.
* *
* ... except in early boot when the kernel sets up the initial pagetables, * ... 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 * which makes booting astonishingly slow: 48 seconds! So we don't even tell
* the Host anything changed until we've done the first page table switch, * the Host anything changed until we've done the first real page table switch,
* which brings boot back to 0.25 seconds. * which brings boot back to 4.3 seconds.
*/ */
static void lguest_set_pte(pte_t *ptep, pte_t pteval) static void lguest_set_pte(pte_t *ptep, pte_t pteval)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册