How do I programmatically disable hardware prefetching?

前端 未结 4 1668
别那么骄傲
别那么骄傲 2020-11-27 03:05

I would like to programmatically disable hardware prefetching.

From Optimizing Application Performance on Intel® Core™ Microarchitecture Using Hardware-Implemented

4条回答
  •  清酒与你
    2020-11-27 03:37

    From the Intel reference:
    This instruction must be executed at privilege level 0 or in real-address mode; otherwise, a general protection exception #GP(0) will be generated. Specifying a reserved or unimplemented MSR address in ECX will also cause a general protection exception.

    ...
    The CPUID instruction should be used to determine whether MSRs are supported (EDX[5]=1) before using this instruction.

    So, your fault might be related to a cpu that doesn't support MSRs or using the wrong MSR address.

    There are lots of examples of using the MSRs in the kernel source:

    In the kernel source, for a single cpu, it demonstrates disabling prefetch for the Xeon in arch/i386/kernel/cpu/intel.c, in the function:

    static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 *c)

    The rdmsr function arguments are the msr number, a pointer to the low 32 bit word, and a pointer to the high 32 bit word.
    The wrmsr function arguments are the msr number, the low 32 bit word value, and the high 32 bit word value.

    multi-core or smp systems have to pass the cpu struct in as the first argument:
    void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
    void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);

提交回复
热议问题