The current asm statement in __patch_instruction() for the cache flushes doesn't have a "volatile" statement and no memory clobber. That means gcc can potentially move it around (or move the store done by put_user past the flush).
Add both to ensure gcc doesn't play games. Found by code inspection, no actual bug reported. Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org> --- --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c @@ -32,8 +32,9 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, if (err) return err; - asm ("dcbst 0, %0; sync; icbi 0,%1; sync; isync" :: "r" (patch_addr), - "r" (exec_addr)); + asm volatile("dcbst 0, %0; sync; icbi 0,%1; sync; isync" + :: "r" (patch_addr), "r" (exec_addr) + : "memory"); return 0; }