linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] mm: add vmalloc_no_huge and use it
@ 2021-06-10 15:42 Claudio Imbrenda
  2021-06-10 15:42 ` [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge Claudio Imbrenda
  2021-06-10 15:42 ` [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc Claudio Imbrenda
  0 siblings, 2 replies; 11+ messages in thread
From: Claudio Imbrenda @ 2021-06-10 15:42 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, frankja, borntraeger, cohuck, david, linux-mm,
	Andrew Morton, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig

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 <tglx@linutronix.de>
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


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge
  2021-06-10 15:42 [PATCH v3 0/2] mm: add vmalloc_no_huge and use it Claudio Imbrenda
@ 2021-06-10 15:42 ` Claudio Imbrenda
  2021-06-10 19:31   ` Uladzislau Rezki
                     ` (2 more replies)
  2021-06-10 15:42 ` [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc Claudio Imbrenda
  1 sibling, 3 replies; 11+ messages in thread
From: Claudio Imbrenda @ 2021-06-10 15:42 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, frankja, borntraeger, cohuck, david, linux-mm,
	Andrew Morton, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig

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 <tglx@linutronix.de>
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(+)

diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
index 4d668abb6391..bfaaf0b6fa76 100644
--- a/include/linux/vmalloc.h
+++ b/include/linux/vmalloc.h
@@ -135,6 +135,7 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
 			const void *caller);
 void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask,
 		int node, const void *caller);
+void *vmalloc_no_huge(unsigned long size);
 
 extern void vfree(const void *addr);
 extern void vfree_atomic(const void *addr);
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index a13ac524f6ff..296a2fcc3fbe 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2998,6 +2998,22 @@ void *vmalloc(unsigned long size)
 }
 EXPORT_SYMBOL(vmalloc);
 
+/**
+ * vmalloc_no_huge - allocate virtually contiguous memory using small pages
+ * @size:    allocation size
+ *
+ * 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc
  2021-06-10 15:42 [PATCH v3 0/2] mm: add vmalloc_no_huge and use it Claudio Imbrenda
  2021-06-10 15:42 ` [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge Claudio Imbrenda
@ 2021-06-10 15:42 ` Claudio Imbrenda
  2021-06-10 15:56   ` Christian Borntraeger
  2021-06-14  1:43   ` Nicholas Piggin
  1 sibling, 2 replies; 11+ messages in thread
From: Claudio Imbrenda @ 2021-06-10 15:42 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, frankja, borntraeger, cohuck, david, linux-mm,
	Andrew Morton, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig

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 <tglx@linutronix.de>
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(-)

diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
index 813b6e93dc83..ad7c6d7cc90b 100644
--- a/arch/s390/kvm/pv.c
+++ b/arch/s390/kvm/pv.c
@@ -140,7 +140,7 @@ static int kvm_s390_pv_alloc_vm(struct kvm *kvm)
 	/* Allocate variable storage */
 	vlen = ALIGN(virt * ((npages * PAGE_SIZE) / HPAGE_SIZE), PAGE_SIZE);
 	vlen += uv_info.guest_virt_base_stor_len;
-	kvm->arch.pv.stor_var = vzalloc(vlen);
+	kvm->arch.pv.stor_var = vmalloc_no_huge(vlen);
 	if (!kvm->arch.pv.stor_var)
 		goto out_err;
 	return 0;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc
  2021-06-10 15:42 ` [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc Claudio Imbrenda
@ 2021-06-10 15:56   ` Christian Borntraeger
  2021-06-10 16:49     ` Claudio Imbrenda
  2021-06-14  1:43   ` Nicholas Piggin
  1 sibling, 1 reply; 11+ messages in thread
From: Christian Borntraeger @ 2021-06-10 15:56 UTC (permalink / raw)
  To: Claudio Imbrenda, linux-kernel
  Cc: kvm, linux-s390, frankja, cohuck, david, linux-mm, Andrew Morton,
	Nicholas Piggin, Uladzislau Rezki, Catalin Marinas,
	Thomas Gleixner, Ingo Molnar, David Rientjes, Christoph Hellwig



