Re: [RFC PATCH 0/6] decrease unnecessary gap due to pmem kmem alignment
From: David Hildenbrand <hidden>
Date: 2020-07-29 13:03:23
Also in:
linux-mm, lkml, nvdimm
On 29.07.20 15:00, Mike Rapoport wrote:
On Wed, Jul 29, 2020 at 11:35:20AM +0200, David Hildenbrand wrote:quoted
On 29.07.20 11:31, Mike Rapoport wrote:quoted
Hi Justin, On Wed, Jul 29, 2020 at 08:27:58AM +0000, Justin He wrote:quoted
Hi Davidquoted
quoted
Without this series, if qemu creates a 4G bytes nvdimm device, we canonlyquoted
use 2G bytes for dax pmem(kmem) in the worst case. e.g. 240000000-33fdfffff : Persistent Memory We can only use the memblock between [240000000, 2ffffffff] due to thehardquoted
limitation. It wastes too much memory space. Decreasing the SECTION_SIZE_BITS on arm64 might be an alternative, buttherequoted
are too many concerns from other constraints, e.g. PAGE_SIZE, hugetlb, SPARSEMEM_VMEMMAP, page bits in struct page ... Beside decreasing the SECTION_SIZE_BITS, we can also relax the kmemalignmentquoted
with memory_block_size_bytes(). Tested on arm64 guest and x86 guest, qemu creates a 4G pmem device. daxpmemquoted
can be used as ram with smaller gap. Also the kmem hotplug add/removeare bothquoted
tested on arm64/x86 guest.Hi, I am not convinced this use case is worth such hacks (that’s what it is) for now. On real machines pmem is big - your example (losing 50% is extreme). I would much rather want to see the section size on arm64 reduced. I remember there were patches and that at least with a base page size of 4k it can be reduced drastically (64k base pages are more problematic due to the ridiculous THP size of 512M). But could be a section size of 512 is possible on all configs right now.Yes, I once investigated how to reduce section size on arm64 thoughtfully: There are many constraints for reducing SECTION_SIZE_BITS 1. Given page->flags bits is limited, SECTION_SIZE_BITS can't be reduced too much. 2. Once CONFIG_SPARSEMEM_VMEMMAP is enabled, section id will not be counted into page->flags. 3. MAX_ORDER depends on SECTION_SIZE_BITS - 3.1 mmzone.h #if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS #error Allocator MAX_ORDER exceeds SECTION_SIZE #endif - 3.2 hugepage_init() MAYBE_BUILD_BUG_ON(HPAGE_PMD_ORDER >= MAX_ORDER); Hence when ARM64_4K_PAGES && CONFIG_SPARSEMEM_VMEMMAP are enabled, SECTION_SIZE_BITS can be reduced to 27. But when ARM64_64K_PAGES, given 3.2, MAX_ORDER > 29-16 = 13. Given 3.1 SECTION_SIZE_BITS >= MAX_ORDER+15 > 28. So SECTION_SIZE_BITS can not be reduced to 27. In one word, if we considered to reduce SECTION_SIZE_BITS on arm64, the Kconfig might be very complicated,e.g. we still need to consider the case for ARM64_16K_PAGES.It is not necessary to pollute Kconfig with that. arch/arm64/include/asm/sparesemem.h can have something like #ifdef CONFIG_ARM64_64K_PAGES #define SPARSE_SECTION_SIZE 29 #elif defined(CONFIG_ARM16K_PAGES) #define SPARSE_SECTION_SIZE 28 #elif defined(CONFIG_ARM4K_PAGES) #define SPARSE_SECTION_SIZE 27 #else #error #endifackquoted
There is still large gap with ARM64_64K_PAGES, though. As for SPARSEMEM without VMEMMAP, are there actual benefits to use it?I was asking myself the same question a while ago and didn't really find a compelling one.Memory overhead for VMEMMAP is larger, especially for arm64 that knows how to free empty parts of the memory map with "classic" SPARSEMEM.
You mean the hole punching within section memmap? (which is why their pfn_valid() implementation is special) (I do wonder why that shouldn't work with VMEMMAP, or is it simply not implemented?)
quoted
I think it's always enabled as default (SPARSEMEM_VMEMMAP_ENABLE) and would require config tweaks to even disable it.Nope, it's right there in menuconfig, "Memory Management options" -> "Sparse Memory virtual memmap"
Ah, good to know. -- Thanks, David / dhildenb _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel