Sunday 2 June 2019

linux - How do I programmatically disable hardware prefetching?



I would like to programmatically disable hardware prefetching.



From Optimizing Application Performance on Intel® Core™ Microarchitecture Using Hardware-Implemented Prefetchers and
How to Choose between Hardware and Software Prefetch on 32-Bit Intel® Architecture,
I need to update the MSR to disable hardware prefetching.



Here is a relevant snippet:





"DPL Prefetch and L2 Streaming Prefetch settings can also be changed programmatically
by writing a device driver utility for changing the bits in the IA32_MISC_ENABLE
register – MSR 0x1A0. Such a utility offers the ability to enable or disable prefetch
mechanisms without requiring any server downtime.




The table below shows the bits in the IA32_MISC_ENABLE MSR that have to be changed in order to control the DPL and L2 Streaming Prefetch:



Prefetcher Type MSR (0x1A0) Bit Value 

DPL (Hardware Prefetch) Bit 9 0 = Enable 1 = Disable
L2 Streamer (Adjacent Cache Line Prefetch) Bit 19 0 = Enable 1 = Disable"


I tried using http://etallen.com/msr.html but this did not work.
I also tried using wrmsr in asm/msr.h directly but that segfaults.
I tried doing this in a kernel module ... and killed the machine.



BTW - I am using kernel 2.6.18-92.el5 and it has MSR linked in the kernel:




$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...

Answer



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);


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...