powerpc/code-patching: Perform hwsync in __patch_instruction() in case of failure
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Sat, 7 Oct 2023 10:46:19 +0000 (12:46 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 20 Oct 2023 12:19:13 +0000 (23:19 +1100)
Commit c28c15b6d28a ("powerpc/code-patching: Use temporary mm for
Radix MMU") added a hwsync for when __patch_instruction() fails,
we results in a quite odd unbalanced logic.

Instead of calling mb() when __patch_instruction() returns an error,
call mb() in the __patch_instruction()'s error path directly.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/e88b154eaf2efd9ff177d472d3411dcdec8ff4f5.1696675567.git.christophe.leroy@csgroup.eu
arch/powerpc/lib/code-patching.c

index b00112d7ad467d30712d168538a418bac4d5c60c..7a47a871e6b8eb517bce27adec42d914673f676f 100644 (file)
@@ -38,6 +38,7 @@ static int __patch_instruction(u32 *exec_addr, ppc_inst_t instr, u32 *patch_addr
        return 0;
 
 failed:
+       mb();  /* sync */
        return -EPERM;
 }
 
@@ -309,10 +310,6 @@ static int __do_patch_instruction_mm(u32 *addr, ppc_inst_t instr)
 
        err = __patch_instruction(addr, instr, patch_addr);
 
-       /* hwsync performed by __patch_instruction (sync) if successful */
-       if (err)
-               mb();  /* sync */
-
        /* context synchronisation performed by __patch_instruction (isync or exception) */
        stop_using_temp_mm(patching_mm, orig_mm);