22 Jul, 2011

4 commits

  • This patch fixes three typos I've accidentally spotted.

    Signed-off-by: Adrian Knoth
    Signed-off-by: Rusty Russell (one was already fixed)

    Adrian Knoth
     
  • Also removes a long-unused #define and an extraneous semicolon.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • We switch back from using vmcall in 091ebf07a2408f9a56634caa0f86d9360e9af23b
    because it was unreliable under kvm, but I missed one (rarely-used) place.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • The Host used to create some page tables for the Guest to use at the
    top of Guest memory; it would then tell the Guest where this was. In
    particular, it created linear mappings for 0 and 0xC0000000 addresses
    because lguest used to switch to its real page tables quite late in
    boot.

    However, since d50d8fe19 Linux initialized boot page tables in
    head_32.S even before the "are we lguest?" boot jump. So, now we can
    simplify things: the Host pagetable code assumes 1:1 linear mapping
    until it first calls the LHCALL_NEW_PGTABLE hypercall, which we now do
    before we reach C code.

    This also means that the Host doesn't need to know anything about the
    Guest's PAGE_OFFSET. (Non-Linux guests might not even have such a
    thing).

    Signed-off-by: Rusty Russell

    Rusty Russell
     

04 Jan, 2011

1 commit

  • v2.6.36-rc8-54-gb40827f (x86-32, mm: Add an initial page table
    for core bootstrapping) made x86 boot using initial_page_table
    and broke lguest.

    For 2.6.37 we simply cut & paste the initialization code into
    lguest (da32dac10126 "lguest: populate initial_page_table"), now
    we fix it properly by doing that initialization before the
    paravirt jump.

    Signed-off-by: Rusty Russell
    Acked-by: Jeremy Fitzhardinge
    Cc: lguest
    Cc: Linus Torvalds
    Cc: Andrew Morton
    Cc: Peter Zijlstra
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Rusty Russell
     

16 Dec, 2010

1 commit

  • Two x86 patches broke lguest:
    1) v2.6.35-492-g72d7c3b, which changed x86 to use the memblock allocator.

    In lguest, the host places linear page tables at the top of mem, which
    used to be enough to get us up to the swapper_pg_dir page tables. With
    the first patch, the direct mapping tables used that memory:

    Before: kernel direct mapping tables up to 4000000 @ 7000-1a000
    After: kernel direct mapping tables up to 4000000 @ 3fed000-4000000

    I initially fixed this by lying about the amount of memory we had, so
    the kernel wouldn't blatt the lguest boot pagetables (yuk!), but then...

    2) v2.6.36-rc8-54-gb40827f, which made x86 boot use initial_page_table.

    This was initialized in a part of head_32.S which isn't executed by
    lguest; it is then copied into swapper_pg_dir. So we have to initialize
    it; and anyway we switch to it before we blatt the old tables, so that
    fixes the previous damage as well.

    For the moment, I cut & pasted the code into lguest's boot code, but
    next merge window I will merge them.

    Signed-off-by: Rusty Russell
    Cc: Jeremy Fitzhardinge
    Cc: Konrad Rzeszutek Wilk
    To: x86@kernel.org

    Rusty Russell
     

14 Apr, 2010

1 commit

  • This is a partial revert of 4cd8b5e2a159 "lguest: use KVM hypercalls";
    we revert to using (just as questionable but more reliable) int $15 for
    hypercalls. I didn't revert the register mapping, so we still use the
    same calling convention as kvm.

    KVM in more recent incarnations stopped injecting a fault when a guest
    tried to use the VMCALL instruction from ring 1, so lguest under kvm
    fails to make hypercalls. It was nice to share code with our KVM
    cousins, but this was overreach.

    Signed-off-by: Rusty Russell
    Cc: Matias Zabaljauregui
    Cc: Avi Kivity

    Rusty Russell
     

30 Jul, 2009

