Hi Alexandre, Thank you for the patch! Yet something to improve: [auto build test ERROR on robh/for-next] [also build test ERROR on linus/master v6.2-rc5 next-20230123] [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#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Alexandre-Ghiti/riscv-Use-PUD-P4D-PGD-pages-for-the-linear-mapping/20230123-192952 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next patch link: https://lore.kernel.org/r/20230123112803.817534-1-alexghiti%40rivosinc.com patch subject: [PATCH v4] riscv: Use PUD/P4D/PGD pages for the linear mapping config: riscv-nommu_virt_defconfig (https://download.01.org/0day-ci/archive/20230124/202301240847.k2H9qZVL-lkp@xxxxxxxxx/config) compiler: riscv64-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/intel-lab-lkp/linux/commit/b0cdf20b21efcc85ec67bffa6a10894dedd0d12e git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Alexandre-Ghiti/riscv-Use-PUD-P4D-PGD-pages-for-the-linear-mapping/20230123-192952 git checkout b0cdf20b21efcc85ec67bffa6a10894dedd0d12e # 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=riscv olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash arch/riscv/mm/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@xxxxxxxxx> All errors (new ones prefixed by >>): arch/riscv/mm/init.c: In function 'setup_bootmem': >> arch/riscv/mm/init.c:222:9: error: 'riscv_pfn_base' undeclared (first use in this function) 222 | riscv_pfn_base = PFN_DOWN(phys_ram_base); | ^~~~~~~~~~~~~~ arch/riscv/mm/init.c:222:9: note: each undeclared identifier is reported only once for each function it appears in vim +/riscv_pfn_base +222 arch/riscv/mm/init.c 187 188 static void __init setup_bootmem(void) 189 { 190 phys_addr_t vmlinux_end = __pa_symbol(&_end); 191 phys_addr_t max_mapped_addr; 192 phys_addr_t phys_ram_end, vmlinux_start; 193 194 if (IS_ENABLED(CONFIG_XIP_KERNEL)) 195 vmlinux_start = __pa_symbol(&_sdata); 196 else 197 vmlinux_start = __pa_symbol(&_start); 198 199 memblock_enforce_memory_limit(memory_limit); 200 201 /* 202 * Make sure we align the reservation on PMD_SIZE since we will 203 * map the kernel in the linear mapping as read-only: we do not want 204 * any allocation to happen between _end and the next pmd aligned page. 205 */ 206 if (IS_ENABLED(CONFIG_64BIT) && IS_ENABLED(CONFIG_STRICT_KERNEL_RWX)) 207 vmlinux_end = (vmlinux_end + PMD_SIZE - 1) & PMD_MASK; 208 /* 209 * Reserve from the start of the kernel to the end of the kernel 210 */ 211 memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start); 212 213 phys_ram_end = memblock_end_of_DRAM(); 214 if (!IS_ENABLED(CONFIG_XIP_KERNEL)) 215 phys_ram_base = memblock_start_of_DRAM(); 216 217 /* 218 * Any use of __va/__pa before this point is wrong as we did not know the 219 * start of DRAM before. 220 */ 221 kernel_map.va_pa_offset = PAGE_OFFSET - phys_ram_base; > 222 riscv_pfn_base = PFN_DOWN(phys_ram_base); 223 224 /* 225 * memblock allocator is not aware of the fact that last 4K bytes of 226 * the addressable memory can not be mapped because of IS_ERR_VALUE 227 * macro. Make sure that last 4k bytes are not usable by memblock 228 * if end of dram is equal to maximum addressable memory. For 64-bit 229 * kernel, this problem can't happen here as the end of the virtual 230 * address space is occupied by the kernel mapping then this check must 231 * be done as soon as the kernel mapping base address is determined. 232 */ 233 if (!IS_ENABLED(CONFIG_64BIT)) { 234 max_mapped_addr = __pa(~(ulong)0); 235 if (max_mapped_addr == (phys_ram_end - 1)) 236 memblock_set_current_limit(max_mapped_addr - 4096); 237 } 238 239 min_low_pfn = PFN_UP(phys_ram_base); 240 max_low_pfn = max_pfn = PFN_DOWN(phys_ram_end); 241 high_memory = (void *)(__va(PFN_PHYS(max_low_pfn))); 242 243 dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn)); 244 set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET); 245 246 reserve_initrd_mem(); 247 /* 248 * If DTB is built in, no need to reserve its memblock. 249 * Otherwise, do reserve it but avoid using 250 * early_init_fdt_reserve_self() since __pa() does 251 * not work for DTB pointers that are fixmap addresses 252 */ 253 if (!IS_ENABLED(CONFIG_BUILTIN_DTB)) { 254 /* 255 * In case the DTB is not located in a memory region we won't 256 * be able to locate it later on via the linear mapping and 257 * get a segfault when accessing it via __va(dtb_early_pa). 258 * To avoid this situation copy DTB to a memory region. 259 * Note that memblock_phys_alloc will also reserve DTB region. 260 */ 261 if (!memblock_is_memory(dtb_early_pa)) { 262 size_t fdt_size = fdt_totalsize(dtb_early_va); 263 phys_addr_t new_dtb_early_pa = memblock_phys_alloc(fdt_size, PAGE_SIZE); 264 void *new_dtb_early_va = early_memremap(new_dtb_early_pa, fdt_size); 265 266 memcpy(new_dtb_early_va, dtb_early_va, fdt_size); 267 early_memunmap(new_dtb_early_va, fdt_size); 268 _dtb_early_pa = new_dtb_early_pa; 269 } else 270 memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va)); 271 } 272 273 dma_contiguous_reserve(dma32_phys_limit); 274 if (IS_ENABLED(CONFIG_64BIT)) 275 hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT); 276 memblock_allow_resize(); 277 } 278 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests