lkml.org 
[lkml]   [2011]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/3] x86/paravirt: Use pte_val instead of pte_flags on CPA pageattr_test
    Date
    For details refer to patch "x86/paravirt: Use pte_attrs instead of
    pte_flags on CPA/set_p.._wb/wc operations." which explains that
    some pages have the _PAGE_PWT bit set in the _PAGE_PSE field
    when running under Xen.

    When pageattr_test is running it uses pte_flags to check whether
    it succedded in setting _PAGE_UNUSED1 bit, but also whether the
    page had _PAGE_PSE. This can happen when one of the randomly selected
    pages to be tested is a page that has been set to be _PAGE_WC
    as under Xen, that field is under _PAGE_PSE. Since the 'pte_huge'
    call is using the pte_flags(x) macro, which extracts the "raw" contents
    of the PTE, the translation of _PAGE_PSE -> _PAGE_PWT does not happen
    and we incorrectly identify the PTE as bad.

    Using the 'pte_val' instead of 'pte_flags' fixes the problem and
    this patch does that.

    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    CC: stable@kernel.org
    ---
    arch/x86/mm/pageattr-test.c | 6 +++++-
    1 files changed, 5 insertions(+), 1 deletions(-)

    diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c
    index b008656..da853e3 100644
    --- a/arch/x86/mm/pageattr-test.c
    +++ b/arch/x86/mm/pageattr-test.c
    @@ -38,6 +38,10 @@ static int pte_testbit(pte_t pte)
    {
    return pte_flags(pte) & _PAGE_UNUSED1;
    }
    +static int pte_testhuge(pte_t pte)
    +{
    + return pte_val(pte) & _PAGE_PSE;
    +}

    struct split_state {
    long lpg, gpg, spg, exec;
    @@ -180,7 +184,7 @@ static int pageattr_test(void)
    }

    pte = lookup_address(addr[i], &level);
    - if (!pte || !pte_testbit(*pte) || pte_huge(*pte)) {
    + if (!pte || !pte_testbit(*pte) || pte_testhuge(*pte)) {
    printk(KERN_ERR "CPA %lx: bad pte %Lx\n", addr[i],
    pte ? (u64)pte_val(*pte) : 0ULL);
    failed++;
    --
    1.7.7.1


    \
     
     \ /
      Last update: 2011-11-08 22:19    [W:0.021 / U:1.524 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site