Add vmalloc_no_huge and export it, so modules can allocate memory with
small pages.
Use the newly added vmalloc_no_huge in KVM on s390 to get around a
hardware limitation.
v2->v3:
* do not export __vmalloc_node_range
* add vmalloc_no_huge as a wrapper around __vmalloc_node_range
* use vmalloc_no_huge instead of __vmalloc_node_range in kvm on s390x
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
Claudio Imbrenda (2):
mm/vmalloc: add vmalloc_no_huge
KVM: s390: fix for hugepage vmalloc
arch/s390/kvm/pv.c | 2 +-
include/linux/vmalloc.h | 1 +
mm/vmalloc.c | 16 ++++++++++++++++
3 files changed, 18 insertions(+), 1 deletion(-)
--
2.31.1
The recent patches to add support for hugepage vmalloc mappings added a
flag for __vmalloc_node_range to allow to request small pages.
This flag is not accessible when calling vmalloc, the only option is to
call directly __vmalloc_node_range, which is not exported.
This means that a module can't vmalloc memory with small pages.
Case in point: KVM on s390x needs to vmalloc a large area, and it needs
to be mapped with small pages, because of a hardware limitation.
This patch adds the function vmalloc_no_huge, which works like vmalloc,
but it is guaranteed to always back the mapping using small pages. This
function is exported, therefore it is usable by modules.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
---
include/linux/vmalloc.h | 1 +
mm/vmalloc.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+)
The Create Secure Configuration Ultravisor Call does not support using
large pages for the virtual memory area. This is a hardware limitation.
This patch replaces the vzalloc call with an almost equivalent call to
the newly introduced vmalloc_no_huge function, which guarantees that
only small pages will be used for the backing.
The new call will not clear the allocated memory, but that has never
been an actual requirement.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
---
arch/s390/kvm/pv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Christian Borntraeger <hidden> Date: 2021-06-10 15:57:17
On 10.06.21 17:42, Claudio Imbrenda wrote:
quoted hunk
The Create Secure Configuration Ultravisor Call does not support using
large pages for the virtual memory area. This is a hardware limitation.
This patch replaces the vzalloc call with an almost equivalent call to
the newly introduced vmalloc_no_huge function, which guarantees that
only small pages will be used for the backing.
The new call will not clear the allocated memory, but that has never
been an actual requirement.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
---
arch/s390/kvm/pv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
The recent patches to add support for hugepage vmalloc mappings added a
flag for __vmalloc_node_range to allow to request small pages.
This flag is not accessible when calling vmalloc, the only option is to
call directly __vmalloc_node_range, which is not exported.
This means that a module can't vmalloc memory with small pages.
Case in point: KVM on s390x needs to vmalloc a large area, and it needs
to be mapped with small pages, because of a hardware limitation.
This patch adds the function vmalloc_no_huge, which works like vmalloc,
but it is guaranteed to always back the mapping using small pages. This
function is exported, therefore it is usable by modules.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
---
include/linux/vmalloc.h | 1 +
mm/vmalloc.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+)
@@ -2998,6 +2998,22 @@ void *vmalloc(unsigned long size)}EXPORT_SYMBOL(vmalloc);+/**+*vmalloc_no_huge-allocatevirtuallycontiguousmemoryusingsmallpages+*@size:allocationsize+*
You state that it allocates using "small pages". I think it might be confused
for people because of that vague meaning. The comment should be improved, imho,
saying rather about order-0 pages what we call "small pages".
+ * Allocate enough non-huge pages to cover @size from the page level
+ * allocator and map them into contiguous kernel virtual space.
+ *
+ * Return: pointer to the allocated memory or %NULL on error
+ */
+void *vmalloc_no_huge(unsigned long size)
+{
+ return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, GFP_KERNEL, PAGE_KERNEL,
+ VM_NO_HUGE_VMAP, NUMA_NO_NODE, __builtin_return_address(0));
+}
+EXPORT_SYMBOL(vmalloc_no_huge);
+
/**
* vzalloc - allocate virtually contiguous memory with zero fill
* @size: allocation size
--
2.31.1
anyone looks good to me, please use:
Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
Thanks.
--
Vlad Rezki
From: Nicholas Piggin <npiggin@gmail.com> Date: 2021-06-14 01:44:34
Sorry, catching up with email, I should have replied here originally.
Excerpts from Claudio Imbrenda's message of June 11, 2021 1:42 am:
The Create Secure Configuration Ultravisor Call does not support using
large pages for the virtual memory area. This is a hardware limitation.
This patch replaces the vzalloc call with an almost equivalent call to
the newly introduced vmalloc_no_huge function, which guarantees that
only small pages will be used for the backing.
The new call will not clear the allocated memory, but that has never
been an actual requirement.
Since it seems like you will submit another version, I think it would
make things clear to change "fix" to "prepare", which should avoid
misleading the reader and tripping up automatic backporting things.
You could also add the first paragraph as a comment in the code?
Otherwise it looks good to me.
Acked-by: Nicholas Piggin <npiggin@gmail.com>
quoted hunk
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
---
arch/s390/kvm/pv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Nicholas Piggin <npiggin@gmail.com> Date: 2021-06-14 02:02:41
Excerpts from Claudio Imbrenda's message of June 11, 2021 1:42 am:
quoted hunk
The recent patches to add support for hugepage vmalloc mappings added a
flag for __vmalloc_node_range to allow to request small pages.
This flag is not accessible when calling vmalloc, the only option is to
call directly __vmalloc_node_range, which is not exported.
This means that a module can't vmalloc memory with small pages.
Case in point: KVM on s390x needs to vmalloc a large area, and it needs
to be mapped with small pages, because of a hardware limitation.
This patch adds the function vmalloc_no_huge, which works like vmalloc,
but it is guaranteed to always back the mapping using small pages. This
function is exported, therefore it is usable by modules.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
---
include/linux/vmalloc.h | 1 +
mm/vmalloc.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+)
@@ -2998,6 +2998,22 @@ void *vmalloc(unsigned long size)}EXPORT_SYMBOL(vmalloc);+/**+*vmalloc_no_huge-allocatevirtuallycontiguousmemoryusingsmallpages+*@size:allocationsize+*+*Allocateenoughnon-hugepagestocover@sizefromthepagelevel+*allocatorandmapthemintocontiguouskernelvirtualspace.+*+*Return:pointertotheallocatedmemoryor%NULLonerror+*/+void*vmalloc_no_huge(unsignedlongsize)+{+return__vmalloc_node_range(size,1,VMALLOC_START,VMALLOC_END,GFP_KERNEL,PAGE_KERNEL,+VM_NO_HUGE_VMAP,NUMA_NO_NODE,__builtin_return_address(0));+}+EXPORT_SYMBOL(vmalloc_no_huge);
At some point if the combination of flags becomes too much we will need a
different strategy. A vmalloc API with (size, align, gfp_t, vm_flags,
node) args would help 3/6 of the existing non-arch callers too. And one
more if you had a prot parameter or _exec variant.
But for now I'm okay with this.
Acked-by: Nicholas Piggin <npiggin@gmail.com>
Thanks,
Nick