2 commits

  • Every so often, after code shuffles, I need to go through and unbitrot
    the Lguest Journey (see drivers/lguest/README). Since we now use RCU in
    a simple form in one place I took the opportunity to expand that explanation.

    Signed-off-by: Rusty Russell
    Cc: Ingo Molnar
    Cc: Paul McKenney

    Rusty Russell
     
  • I don't really notice it (except to begrudge the extra vertical
    space), but Ingo does. And he pointed out that one excuse of lguest
    is as a teaching tool, it should set a good example.

    Signed-off-by: Rusty Russell
    Cc: Ingo Molnar

    Rusty Russell
     

12 Jun, 2009

2 commits

  • The downside of the last patch which made restore_flags and irq_enable
    check interrupts is that they are now too big to be patched directly
    into the callsites, so the C versions are always used.

    But the C versions go via PV_CALLEE_SAVE_REGS_THUNK which saves all
    the registers. In fact, we don't need any registers in the fast path,
    so we can do better than this if we actually code them in assembler.

    The results are in the noise, but since it's about the same amount of
    code, it's worth applying.

    1GB Guest->Host: input(suppressed),output(suppressed)
    Before:
    Seconds: 0:16.53
    Packets: 377268,753673
    Interrupts: 22461,24297
    Notifications: 1(5245),21303(732370)
    Net IRQs triggered: 377023(245),42578(711095)

    After:
    Seconds: 0:16.48
    Packets: 377289,753673
    Interrupts: 22281,24465
    Notifications: 1(5245),21296(732377)
    Net IRQs triggered: 377060(229),42564(711109)

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • lguest never checked for pending interrupts when enabling interrupts, and
    things still worked. However, it makes a significant difference to TCP
    performance, so it's time we fixed it by introducing a pending_irq flag
    and checking it on irq_restore and irq_enable.

    These two routines are now too big to patch into the 8/10 bytes
    patch space, so we drop that code.

    Note: The high latency on interrupt delivery had a very curious
    effect: once everything else was optimized, networking without GSO was
    faster than networking with GSO, since more interrupts were sent and
    hence a greater chance of one getting through to the Guest!

    Note2: (Almost) Closing the same loophole for iret doesn't have any
    measurable effect, so I'm leaving that patch for the moment.

    Before:
    1GB tcpblast Guest->Host: 30.7 seconds
    1GB tcpblast Guest->Host (no GSO): 76.0 seconds

    After:
    1GB tcpblast Guest->Host: 6.8 seconds
    1GB tcpblast Guest->Host (no GSO): 27.8 seconds

    Signed-off-by: Rusty Russell

    Rusty Russell
     

30 Mar, 2009

1 commit


30 Dec, 2008

1 commit


28 Mar, 2008

1 commit


25 Oct, 2007

1 commit


23 Oct, 2007

3 commits

  • Version 2.07 of the boot protocol uses 0x23C for the hardware_subarch
    field, that for lguest is "1". This allows us to use the standard
    boot entry point rather than the "GenuineLguest" string hack.

    The standard entry point also clears the BSS and copies the boot parameters
    and commandline for us, saving more code.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • 1) This allows us to get alot closer to booting bzImages.

    2) It means we don't have to know page_offset.

    3) The Guest needs to modify the boot pagetables to create the
    PAGE_OFFSET mapping before jumping to C code.

    4) guest_pa() walks the page tables rather than using page_offset.

    5) We don't use page_offset to figure out whether to emulate: it was
    always kinda quesationable, and won't work for instructions done
    before remapping (bzImage unpacking in particular).

    6) We still want the kernel address for tlb flushing: have the initial
    hypercall give us that, too.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • Lguest has two sides: host support (to launch guests) and guest
    support (replacement boot path and paravirt_ops). This moves the
    guest side to arch/x86/lguest where it's closer to related code.

    Signed-off-by: Rusty Russell
    Cc: Andi Kleen

    Rusty Russell