On 10.06.21 17:42, Claudio Imbrenda wrote:
> 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 <tglx@linutronix.de>
> 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(-)
> 
> diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
> index 813b6e93dc83..ad7c6d7cc90b 100644
> --- a/arch/s390/kvm/pv.c
> +++ b/arch/s390/kvm/pv.c
> @@ -140,7 +140,7 @@ static int kvm_s390_pv_alloc_vm(struct kvm *kvm)
>   	/* Allocate variable storage */
>   	vlen = ALIGN(virt * ((npages * PAGE_SIZE) / HPAGE_SIZE), PAGE_SIZE);
>   	vlen += uv_info.guest_virt_base_stor_len;
> -	kvm->arch.pv.stor_var = vzalloc(vlen);
> +	kvm->arch.pv.stor_var = vmalloc_no_huge(vlen);

dont we need a memset now?

>   	if (!kvm->arch.pv.stor_var)
>   		goto out_err;
>   	return 0;
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc
  2021-06-10 15:56   ` Christian Borntraeger
@ 2021-06-10 16:49     ` Claudio Imbrenda
  2021-06-10 16:52       ` Christian Borntraeger
  0 siblings, 1 reply; 11+ messages in thread
From: Claudio Imbrenda @ 2021-06-10 16:49 UTC (permalink / raw)
  To: Christian Borntraeger
  Cc: linux-kernel, kvm, linux-s390, frankja, cohuck, david, linux-mm,
	Andrew Morton, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig

On Thu, 10 Jun 2021 17:56:58 +0200
Christian Borntraeger <borntraeger@de.ibm.com> wrote:

> On 10.06.21 17:42, Claudio Imbrenda wrote:
> > 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.

^ here

> > 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 <tglx@linutronix.de>
> > 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(-)
> > 
> > diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
> > index 813b6e93dc83..ad7c6d7cc90b 100644
> > --- a/arch/s390/kvm/pv.c
> > +++ b/arch/s390/kvm/pv.c
> > @@ -140,7 +140,7 @@ static int kvm_s390_pv_alloc_vm(struct kvm *kvm)
> >   	/* Allocate variable storage */
> >   	vlen = ALIGN(virt * ((npages * PAGE_SIZE) / HPAGE_SIZE),
> > PAGE_SIZE); vlen += uv_info.guest_virt_base_stor_len;
> > -	kvm->arch.pv.stor_var = vzalloc(vlen);
> > +	kvm->arch.pv.stor_var = vmalloc_no_huge(vlen);  
> 
> dont we need a memset now?

no, as explained above

> >   	if (!kvm->arch.pv.stor_var)
> >   		goto out_err;
> >   	return 0;
> >   


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc
  2021-06-10 16:49     ` Claudio Imbrenda
