Commit 0a02756d authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'riscv-for-linus-6.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux

Pull RISC-V fixes from Palmer Dabbelt:

 - Another fix to avoid allocating pages that overlap with ERR_PTR,
   which manifests on rv32

 - A revert for the badaccess patch I incorrectly picked up an early
   version of

* tag 'riscv-for-linus-6.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  Revert "riscv: mm: accelerate pagefault when badaccess"
  riscv: fix overlap of allocated page and PTR_ERR
parents 8d6b029e e2c79b4c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -293,8 +293,8 @@ void handle_page_fault(struct pt_regs *regs)
	if (unlikely(access_error(cause, vma))) {
		vma_end_read(vma);
		count_vm_vma_lock_event(VMA_LOCK_SUCCESS);
		tsk->thread.bad_cause = SEGV_ACCERR;
		bad_area_nosemaphore(regs, code, addr);
		tsk->thread.bad_cause = cause;
		bad_area_nosemaphore(regs, SEGV_ACCERR, addr);
		return;
	}

+11 −10
Original line number Diff line number Diff line
@@ -250,18 +250,19 @@ static void __init setup_bootmem(void)
		kernel_map.va_pa_offset = PAGE_OFFSET - phys_ram_base;

	/*
	 * memblock allocator is not aware of the fact that last 4K bytes of
	 * the addressable memory can not be mapped because of IS_ERR_VALUE
	 * macro. Make sure that last 4k bytes are not usable by memblock
	 * if end of dram is equal to maximum addressable memory.  For 64-bit
	 * kernel, this problem can't happen here as the end of the virtual
	 * address space is occupied by the kernel mapping then this check must
	 * be done as soon as the kernel mapping base address is determined.
	 * Reserve physical address space that would be mapped to virtual
	 * addresses greater than (void *)(-PAGE_SIZE) because:
	 *  - This memory would overlap with ERR_PTR
	 *  - This memory belongs to high memory, which is not supported
	 *
	 * This is not applicable to 64-bit kernel, because virtual addresses
	 * after (void *)(-PAGE_SIZE) are not linearly mapped: they are
	 * occupied by kernel mapping. Also it is unrealistic for high memory
	 * to exist on 64-bit platforms.
	 */
	if (!IS_ENABLED(CONFIG_64BIT)) {
		max_mapped_addr = __pa(~(ulong)0);
		if (max_mapped_addr == (phys_ram_end - 1))
			memblock_set_current_limit(max_mapped_addr - 4096);
		max_mapped_addr = __va_to_pa_nodebug(-PAGE_SIZE);
		memblock_reserve(max_mapped_addr, (phys_addr_t)-max_mapped_addr);
	}

	min_low_pfn = PFN_UP(phys_ram_base);