From mboxrd@z Thu Jan 1 00:00:00 1970 From: catalin.marinas@arm.com (Catalin Marinas) Date: Tue, 2 Feb 2016 10:44:38 +0000 Subject: [PATCH] arm64: move back to generic memblock_enforce_memory_limit() In-Reply-To: References: <20160201180256.GJ15514@e104818-lin.cambridge.arm.com> <1454351417-23732-1-git-send-email-ard.biesheuvel@linaro.org> <20160202101945.GA22042@localhost.localdomain> Message-ID: <20160202104438.GB22042@localhost.localdomain> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tue, Feb 02, 2016 at 11:28:41AM +0100, Ard Biesheuvel wrote: > On 2 February 2016 at 11:19, Catalin Marinas wrote: > > On Mon, Feb 01, 2016 at 07:30:17PM +0100, Ard Biesheuvel wrote: > >> void __init arm64_memblock_init(void) > >> { > >> const s64 linear_region_size = -(s64)PAGE_OFFSET; > >> @@ -215,24 +180,14 @@ void __init arm64_memblock_init(void) > >> if (memblock_end_of_DRAM() > linear_region_size) > >> memblock_remove(0, memblock_end_of_DRAM() - linear_region_size); > >> > >> + /* > >> + * Apply the memory limit if it was set. Since the kernel may be loaded > >> + * high up in memory, add back the kernel region that must be accessible > >> + * via the linear mapping. > >> + */ > >> if (memory_limit != (phys_addr_t)ULLONG_MAX) { > >> - u64 kbase = round_down(__pa(_text), MIN_KIMG_ALIGN); > >> - u64 kend = PAGE_ALIGN(__pa(_end)); > >> - u64 const sz_4g = 0x100000000UL; > >> - > >> - /* > >> - * Clip memory in order of preference: > >> - * - above the kernel and above 4 GB > >> - * - between 4 GB and the start of the kernel (if the kernel > >> - * is loaded high in memory) > >> - * - between the kernel and 4 GB (if the kernel is loaded > >> - * low in memory) > >> - * - below 4 GB > >> - */ > >> - clip_mem_range(max(sz_4g, kend), ULLONG_MAX); > >> - clip_mem_range(sz_4g, kbase); > >> - clip_mem_range(kend, sz_4g); > >> - clip_mem_range(0, min(kbase, sz_4g)); > >> + memblock_enforce_memory_limit(memory_limit); > >> + memblock_add(__pa(__init_begin), (u64)(_end - __init_begin)); > > > > Thanks, it looks much simpler now. However, loading the kernel 1GB > > higher with mem=1G fails somewhere during the KVM hyp initialisation. It > > works if I change the last line below to: > > > > memblock_add(__pa(_text), (u64)(_end - _text)); > > OK, that should work as well. > > I suppose the fact that mem= loses some of its accuracy is not an > issue? If you need it to be exact, you should simply not load your > kernel outside your mem= range ... I'm not worried about accuracy. We could avoid freeing the init mem if the kernel is outside the memory_limit range but I don't really think it's worth. -- Catalin