Thread (78 messages) flat view 78 messages, 10 authors, 2016-02-18
STALE3826d

[PATCH] arm64: move back to generic memblock_enforce_memory_limit()

From: catalin.marinas@arm.com (Catalin Marinas)
Date: 2016-02-02 10:44:38

On Tue, Feb 02, 2016 at 11:28:41AM +0100, Ard Biesheuvel wrote:
On 2 February 2016 at 11:19, Catalin Marinas [off-list ref] wrote:
quoted
On Mon, Feb 01, 2016 at 07:30:17PM +0100, Ard Biesheuvel wrote:
quoted
 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help