lkml.org 
[lkml]   [2014]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 051/104] sparc64: Fix huge TSB mapping on pre-UltraSPARC-III cpus.
    Date
    From: "David S. Miller" <davem@davemloft.net>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    [ Upstream commit b18eb2d779240631a098626cb6841ee2dd34fda0 ]

    Access to the TSB hash tables during TLB misses requires that there be
    an atomic 128-bit quad load available so that we fetch a matching TAG
    and DATA field at the same time.

    On cpus prior to UltraSPARC-III only virtual address based quad loads
    are available. UltraSPARC-III and later provide physical address
    based variants which are easier to use.

    When we only have virtual address based quad loads available this
    means that we have to lock the TSB into the TLB at a fixed virtual
    address on each cpu when it runs that process. We can't just access
    the PAGE_OFFSET based aliased mapping of these TSBs because we cannot
    take a recursive TLB miss inside of the TLB miss handler without
    risking running out of hardware trap levels (some trap combinations
    can be deep, such as those generated by register window spill and fill
    traps).

    Without huge pages it's working perfectly fine, but when the huge TSB
    got added another chunk of fixed virtual address space was not
    allocated for this second TSB mapping.

    So we were mapping both the 8K and 4MB TSBs to the same exact virtual
    address, causing multiple TLB matches which gives undefined behavior.

    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    arch/sparc/include/asm/pgtable_64.h | 6 ++++--
    arch/sparc/mm/tsb.c | 14 +++++++++++++-
    2 files changed, 17 insertions(+), 3 deletions(-)

    diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
    index cadf36793595..4fd8c7e228f4 100644
    --- a/arch/sparc/include/asm/pgtable_64.h
    +++ b/arch/sparc/include/asm/pgtable_64.h
    @@ -24,7 +24,8 @@

    /* The kernel image occupies 0x4000000 to 0x6000000 (4MB --> 96MB).
    * The page copy blockops can use 0x6000000 to 0x8000000.
    - * The TSB is mapped in the 0x8000000 to 0xa000000 range.
    + * The 8K TSB is mapped in the 0x8000000 to 0x8400000 range.
    + * The 4M TSB is mapped in the 0x8400000 to 0x8800000 range.
    * The PROM resides in an area spanning 0xf0000000 to 0x100000000.
    * The vmalloc area spans 0x100000000 to 0x200000000.
    * Since modules need to be in the lowest 32-bits of the address space,
    @@ -33,7 +34,8 @@
    * 0x400000000.
    */
    #define TLBTEMP_BASE _AC(0x0000000006000000,UL)
    -#define TSBMAP_BASE _AC(0x0000000008000000,UL)
    +#define TSBMAP_8K_BASE _AC(0x0000000008000000,UL)
    +#define TSBMAP_4M_BASE _AC(0x0000000008400000,UL)
    #define MODULES_VADDR _AC(0x0000000010000000,UL)
    #define MODULES_LEN _AC(0x00000000e0000000,UL)
    #define MODULES_END _AC(0x00000000f0000000,UL)
    diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c
    index 2cc3bce5ee91..71d99a6c75a7 100644
    --- a/arch/sparc/mm/tsb.c
    +++ b/arch/sparc/mm/tsb.c
    @@ -133,7 +133,19 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign
    mm->context.tsb_block[tsb_idx].tsb_nentries =
    tsb_bytes / sizeof(struct tsb);

    - base = TSBMAP_BASE;
    + switch (tsb_idx) {
    + case MM_TSB_BASE:
    + base = TSBMAP_8K_BASE;
    + break;
    +#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
    + case MM_TSB_HUGE:
    + base = TSBMAP_4M_BASE;
    + break;
    +#endif
    + default:
    + BUG();
    + }
    +
    tte = pgprot_val(PAGE_KERNEL_LOCKED);
    tsb_paddr = __pa(mm->context.tsb_block[tsb_idx].tsb);
    BUG_ON(tsb_paddr & (tsb_bytes - 1UL));
    --
    2.0.4


    \
     
     \ /
      Last update: 2014-08-20 14:21    [W:4.102 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site