GNU/Weeb Mailing List <[email protected]>
 help / color / mirror / Atom feed
* [ammarfaizi2-block:viro/vfs/fixes 5/10] arch/microblaze/mm/fault.c:224:25: error: label 'no_context' used but not defined
@ 2023-02-25  8:59 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2023-02-25  8:59 UTC (permalink / raw)
  To: Al Viro; +Cc: oe-kbuild-all, Ammar Faizi, GNU/Weeb Mailing List

tree:   https://github.com/ammarfaizi2/linux-block viro/vfs/fixes
head:   b260379a90a440564d4c0196ec52f621b1c05020
commit: 8820100806d82abf47169f2ac4a1a1d64d83b220 [5/10] microblaze: fix livelock in uaccess
config: microblaze-randconfig-r011-20230222 (https://download.01.org/0day-ci/archive/20230225/[email protected]/config)
compiler: microblaze-linux-gcc (GCC) 12.1.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
        # https://github.com/ammarfaizi2/linux-block/commit/8820100806d82abf47169f2ac4a1a1d64d83b220
        git remote add ammarfaizi2-block https://github.com/ammarfaizi2/linux-block
        git fetch --no-tags ammarfaizi2-block viro/vfs/fixes
        git checkout 8820100806d82abf47169f2ac4a1a1d64d83b220
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=microblaze olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=microblaze SHELL=/bin/bash arch/microblaze/mm/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

   arch/microblaze/mm/fault.c: In function 'do_page_fault':
>> arch/microblaze/mm/fault.c:224:25: error: label 'no_context' used but not defined
     224 |                         goto no_context;
         |                         ^~~~


vim +/no_context +224 arch/microblaze/mm/fault.c

    81	
    82	/*
    83	 * The error_code parameter is ESR for a data fault,
    84	 * 0 for an instruction fault.
    85	 */
    86	void do_page_fault(struct pt_regs *regs, unsigned long address,
    87			   unsigned long error_code)
    88	{
    89		struct vm_area_struct *vma;
    90		struct mm_struct *mm = current->mm;
    91		int code = SEGV_MAPERR;
    92		int is_write = error_code & ESR_S;
    93		vm_fault_t fault;
    94		unsigned int flags = FAULT_FLAG_DEFAULT;
    95	
    96		regs->ear = address;
    97		regs->esr = error_code;
    98	
    99		/* On a kernel SLB miss we can only check for a valid exception entry */
   100		if (unlikely(kernel_mode(regs) && (address >= TASK_SIZE))) {
   101			pr_warn("kernel task_size exceed");
   102			_exception(SIGSEGV, regs, code, address);
   103		}
   104	
   105		/* for instr TLB miss and instr storage exception ESR_S is undefined */
   106		if ((error_code & 0x13) == 0x13 || (error_code & 0x11) == 0x11)
   107			is_write = 0;
   108	
   109		if (unlikely(faulthandler_disabled() || !mm)) {
   110			if (kernel_mode(regs))
   111				goto bad_area_nosemaphore;
   112	
   113			/* faulthandler_disabled() in user mode is really bad,
   114			   as is current->mm == NULL. */
   115			pr_emerg("Page fault in user mode with faulthandler_disabled(), mm = %p\n",
   116				 mm);
   117			pr_emerg("r15 = %lx  MSR = %lx\n",
   118			       regs->r15, regs->msr);
   119			die("Weird page fault", regs, SIGSEGV);
   120		}
   121	
   122		if (user_mode(regs))
   123			flags |= FAULT_FLAG_USER;
   124	
   125		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
   126	
   127		/* When running in the kernel we expect faults to occur only to
   128		 * addresses in user space.  All other faults represent errors in the
   129		 * kernel and should generate an OOPS.  Unfortunately, in the case of an
   130		 * erroneous fault occurring in a code path which already holds mmap_lock
   131		 * we will deadlock attempting to validate the fault against the
   132		 * address space.  Luckily the kernel only validly references user
   133		 * space from well defined areas of code, which are listed in the
   134		 * exceptions table.
   135		 *
   136		 * As the vast majority of faults will be valid we will only perform
   137		 * the source reference check when there is a possibility of a deadlock.
   138		 * Attempt to lock the address space, if we cannot we then validate the
   139		 * source.  If this is invalid we can skip the address space check,
   140		 * thus avoiding the deadlock.
   141		 */
   142		if (unlikely(!mmap_read_trylock(mm))) {
   143			if (kernel_mode(regs) && !search_exception_tables(regs->pc))
   144				goto bad_area_nosemaphore;
   145	
   146	retry:
   147			mmap_read_lock(mm);
   148		}
   149	
   150		vma = find_vma(mm, address);
   151		if (unlikely(!vma))
   152			goto bad_area;
   153	
   154		if (vma->vm_start <= address)
   155			goto good_area;
   156	
   157		if (unlikely(!(vma->vm_flags & VM_GROWSDOWN)))
   158			goto bad_area;
   159	
   160		if (unlikely(!is_write))
   161			goto bad_area;
   162	
   163		/*
   164		 * N.B. The ABI allows programs to access up to
   165		 * a few hundred bytes below the stack pointer (TBD).
   166		 * The kernel signal delivery code writes up to about 1.5kB
   167		 * below the stack pointer (r1) before decrementing it.
   168		 * The exec code can write slightly over 640kB to the stack
   169		 * before setting the user r1.  Thus we allow the stack to
   170		 * expand to 1MB without further checks.
   171		 */
   172		if (unlikely(address + 0x100000 < vma->vm_end)) {
   173	
   174			/* get user regs even if this fault is in kernel mode */
   175			struct pt_regs *uregs = current->thread.regs;
   176			if (uregs == NULL)
   177				goto bad_area;
   178	
   179			/*
   180			 * A user-mode access to an address a long way below
   181			 * the stack pointer is only valid if the instruction
   182			 * is one which would update the stack pointer to the
   183			 * address accessed if the instruction completed,
   184			 * i.e. either stwu rs,n(r1) or stwux rs,r1,rb
   185			 * (or the byte, halfword, float or double forms).
   186			 *
   187			 * If we don't check this then any write to the area
   188			 * between the last mapped region and the stack will
   189			 * expand the stack rather than segfaulting.
   190			 */
   191			if (address + 2048 < uregs->r1
   192				&& (kernel_mode(regs) || !store_updates_sp(regs)))
   193					goto bad_area;
   194		}
   195		if (expand_stack(vma, address))
   196			goto bad_area;
   197	
   198	good_area:
   199		code = SEGV_ACCERR;
   200	
   201		/* a write */
   202		if (unlikely(is_write)) {
   203			if (unlikely(!(vma->vm_flags & VM_WRITE)))
   204				goto bad_area;
   205			flags |= FAULT_FLAG_WRITE;
   206		/* a read */
   207		} else {
   208			/* protection fault */
   209			if (unlikely(error_code & 0x08000000))
   210				goto bad_area;
   211			if (unlikely(!(vma->vm_flags & (VM_READ | VM_EXEC))))
   212				goto bad_area;
   213		}
   214	
   215		/*
   216		 * If for any reason at all we couldn't handle the fault,
   217		 * make sure we exit gracefully rather than endlessly redo
   218		 * the fault.
   219		 */
   220		fault = handle_mm_fault(vma, address, flags, regs);
   221	
   222		if (fault_signal_pending(fault, regs)) {
   223			if (!user_mode(regs))
 > 224				goto no_context;
   225			return;
   226		}
   227	
   228		/* The fault is fully completed (including releasing mmap lock) */
   229		if (fault & VM_FAULT_COMPLETED)
   230			return;
   231	
   232		if (unlikely(fault & VM_FAULT_ERROR)) {
   233			if (fault & VM_FAULT_OOM)
   234				goto out_of_memory;
   235			else if (fault & VM_FAULT_SIGSEGV)
   236				goto bad_area;
   237			else if (fault & VM_FAULT_SIGBUS)
   238				goto do_sigbus;
   239			BUG();
   240		}
   241	
   242		if (fault & VM_FAULT_RETRY) {
   243			flags |= FAULT_FLAG_TRIED;
   244	
   245			/*
   246			 * No need to mmap_read_unlock(mm) as we would
   247			 * have already released it in __lock_page_or_retry
   248			 * in mm/filemap.c.
   249			 */
   250	
   251			goto retry;
   252		}
   253	
   254		mmap_read_unlock(mm);
   255	
   256		/*
   257		 * keep track of tlb+htab misses that are good addrs but
   258		 * just need pte's created via handle_mm_fault()
   259		 * -- Cort
   260		 */
   261		pte_misses++;
   262		return;
   263	
   264	bad_area:
   265		mmap_read_unlock(mm);
   266	
   267	bad_area_nosemaphore:
   268		pte_errors++;
   269	
   270		/* User mode accesses cause a SIGSEGV */
   271		if (user_mode(regs)) {
   272			_exception(SIGSEGV, regs, code, address);
   273			return;
   274		}
   275	
   276		bad_page_fault(regs, address, SIGSEGV);
   277		return;
   278	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-25  9:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-25  8:59 [ammarfaizi2-block:viro/vfs/fixes 5/10] arch/microblaze/mm/fault.c:224:25: error: label 'no_context' used but not defined kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox