CC: [email protected] CC: [email protected] TO: Michel Lespinasse <[email protected]> CC: Andrew Morton <[email protected]> CC: Linux Memory Management List <[email protected]> CC: Vlastimil Babka <[email protected]> CC: Davidlohr Bueso <[email protected]> CC: Daniel Jordan <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: e8de4575cf7601917c2eae9f8ee1a8ee3d9be2a7 commit: da1c55f1b272f4bd54671d459b39ea7b54944ef9 mmap locking API: rename mmap_sem to mmap_lock date: 2 days ago :::::: branch date: 63 minutes ago :::::: commit date: 2 days ago config: s390-randconfig-m031-20200611 (attached as .config) compiler: s390-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> New smatch warnings: arch/s390/mm/fault.c:517 do_exception() error: double locked 'mm->mmap_lock' (orig line 436) Old smatch warnings: arch/s390/include/asm/uaccess.h:143 __get_user_fn() error: uninitialized symbol 'rc'. # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=da1c55f1b272f4bd54671d459b39ea7b54944ef9 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git remote update linus git checkout da1c55f1b272f4bd54671d459b39ea7b54944ef9 vim +517 arch/s390/mm/fault.c 50d7280d430484 Martin Schwidefsky 2009-12-07 372 ^1da177e4c3f41 Linus Torvalds 2005-04-16 373 /* ^1da177e4c3f41 Linus Torvalds 2005-04-16 374 * This routine handles page faults. It determines the address, ^1da177e4c3f41 Linus Torvalds 2005-04-16 375 * and the problem, and then passes it off to one of the appropriate ^1da177e4c3f41 Linus Torvalds 2005-04-16 376 * routines. ^1da177e4c3f41 Linus Torvalds 2005-04-16 377 * 50d7280d430484 Martin Schwidefsky 2009-12-07 378 * interruption code (int_code): ^1da177e4c3f41 Linus Torvalds 2005-04-16 379 * 04 Protection -> Write-Protection (suprression) ^1da177e4c3f41 Linus Torvalds 2005-04-16 380 * 10 Segment translation -> Not present (nullification) ^1da177e4c3f41 Linus Torvalds 2005-04-16 381 * 11 Page translation -> Not present (nullification) ^1da177e4c3f41 Linus Torvalds 2005-04-16 382 * 3b Region third trans. -> Not present (nullification) ^1da177e4c3f41 Linus Torvalds 2005-04-16 383 */ 50a7ca3c6fc869 Souptick Joarder 2018-08-17 384 static inline vm_fault_t do_exception(struct pt_regs *regs, int access) ^1da177e4c3f41 Linus Torvalds 2005-04-16 385 { 24eb3a824c4f3c Dominik Dingel 2013-06-17 386 struct gmap *gmap; ^1da177e4c3f41 Linus Torvalds 2005-04-16 387 struct task_struct *tsk; ^1da177e4c3f41 Linus Torvalds 2005-04-16 388 struct mm_struct *mm; ^1da177e4c3f41 Linus Torvalds 2005-04-16 389 struct vm_area_struct *vma; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 390 enum fault_type type; aa33c8cbbae2eb Martin Schwidefsky 2011-12-27 391 unsigned long trans_exc_code; ^1da177e4c3f41 Linus Torvalds 2005-04-16 392 unsigned long address; 33ce614029576b Heiko Carstens 2011-05-26 393 unsigned int flags; 50a7ca3c6fc869 Souptick Joarder 2018-08-17 394 vm_fault_t fault; ^1da177e4c3f41 Linus Torvalds 2005-04-16 395 39efd4ec9a2967 Martin Schwidefsky 2012-11-21 396 tsk = current; 39efd4ec9a2967 Martin Schwidefsky 2012-11-21 397 /* 39efd4ec9a2967 Martin Schwidefsky 2012-11-21 398 * The instruction that caused the program check has 39efd4ec9a2967 Martin Schwidefsky 2012-11-21 399 * been nullified. Don't signal single step via SIGTRAP. 39efd4ec9a2967 Martin Schwidefsky 2012-11-21 400 */ d3a73acbc26a4a Martin Schwidefsky 2014-04-15 401 clear_pt_regs_flag(regs, PIF_PER_TRAP); 39efd4ec9a2967 Martin Schwidefsky 2012-11-21 402 b98cca444d287a Anshuman Khandual 2019-07-16 403 if (kprobe_page_fault(regs, 14)) 50d7280d430484 Martin Schwidefsky 2009-12-07 404 return 0; 4ba069b802c29e Michael Grundy 2006-09-20 405 10c1031f706bbe Martin Schwidefsky 2007-04-27 406 mm = tsk->mm; aa33c8cbbae2eb Martin Schwidefsky 2011-12-27 407 trans_exc_code = regs->int_parm_long; ^1da177e4c3f41 Linus Torvalds 2005-04-16 408 ^1da177e4c3f41 Linus Torvalds 2005-04-16 409 /* ^1da177e4c3f41 Linus Torvalds 2005-04-16 410 * Verify that the fault happened in user space, that ^1da177e4c3f41 Linus Torvalds 2005-04-16 411 * we are not in an interrupt and that there is a ^1da177e4c3f41 Linus Torvalds 2005-04-16 412 * user context. ^1da177e4c3f41 Linus Torvalds 2005-04-16 413 */ 50d7280d430484 Martin Schwidefsky 2009-12-07 414 fault = VM_FAULT_BADCONTEXT; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 415 type = get_fault_type(regs); 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 416 switch (type) { 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 417 case KERNEL_FAULT: 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 418 goto out; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 419 case VDSO_FAULT: 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 420 fault = VM_FAULT_BADMAP; 50d7280d430484 Martin Schwidefsky 2009-12-07 421 goto out; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 422 case USER_FAULT: 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 423 case GMAP_FAULT: 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 424 if (faulthandler_disabled() || !mm) 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 425 goto out; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 426 break; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 427 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 428 61365e132ef987 Martin Schwidefsky 2009-12-07 429 address = trans_exc_code & __FAIL_ADDR_MASK; a8b0ca17b80e92 Peter Zijlstra 2011-06-27 430 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); dde1607248328c Peter Xu 2020-04-01 431 flags = FAULT_FLAG_DEFAULT; 759496ba6407c6 Johannes Weiner 2013-09-12 432 if (user_mode(regs)) 759496ba6407c6 Johannes Weiner 2013-09-12 433 flags |= FAULT_FLAG_USER; 33ce614029576b Heiko Carstens 2011-05-26 434 if (access == VM_WRITE || (trans_exc_code & store_indication) == 0x400) 33ce614029576b Heiko Carstens 2011-05-26 435 flags |= FAULT_FLAG_WRITE; d8ed45c5dcd455 Michel Lespinasse 2020-06-08 @436 mmap_read_lock(mm); ^1da177e4c3f41 Linus Torvalds 2005-04-16 437 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 438 gmap = NULL; 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 439 if (IS_ENABLED(CONFIG_PGSTE) && type == GMAP_FAULT) { 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 440 gmap = (struct gmap *) S390_lowcore.gmap; 527e30b41d8b86 Martin Schwidefsky 2014-04-30 441 current->thread.gmap_addr = address; 4be130a08420d6 Martin Schwidefsky 2016-03-08 442 current->thread.gmap_write_flag = !!(flags & FAULT_FLAG_WRITE); 4a494439247318 David Hildenbrand 2016-03-08 443 current->thread.gmap_int_code = regs->int_code & 0xffff; 527e30b41d8b86 Martin Schwidefsky 2014-04-30 444 address = __gmap_translate(gmap, address); e5992f2e6c3829 Martin Schwidefsky 2011-07-24 445 if (address == -EFAULT) { e5992f2e6c3829 Martin Schwidefsky 2011-07-24 446 fault = VM_FAULT_BADMAP; e5992f2e6c3829 Martin Schwidefsky 2011-07-24 447 goto out_up; e5992f2e6c3829 Martin Schwidefsky 2011-07-24 448 } 24eb3a824c4f3c Dominik Dingel 2013-06-17 449 if (gmap->pfault_enabled) 24eb3a824c4f3c Dominik Dingel 2013-06-17 450 flags |= FAULT_FLAG_RETRY_NOWAIT; e5992f2e6c3829 Martin Schwidefsky 2011-07-24 451 } e5992f2e6c3829 Martin Schwidefsky 2011-07-24 452 e5992f2e6c3829 Martin Schwidefsky 2011-07-24 453 retry: 50d7280d430484 Martin Schwidefsky 2009-12-07 454 fault = VM_FAULT_BADMAP; ^1da177e4c3f41 Linus Torvalds 2005-04-16 455 vma = find_vma(mm, address); ^1da177e4c3f41 Linus Torvalds 2005-04-16 456 if (!vma) 50d7280d430484 Martin Schwidefsky 2009-12-07 457 goto out_up; c1821c2e9711ad Gerald Schaefer 2007-02-05 458 50d7280d430484 Martin Schwidefsky 2009-12-07 459 if (unlikely(vma->vm_start > address)) { ^1da177e4c3f41 Linus Torvalds 2005-04-16 460 if (!(vma->vm_flags & VM_GROWSDOWN)) 50d7280d430484 Martin Schwidefsky 2009-12-07 461 goto out_up; ^1da177e4c3f41 Linus Torvalds 2005-04-16 462 if (expand_stack(vma, address)) 50d7280d430484 Martin Schwidefsky 2009-12-07 463 goto out_up; 50d7280d430484 Martin Schwidefsky 2009-12-07 464 } 50d7280d430484 Martin Schwidefsky 2009-12-07 465 ^1da177e4c3f41 Linus Torvalds 2005-04-16 466 /* ^1da177e4c3f41 Linus Torvalds 2005-04-16 467 * Ok, we have a good vm_area for this memory access, so ^1da177e4c3f41 Linus Torvalds 2005-04-16 468 * we can handle it.. ^1da177e4c3f41 Linus Torvalds 2005-04-16 469 */ 50d7280d430484 Martin Schwidefsky 2009-12-07 470 fault = VM_FAULT_BADACCESS; 1ab947de293f43 Martin Schwidefsky 2009-12-07 471 if (unlikely(!(vma->vm_flags & access))) 50d7280d430484 Martin Schwidefsky 2009-12-07 472 goto out_up; ^1da177e4c3f41 Linus Torvalds 2005-04-16 473 53492b1de46a75 Gerald Schaefer 2008-04-30 474 if (is_vm_hugetlb_page(vma)) 53492b1de46a75 Gerald Schaefer 2008-04-30 475 address &= HPAGE_MASK; ^1da177e4c3f41 Linus Torvalds 2005-04-16 476 /* ^1da177e4c3f41 Linus Torvalds 2005-04-16 477 * If for any reason at all we couldn't handle the fault, ^1da177e4c3f41 Linus Torvalds 2005-04-16 478 * make sure we exit gracefully rather than endlessly redo ^1da177e4c3f41 Linus Torvalds 2005-04-16 479 * the fault. ^1da177e4c3f41 Linus Torvalds 2005-04-16 480 */ dcddffd41d3f1d Kirill A. Shutemov 2016-07-26 481 fault = handle_mm_fault(vma, address, flags); 4ef873226ceb9c Peter Xu 2020-04-01 482 if (fault_signal_pending(fault, regs)) { f2c76e3b6f72c3 Heiko Carstens 2012-07-27 483 fault = VM_FAULT_SIGNAL; 306d6c49ac9ded Claudio Imbrenda 2018-07-16 484 if (flags & FAULT_FLAG_RETRY_NOWAIT) 306d6c49ac9ded Claudio Imbrenda 2018-07-16 485 goto out_up; f2c76e3b6f72c3 Heiko Carstens 2012-07-27 486 goto out; f2c76e3b6f72c3 Heiko Carstens 2012-07-27 487 } 50d7280d430484 Martin Schwidefsky 2009-12-07 488 if (unlikely(fault & VM_FAULT_ERROR)) 50d7280d430484 Martin Schwidefsky 2009-12-07 489 goto out_up; 50d7280d430484 Martin Schwidefsky 2009-12-07 490 33ce614029576b Heiko Carstens 2011-05-26 491 /* 33ce614029576b Heiko Carstens 2011-05-26 492 * Major/minor page fault accounting is only done on the 33ce614029576b Heiko Carstens 2011-05-26 493 * initial attempt. If we go through a retry, it is extremely 33ce614029576b Heiko Carstens 2011-05-26 494 * likely that the page will be found in page cache at that point. 33ce614029576b Heiko Carstens 2011-05-26 495 */ 33ce614029576b Heiko Carstens 2011-05-26 496 if (flags & FAULT_FLAG_ALLOW_RETRY) { bde69af2ab696e Heiko Carstens 2009-09-11 497 if (fault & VM_FAULT_MAJOR) { 83c54070ee1a2d Nick Piggin 2007-07-19 498 tsk->maj_flt++; a8b0ca17b80e92 Peter Zijlstra 2011-06-27 499 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, bde69af2ab696e Heiko Carstens 2009-09-11 500 regs, address); bde69af2ab696e Heiko Carstens 2009-09-11 501 } else { 83c54070ee1a2d Nick Piggin 2007-07-19 502 tsk->min_flt++; a8b0ca17b80e92 Peter Zijlstra 2011-06-27 503 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, bde69af2ab696e Heiko Carstens 2009-09-11 504 regs, address); bde69af2ab696e Heiko Carstens 2009-09-11 505 } 33ce614029576b Heiko Carstens 2011-05-26 506 if (fault & VM_FAULT_RETRY) { 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 507 if (IS_ENABLED(CONFIG_PGSTE) && gmap && 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 508 (flags & FAULT_FLAG_RETRY_NOWAIT)) { 24eb3a824c4f3c Dominik Dingel 2013-06-17 509 /* FAULT_FLAG_RETRY_NOWAIT has been set, 24eb3a824c4f3c Dominik Dingel 2013-06-17 510 * mmap_sem has not been released */ 24eb3a824c4f3c Dominik Dingel 2013-06-17 511 current->thread.gmap_pfault = 1; 24eb3a824c4f3c Dominik Dingel 2013-06-17 512 fault = VM_FAULT_PFAULT; 24eb3a824c4f3c Dominik Dingel 2013-06-17 513 goto out_up; 24eb3a824c4f3c Dominik Dingel 2013-06-17 514 } 4064b982706375 Peter Xu 2020-04-01 515 flags &= ~FAULT_FLAG_RETRY_NOWAIT; 45cac65b0fcd28 Shaohua Li 2012-10-08 516 flags |= FAULT_FLAG_TRIED; d8ed45c5dcd455 Michel Lespinasse 2020-06-08 @517 mmap_read_lock(mm); 33ce614029576b Heiko Carstens 2011-05-26 518 goto retry; 33ce614029576b Heiko Carstens 2011-05-26 519 } 33ce614029576b Heiko Carstens 2011-05-26 520 } 0aaba41b58bc5f Martin Schwidefsky 2017-08-22 521 if (IS_ENABLED(CONFIG_PGSTE) && gmap) { 527e30b41d8b86 Martin Schwidefsky 2014-04-30 522 address = __gmap_link(gmap, current->thread.gmap_addr, 527e30b41d8b86 Martin Schwidefsky 2014-04-30 523 address); 527e30b41d8b86 Martin Schwidefsky 2014-04-30 524 if (address == -EFAULT) { 527e30b41d8b86 Martin Schwidefsky 2014-04-30 525 fault = VM_FAULT_BADMAP; 527e30b41d8b86 Martin Schwidefsky 2014-04-30 526 goto out_up; 527e30b41d8b86 Martin Schwidefsky 2014-04-30 527 } 527e30b41d8b86 Martin Schwidefsky 2014-04-30 528 if (address == -ENOMEM) { 527e30b41d8b86 Martin Schwidefsky 2014-04-30 529 fault = VM_FAULT_OOM; 527e30b41d8b86 Martin Schwidefsky 2014-04-30 530 goto out_up; 527e30b41d8b86 Martin Schwidefsky 2014-04-30 531 } 527e30b41d8b86 Martin Schwidefsky 2014-04-30 532 } 50d7280d430484 Martin Schwidefsky 2009-12-07 533 fault = 0; 50d7280d430484 Martin Schwidefsky 2009-12-07 534 out_up: d8ed45c5dcd455 Michel Lespinasse 2020-06-08 535 mmap_read_unlock(mm); 50d7280d430484 Martin Schwidefsky 2009-12-07 536 out: 50d7280d430484 Martin Schwidefsky 2009-12-07 537 return fault; ^1da177e4c3f41 Linus Torvalds 2005-04-16 538 } ^1da177e4c3f41 Linus Torvalds 2005-04-16 539 :::::: The code at line 517 was first introduced by commit :::::: d8ed45c5dcd455fc5848d47f86883a1b872ac0d0 mmap locking API: use coccinelle to convert mmap_sem rwsem call sites :::::: TO: Michel Lespinasse <[email protected]> :::::: CC: Linus Torvalds <[email protected]> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