@ 2021-06-10 16:52       ` Christian Borntraeger
  0 siblings, 0 replies; 11+ messages in thread
From: Christian Borntraeger @ 2021-06-10 16:52 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, frankja, cohuck, david, linux-mm,
	Andrew Morton, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig



On 10.06.21 18:49, Claudio Imbrenda wrote:
> On Thu, 10 Jun 2021 17:56:58 +0200
> Christian Borntraeger <borntraeger@de.ibm.com> wrote:
> 
>> On 10.06.21 17:42, Claudio Imbrenda wrote:
>>> 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.
> 
> ^ here
> 
>>> 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 <tglx@linutronix.de>
>>> 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(-)
>>>
>>> diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
>>> index 813b6e93dc83..ad7c6d7cc90b 100644
>>> --- a/arch/s390/kvm/pv.c
>>> +++ b/arch/s390/kvm/pv.c
>>> @@ -140,7 +140,7 @@ static int kvm_s390_pv_alloc_vm(struct kvm *kvm)
>>>    	/* Allocate variable storage */
>>>    	vlen = ALIGN(virt * ((npages * PAGE_SIZE) / HPAGE_SIZE),
>>> PAGE_SIZE); vlen += uv_info.guest_virt_base_stor_len;
>>> -	kvm->arch.pv.stor_var = vzalloc(vlen);
>>> +	kvm->arch.pv.stor_var = vmalloc_no_huge(vlen);
>>
>> dont we need a memset now?
> 
> no, as explained above

Makes sense.

Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge
  2021-06-10 15:42 ` [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge Claudio Imbrenda
@ 2021-06-10 19:31   ` Uladzislau Rezki
  2021-06-10 21:09   ` Andrew Morton
  2021-06-14  2:01   ` Nicholas Piggin
  2 siblings, 0 replies; 11+ messages in thread
From: Uladzislau Rezki @ 2021-06-10 19:31 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, frankja, borntraeger, cohuck,
	david, linux-mm, Andrew Morton, Nicholas Piggin,
	Uladzislau Rezki, Catalin Marinas, Thomas Gleixner, Ingo Molnar,
	David Rientjes, Christoph Hellwig

Hello.

See below a small nit:

> 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 <tglx@linutronix.de>
> 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(+)
> 
> diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
> index 4d668abb6391..bfaaf0b6fa76 100644
> --- a/include/linux/vmalloc.h
> +++ b/include/linux/vmalloc.h
> @@ -135,6 +135,7 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
>  			const void *caller);
>  void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask,
>  		int node, const void *caller);
> +void *vmalloc_no_huge(unsigned long size);
>  
>  extern void vfree(const void *addr);
>  extern void vfree_atomic(const void *addr);
> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> index a13ac524f6ff..296a2fcc3fbe 100644
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -2998,6 +2998,22 @@ void *vmalloc(unsigned long size)
>  }
>  EXPORT_SYMBOL(vmalloc);
>  
> +/**
> + * vmalloc_no_huge - allocate virtually contiguous memory using small pages
> + * @size:    allocation size
> + *
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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge
  2021-06-10 15:42 ` [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge Claudio Imbrenda
  2021-06-10 19:31   ` Uladzislau Rezki
@ 2021-06-10 21:09   ` Andrew Morton
  2021-06-11  8:23     ` Claudio Imbrenda
  2021-06-14  2:01   ` Nicholas Piggin
  2 siblings, 1 reply; 11+ messages in thread
From: Andrew Morton @ 2021-06-10 21:09 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, frankja, borntraeger, cohuck,
	david, linux-mm, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig

On Thu, 10 Jun 2021 17:42:19 +0200 Claudio Imbrenda <imbrenda@linux.ibm.com> wrote:

> 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.

I can find no patch which adds such a flag to __vmalloc_node_range(). 
I assume you're referring to "mm/vmalloc: switch to bulk allocator in
__vmalloc_area_node()"?

Please be quite specific when identifying patches.  More specific than
"the recent patches"!

Also, it appears from the discussion at
https://lkml.kernel.org/r/YKUWKFyLdqTYliwu@infradead.org that we'll be
seeing a new version of "mm/vmalloc: switch to bulk allocator in
__vmalloc_area_node()".  Would it be better to build these s390 fixes into
the next version of that patch series rather than as a separate
followup thing?


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge
  2021-06-10 21:09   ` Andrew Morton
@ 2021-06-11  8:23     ` Claudio Imbrenda
  0 siblings, 0 replies; 11+ messages in thread
From: Claudio Imbrenda @ 2021-06-11  8:23 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, kvm, linux-s390, frankja, borntraeger, cohuck,
	david, linux-mm, Nicholas Piggin, Uladzislau Rezki,
	Catalin Marinas, Thomas Gleixner, Ingo Molnar, David Rientjes,
	Christoph Hellwig

On Thu, 10 Jun 2021 14:09:09 -0700
Andrew Morton <akpm@linux-foundation.org> wrote:

> On Thu, 10 Jun 2021 17:42:19 +0200 Claudio Imbrenda
> <imbrenda@linux.ibm.com> wrote:
> 
> > The recent patches to add support for hugepage vmalloc mappings

I will put the proper commit ID here

> > added a flag for __vmalloc_node_range to allow to request small

and the name of the flag here

> > pages. This flag is not accessible when calling vmalloc, the only

and improve the wording in general ("order-0 pages" instead of "small
pages")

> > option is to call directly __vmalloc_node_range, which is not
> > exported.  
> 
> I can find no patch which adds such a flag to __vmalloc_node_range(). 
> I assume you're referring to "mm/vmalloc: switch to bulk allocator in
> __vmalloc_area_node()"?
> 
> Please be quite specific when identifying patches.  More specific than
> "the recent patches"!

sorry!

I was referring to this one: 
121e6f3258fe393e22c36f61a ("mm/vmalloc: hugepage vmalloc mappings")

which introduces the flag VM_NO_HUGE_VMAP

I will reword the commit to be more specific

> Also, it appears from the discussion at
> https://lkml.kernel.org/r/YKUWKFyLdqTYliwu@infradead.org that we'll be
> seeing a new version of "mm/vmalloc: switch to bulk allocator in
> __vmalloc_area_node()".  Would it be better to build these s390 fixes
> into the next version of that patch series rather than as a separate
> followup thing?
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc
  2021-06-10 15:42 ` [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc Claudio Imbrenda
  2021-06-10 15:56   ` Christian Borntraeger
@ 2021-06-14  1:43   ` Nicholas Piggin
  1 sibling, 0 replies; 11+ messages in thread
From: Nicholas Piggin @ 2021-06-14  1:43 UTC (permalink / raw)
  To: Claudio Imbrenda, linux-kernel
  Cc: Andrew Morton, borntraeger, Catalin Marinas, cohuck, david,
	frankja, Christoph Hellwig, kvm, linux-mm, linux-s390,
	Ingo Molnar, David Rientjes, Thomas Gleixner, Uladzislau Rezki

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>

> 
> 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 <tglx@linutronix.de>
> 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(-)
> 
> diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
> index 813b6e93dc83..ad7c6d7cc90b 100644
> --- a/arch/s390/kvm/pv.c
> +++ b/arch/s390/kvm/pv.c
> @@ -140,7 +140,7 @@ static int kvm_s390_pv_alloc_vm(struct kvm *kvm)
>  	/* Allocate variable storage */
>  	vlen = ALIGN(virt * ((npages * PAGE_SIZE) / HPAGE_SIZE), PAGE_SIZE);
>  	vlen += uv_info.guest_virt_base_stor_len;
> -	kvm->arch.pv.stor_var = vzalloc(vlen);
> +	kvm->arch.pv.stor_var = vmalloc_no_huge(vlen);
>  	if (!kvm->arch.pv.stor_var)
>  		goto out_err;
>  	return 0;
> -- 
> 2.31.1
> 
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge
  2021-06-10 15:42 ` [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge Claudio Imbrenda
  2021-06-10 19:31   ` Uladzislau Rezki
  2021-06-10 21:09   ` Andrew Morton
@ 2021-06-14  2:01   ` Nicholas Piggin
  2 siblings, 0 replies; 11+ messages in thread
From: Nicholas Piggin @ 2021-06-14  2:01 UTC (permalink / raw)
  To: Claudio Imbrenda, linux-kernel
  Cc: Andrew Morton, borntraeger, Catalin Marinas, cohuck, david,
	frankja, Christoph Hellwig, kvm, linux-mm, linux-s390,
	Ingo Molnar, David Rientjes, Thomas Gleixner, Uladzislau Rezki

Excerpts from Claudio Imbrenda's message of June 11, 2021 1:42 am:
> 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 <tglx@linutronix.de>
> 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(+)
> 
> diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
> index 4d668abb6391..bfaaf0b6fa76 100644
> --- a/include/linux/vmalloc.h
> +++ b/include/linux/vmalloc.h
> @@ -135,6 +135,7 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
>  			const void *caller);
>  void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask,
>  		int node, const void *caller);
> +void *vmalloc_no_huge(unsigned long size);
>  
>  extern void vfree(const void *addr);
>  extern void vfree_atomic(const void *addr);
> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> index a13ac524f6ff..296a2fcc3fbe 100644
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -2998,6 +2998,22 @@ void *vmalloc(unsigned long size)
>  }
>  EXPORT_SYMBOL(vmalloc);
>  
> +/**
> + * vmalloc_no_huge - allocate virtually contiguous memory using small pages
> + * @size:    allocation size
> + *
> + * 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);

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-06-14  2:02 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-10 15:42 [PATCH v3 0/2] mm: add vmalloc_no_huge and use it Claudio Imbrenda
2021-06-10 15:42 ` [PATCH v3 1/2] mm/vmalloc: add vmalloc_no_huge Claudio Imbrenda
2021-06-10 19:31   ` Uladzislau Rezki
2021-06-10 21:09   ` Andrew Morton
2021-06-11  8:23     ` Claudio Imbrenda
2021-06-14  2:01   ` Nicholas Piggin
2021-06-10 15:42 ` [PATCH v3 2/2] KVM: s390: fix for hugepage vmalloc Claudio Imbrenda
2021-06-10 15:56   ` Christian Borntraeger
2021-06-10 16:49     ` Claudio Imbrenda
2021-06-10 16:52       ` Christian Borntraeger
2021-06-14  1:43   ` Nicholas Piggin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).