The recursion guard (bit-31 of kcov_df_seq) prevents reentry when copy_from_kernel_nofault() or other called functions are instrumented with INSTRUMENT_ALL. Without compiler barriers, the guard set/clear can be reordered relative to the function body, making the protection ineffective under optimization. Add barrier() after setting the guard and before clearing it, ensuring the compiler does not move instrumented operations outside the guarded region. Cc: Peter Zijlstra Signed-off-by: Yunseong Kim --- kernel/kcov_dataflow.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/kcov_dataflow.c b/kernel/kcov_dataflow.c index df7e8bf70bfa..5248293280d5 100644 --- a/kernel/kcov_dataflow.c +++ b/kernel/kcov_dataflow.c @@ -86,6 +86,7 @@ kcov_df_write(u64 type_marker, u64 pc, u64 meta, void *ptr, if (t->kcov_df_seq & (1U << 31)) return; t->kcov_df_seq |= (1U << 31); + barrier(); area = (u64 *)t->kcov_df_area; if (!area) @@ -147,6 +148,7 @@ kcov_df_write(u64 type_marker, u64 pc, u64 meta, void *ptr, } } out: + barrier(); t->kcov_df_seq &= ~(1U << 31); } -- 2.43.0