Hi Michael, I love your patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on linus/master v5.12 next-20210505] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Michael-Ellerman/powerpc-64s-Fix-crashes-when-toggling-stf-barrier/20210504-214718 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-randconfig-r022-20210505 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 8f5a2a5836cc8e4c1def2bdeb022e7b496623439) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc cross compiling tool for clang build # apt-get install binutils-powerpc-linux-gnu # https://github.com/0day-ci/linux/commit/416c4a71342ea7c46c85d8c415489f75635785f1 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Michael-Ellerman/powerpc-64s-Fix-crashes-when-toggling-stf-barrier/20210504-214718 git checkout 416c4a71342ea7c46c85d8c415489f75635785f1 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=powerpc If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All warnings (new ones prefixed by >>): arch/powerpc/lib/feature-fixups.c:233:32: warning: cast to smaller integer type 'enum stf_barrier_type' from 'void *' [-Wvoid-pointer-to-enum-cast] enum stf_barrier_type types = (enum stf_barrier_type)data; ^~~~~~~~~~~~~~~~~~~~~~~~~~~ >> arch/powerpc/lib/feature-fixups.c:304:30: warning: cast to smaller integer type 'enum l1d_flush_type' from 'void *' [-Wvoid-pointer-to-enum-cast] enum l1d_flush_type types = (enum l1d_flush_type)data; ^~~~~~~~~~~~~~~~~~~~~~~~~ 2 warnings generated. vim +304 arch/powerpc/lib/feature-fixups.c 230 231 static int __do_stf_barrier_fixups(void *data) 232 { > 233 enum stf_barrier_type types = (enum stf_barrier_type)data; 234 235 do_stf_entry_barrier_fixups(types); 236 do_stf_exit_barrier_fixups(types); 237 238 return 0; 239 } 240 241 void do_stf_barrier_fixups(enum stf_barrier_type types) 242 { 243 /* 244 * The call to the fallback entry flush, and the fallback/sync-ori exit 245 * flush can not be safely patched in/out while other CPUs are executing 246 * them. So call __do_stf_barrier_fixups() on one CPU while all other CPUs 247 * spin in the stop machine core with interrupts hard disabled. 248 */ 249 stop_machine_cpuslocked(__do_stf_barrier_fixups, (void *)types, NULL); 250 } 251 252 void do_uaccess_flush_fixups(enum l1d_flush_type types) 253 { 254 unsigned int instrs[4], *dest; 255 long *start, *end; 256 int i; 257 258 start = PTRRELOC(&__start___uaccess_flush_fixup); 259 end = PTRRELOC(&__stop___uaccess_flush_fixup); 260 261 instrs[0] = 0x60000000; /* nop */ 262 instrs[1] = 0x60000000; /* nop */ 263 instrs[2] = 0x60000000; /* nop */ 264 instrs[3] = 0x4e800020; /* blr */ 265 266 i = 0; 267 if (types == L1D_FLUSH_FALLBACK) { 268 instrs[3] = 0x60000000; /* nop */ 269 /* fallthrough to fallback flush */ 270 } 271 272 if (types & L1D_FLUSH_ORI) { 273 instrs[i++] = 0x63ff0000; /* ori 31,31,0 speculation barrier */ 274 instrs[i++] = 0x63de0000; /* ori 30,30,0 L1d flush*/ 275 } 276 277 if (types & L1D_FLUSH_MTTRIG) 278 instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */ 279 280 for (i = 0; start < end; start++, i++) { 281 dest = (void *)start + *start; 282 283 pr_devel("patching dest %lx\n", (unsigned long)dest); 284 285 patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0])); 286 287 patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1])); 288 patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2])); 289 patch_instruction((struct ppc_inst *)(dest + 3), ppc_inst(instrs[3])); 290 } 291 292 printk(KERN_DEBUG "uaccess-flush: patched %d locations (%s flush)\n", i, 293 (types == L1D_FLUSH_NONE) ? "no" : 294 (types == L1D_FLUSH_FALLBACK) ? "fallback displacement" : 295 (types & L1D_FLUSH_ORI) ? (types & L1D_FLUSH_MTTRIG) 296 ? "ori+mttrig type" 297 : "ori type" : 298 (types & L1D_FLUSH_MTTRIG) ? "mttrig type" 299 : "unknown"); 300 } 301 302 static int __do_entry_flush_fixups(void *data) 303 { > 304 enum l1d_flush_type types = (enum l1d_flush_type)data; 305 unsigned int instrs[3], *dest; 306 long *start, *end; 307 int i; 308 309 instrs[0] = 0x60000000; /* nop */ 310 instrs[1] = 0x60000000; /* nop */ 311 instrs[2] = 0x60000000; /* nop */ 312 313 i = 0; 314 if (types == L1D_FLUSH_FALLBACK) { 315 instrs[i++] = 0x7d4802a6; /* mflr r10 */ 316 instrs[i++] = 0x60000000; /* branch patched below */ 317 instrs[i++] = 0x7d4803a6; /* mtlr r10 */ 318 } 319 320 if (types & L1D_FLUSH_ORI) { 321 instrs[i++] = 0x63ff0000; /* ori 31,31,0 speculation barrier */ 322 instrs[i++] = 0x63de0000; /* ori 30,30,0 L1d flush*/ 323 } 324 325 if (types & L1D_FLUSH_MTTRIG) 326 instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */ 327 328 start = PTRRELOC(&__start___entry_flush_fixup); 329 end = PTRRELOC(&__stop___entry_flush_fixup); 330 for (i = 0; start < end; start++, i++) { 331 dest = (void *)start + *start; 332 333 pr_devel("patching dest %lx\n", (unsigned long)dest); 334 335 patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0])); 336 337 if (types == L1D_FLUSH_FALLBACK) 338 patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&entry_flush_fallback, 339 BRANCH_SET_LINK); 340 else 341 patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1])); 342 343 patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2])); 344 } 345 346 start = PTRRELOC(&__start___scv_entry_flush_fixup); 347 end = PTRRELOC(&__stop___scv_entry_flush_fixup); 348 for (; start < end; start++, i++) { 349 dest = (void *)start + *start; 350 351 pr_devel("patching dest %lx\n", (unsigned long)dest); 352 353 patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0])); 354 355 if (types == L1D_FLUSH_FALLBACK) 356 patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&scv_entry_flush_fallback, 357 BRANCH_SET_LINK); 358 else 359 patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1])); 360 361 patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2])); 362 } 363 364 365 printk(KERN_DEBUG "entry-flush: patched %d locations (%s flush)\n", i, 366 (types == L1D_FLUSH_NONE) ? "no" : 367 (types == L1D_FLUSH_FALLBACK) ? "fallback displacement" : 368 (types & L1D_FLUSH_ORI) ? (types & L1D_FLUSH_MTTRIG) 369 ? "ori+mttrig type" 370 : "ori type" : 371 (types & L1D_FLUSH_MTTRIG) ? "mttrig type" 372 : "unknown"); 373 374 return 0; 375 } 376 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org