Hi Peter, Thank you for the patch! Yet something to improve: [auto build test ERROR on sparc/master] [cannot apply to mmotm/master sparc-next/master linus/master linux/master v5.8-rc1 next-20200616] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Peter-Xu/mm-Page-fault-accounting-cleanups/20200616-062640 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc.git master config: arm64-allyesconfig (attached as .config) compiler: aarch64-linux-gcc (GCC) 9.3.0 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 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@xxxxxxxxx> All errors (new ones prefixed by >>, old ones prefixed by <<): arch/arm64/mm/fault.c: In function 'do_page_fault': >> arch/arm64/mm/fault.c:538:38: error: 'address' undeclared (first use in this function); did you mean 'addr'? 538 | mm_fault_accounting(current, regs, address, major); | ^~~~~~~ | addr arch/arm64/mm/fault.c:538:38: note: each undeclared identifier is reported only once for each function it appears in arch/arm64/mm/fault.c: At top level: arch/arm64/mm/fault.c:725:6: warning: no previous prototype for 'do_el0_irq_bp_hardening' [-Wmissing-prototypes] 725 | void do_el0_irq_bp_hardening(void) | ^~~~~~~~~~~~~~~~~~~~~~~ vim +538 arch/arm64/mm/fault.c 441 442 static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, 443 struct pt_regs *regs) 444 { 445 const struct fault_info *inf; 446 struct mm_struct *mm = current->mm; 447 vm_fault_t fault, major = 0; 448 unsigned long vm_flags = VM_ACCESS_FLAGS; 449 unsigned int mm_flags = FAULT_FLAG_DEFAULT; 450 451 if (kprobe_page_fault(regs, esr)) 452 return 0; 453 454 /* 455 * If we're in an interrupt or have no user context, we must not take 456 * the fault. 457 */ 458 if (faulthandler_disabled() || !mm) 459 goto no_context; 460 461 if (user_mode(regs)) 462 mm_flags |= FAULT_FLAG_USER; 463 464 if (is_el0_instruction_abort(esr)) { 465 vm_flags = VM_EXEC; 466 mm_flags |= FAULT_FLAG_INSTRUCTION; 467 } else if (is_write_abort(esr)) { 468 vm_flags = VM_WRITE; 469 mm_flags |= FAULT_FLAG_WRITE; 470 } 471 472 if (is_ttbr0_addr(addr) && is_el1_permission_fault(addr, esr, regs)) { 473 /* regs->orig_addr_limit may be 0 if we entered from EL0 */ 474 if (regs->orig_addr_limit == KERNEL_DS) 475 die_kernel_fault("access to user memory with fs=KERNEL_DS", 476 addr, esr, regs); 477 478 if (is_el1_instruction_abort(esr)) 479 die_kernel_fault("execution of user memory", 480 addr, esr, regs); 481 482 if (!search_exception_tables(regs->pc)) 483 die_kernel_fault("access to user memory outside uaccess routines", 484 addr, esr, regs); 485 } 486 487 /* 488 * As per x86, we may deadlock here. However, since the kernel only 489 * validly references user space from well defined areas of the code, 490 * we can bug out early if this is from code which shouldn't. 491 */ 492 if (!down_read_trylock(&mm->mmap_sem)) { 493 if (!user_mode(regs) && !search_exception_tables(regs->pc)) 494 goto no_context; 495 retry: 496 down_read(&mm->mmap_sem); 497 } else { 498 /* 499 * The above down_read_trylock() might have succeeded in which 500 * case, we'll have missed the might_sleep() from down_read(). 501 */ 502 might_sleep(); 503 #ifdef CONFIG_DEBUG_VM 504 if (!user_mode(regs) && !search_exception_tables(regs->pc)) { 505 up_read(&mm->mmap_sem); 506 goto no_context; 507 } 508 #endif 509 } 510 511 fault = __do_page_fault(mm, addr, mm_flags, vm_flags); 512 major |= fault & VM_FAULT_MAJOR; 513 514 /* Quick path to respond to signals */ 515 if (fault_signal_pending(fault, regs)) { 516 if (!user_mode(regs)) 517 goto no_context; 518 return 0; 519 } 520 521 if (fault & VM_FAULT_RETRY) { 522 if (mm_flags & FAULT_FLAG_ALLOW_RETRY) { 523 mm_flags |= FAULT_FLAG_TRIED; 524 goto retry; 525 } 526 } 527 up_read(&mm->mmap_sem); 528 529 /* 530 * Handle the "normal" (no error) case first. 531 */ 532 if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | 533 VM_FAULT_BADACCESS)))) { 534 /* 535 * Major/minor page fault accounting is only done 536 * once. 537 */ > 538 mm_fault_accounting(current, regs, address, major); 539 return 0; 540 } 541 542 /* 543 * If we are in kernel mode at this point, we have no context to 544 * handle this fault with. 545 */ 546 if (!user_mode(regs)) 547 goto no_context; 548 549 if (fault & VM_FAULT_OOM) { 550 /* 551 * We ran out of memory, call the OOM killer, and return to 552 * userspace (which will retry the fault, or kill us if we got 553 * oom-killed). 554 */ 555 pagefault_out_of_memory(); 556 return 0; 557 } 558 559 inf = esr_to_fault_info(esr); 560 set_thread_esr(addr, esr); 561 if (fault & VM_FAULT_SIGBUS) { 562 /* 563 * We had some memory, but were unable to successfully fix up 564 * this page fault. 565 */ 566 arm64_force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)addr, 567 inf->name); 568 } else if (fault & (VM_FAULT_HWPOISON_LARGE | VM_FAULT_HWPOISON)) { 569 unsigned int lsb; 570 571 lsb = PAGE_SHIFT; 572 if (fault & VM_FAULT_HWPOISON_LARGE) 573 lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault)); 574 575 arm64_force_sig_mceerr(BUS_MCEERR_AR, (void __user *)addr, lsb, 576 inf->name); 577 } else { 578 /* 579 * Something tried to access memory that isn't in our memory 580 * map. 581 */ 582 arm64_force_sig_fault(SIGSEGV, 583 fault == VM_FAULT_BADACCESS ? SEGV_ACCERR : SEGV_MAPERR, 584 (void __user *)addr, 585 inf->name); 586 } 587 588 return 0; 589 590 no_context: 591 __do_kernel_fault(addr, esr, regs); 592 return 0; 593 } 594 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip