lkml.org 
[lkml]   [2009]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 12/36] x86/cpa: make sure cpa is safe to call in lazy mmu mode
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    From: Jeremy Fitzhardinge <jeremy@goop.org>

    commit 4f06b0436b2ddbd3b67b10e77098a6862787b3eb upstream.

    Impact: fix race leading to crash under KVM and Xen

    The CPA code may be called while we're in lazy mmu update mode - for
    example, when using DEBUG_PAGE_ALLOC and doing a slab allocation
    in an interrupt handler which interrupted a lazy mmu update. In this
    case, the in-memory pagetable state may be out of date due to pending
    queued updates. We need to flush any pending updates before inspecting
    the page table. Similarly, we must explicitly flush any modifications
    CPA may have made (which comes down to flushing queued operations when
    flushing the TLB).

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Acked-by: Marcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/mm/pageattr.c | 14 ++++++++++++++
    1 file changed, 14 insertions(+)
    --- a/arch/x86/mm/pageattr.c
    +++ b/arch/x86/mm/pageattr.c
    @@ -619,6 +619,13 @@ static int __change_page_attr(struct cpa
    unsigned int level;
    pte_t *kpte, old_pte;

    + /*
    + * If we're called with lazy mmu updates enabled, the
    + * in-memory pte state may be stale. Flush pending updates to
    + * bring them up to date.
    + */
    + arch_flush_lazy_mmu_mode();
    +
    repeat:
    kpte = lookup_address(address, &level);
    if (!kpte)
    @@ -836,6 +843,13 @@ static int change_page_attr_set_clr(unsi
    else
    cpa_flush_all(cache);

    + /*
    + * If we've been called with lazy mmu updates enabled, then
    + * make sure that everything gets flushed out before we
    + * return.
    + */
    + arch_flush_lazy_mmu_mode();
    +
    out:
    cpa_fill_pool(NULL);



    \
     
     \ /
      Last update: 2009-02-18 23:41    [W:1.543 / U:0.008 seconds]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean