lkml.org 
[lkml]   [2002]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] M386 flush_one_tlb invlpg
    On Tue, 27 Aug 2002, Linus Torvalds wrote:
    >
    > This test is senseless, in my opinion:
    >
    > > + if (cpu_has_pge) \
    > > + __flush_tlb_single(addr); \
    >
    > The test _should_ be for something like
    >
    > if (cpu_has_invlpg)
    > __flush_tlb_single(addr);
    >
    > since we want to use the invlpg instruction regardless of any PGE issues

    New patch below defines cpu_has_invlpg as (boot_cpu_data.x86 > 3).
    But I do feel safer with that original cpu_has_pge test, which was
    using a decent capability flag, and only changed behaviour of the
    CONFIG_M386 __flush_tlb_one when it's necessary.

    Isn't CONFIG_M386 about maximum safe applicability, rather than speed?
    Am I imagining it, or were there a few i386 + i486 SMP machines built?
    Or might there be some i486 clone which didn't really implement invlpg,
    which could be used with a CONFIG_M386 kernel before this change,
    but not after? But perhaps I'm just dreaming up excuses for my
    senselessness - your call.

    Hugh

    CONFIG_M386 kernel running on PPro+ processor with X86_FEATURE_PGE may
    set _PAGE_GLOBAL bit: then __flush_tlb_one must use invlpg instruction.

    --- 2.5.32/include/asm-i386/tlbflush.h Tue May 28 21:41:36 2002
    +++ linux/include/asm-i386/tlbflush.h Wed Aug 28 20:48:44 2002
    @@ -45,11 +45,21 @@
    __flush_tlb(); \
    } while (0)

    -#ifndef CONFIG_X86_INVLPG
    -#define __flush_tlb_one(addr) __flush_tlb()
    +#define cpu_has_invlpg (boot_cpu_data.x86 > 3)
    +
    +#define __flush_tlb_single(addr) \
    + __asm__ __volatile__("invlpg %0": :"m" (*(char *) addr))
    +
    +#ifdef CONFIG_X86_INVLPG
    +# define __flush_tlb_one(addr) __flush_tlb_single(addr)
    #else
    -#define __flush_tlb_one(addr) \
    -__asm__ __volatile__("invlpg %0": :"m" (*(char *) addr))
    +# define __flush_tlb_one(addr) \
    + do { \
    + if (cpu_has_invlpg) \
    + __flush_tlb_single(addr); \
    + else \
    + __flush_tlb(); \
    + } while (0)
    #endif

    /*
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:28    [W:0.026 / U:1.148 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site