Re: [PATCH kvm-unit-tests v2 07/11] s390x: initialize the physical allocator

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 12, 2018 at 03:34:13PM +0100, David Hildenbrand wrote:
> We now have the range of free memory, let's initialize the physical
> allocator. It is now possible to use alloc_page()/alloc_pages().

Commit message isn't quite right. After this patch it's possible to
use malloc and memalign, based on the early-ops, but alloc_pages()
requires the freelist to be initialized first by free_pages(), done
by setup_vm().

Actually, since we have four states of memory management setup,
then I think we either need three setup calls:

state 1: no setup done, no call
state 2: phys-alloc is set up by the phys_alloc_init() call
state 3: alloc_page() is set up, need call that allocates chunk with the
                                 phys-allocator for free_pages()

(Instead of a chunk, all memory could be given, but then either a
 new set of early-ops should be provided that are based on
 alloc_page(), or all early memory allocations must use alloc_page())

state 4: virtual memory is set up by the setup_vm() call

Or, simply remove state 2 and its code and alloc-ops, changing all early
allocations to use alloc_page(). If each arch provides an mmu_enabled()
call, then the alloc_ops->memalign call in memalign could be replaced
with

 if (mmu_enabled())
    vm_memalign(...)
 else
    /* fallback to alloc_pages() */

I probably should have written all this in a separate thread, because
I wouldn't want to hold this series up on a rework of the general
memory management framework. But, anyway, thoughts on that? Paolo?

Thanks,
drew

> 
> Signed-off-by: David Hildenbrand <david@xxxxxxxxxx>
> ---
>  lib/s390x/sclp.c | 12 ++++++++++++
>  s390x/Makefile   |  3 +++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c
> index 199405c..c7471b1 100644
> --- a/lib/s390x/sclp.c
> +++ b/lib/s390x/sclp.c
> @@ -15,11 +15,21 @@
>  #include <asm/arch_def.h>
>  #include <asm/interrupt.h>
>  #include "sclp.h"
> +#include <alloc_phys.h>
> +
> +extern unsigned long stacktop;
>  
>  static uint64_t storage_increment_size;
>  static uint64_t max_ram_size;
>  static uint64_t ram_size;
>  
> +static void mem_init(phys_addr_t mem_end)
> +{
> +	phys_addr_t freemem_start = (phys_addr_t)&stacktop & PAGE_MASK;
> +
> +	phys_alloc_init(freemem_start, mem_end - freemem_start);
> +}
> +
>  void sclp_memory_setup(void)
>  {
>  	ReadInfo *ri = (void *)_sccb;
> @@ -55,4 +65,6 @@ void sclp_memory_setup(void)
>  			break;
>  		ram_size += storage_increment_size;
>  	}
> +
> +	mem_init(ram_size);
>  }
> diff --git a/s390x/Makefile b/s390x/Makefile
> index ce63dd1..4198fdc 100644
> --- a/s390x/Makefile
> +++ b/s390x/Makefile
> @@ -21,6 +21,9 @@ asm-offsets = lib/$(ARCH)/asm-offsets.h
>  include $(SRCDIR)/scripts/asm-offsets.mak
>  
>  cflatobjs += lib/util.o
> +cflatobjs += lib/alloc.o
> +cflatobjs += lib/alloc_phys.o
> +cflatobjs += lib/alloc_page.o
>  cflatobjs += lib/alloc_phys.o
>  cflatobjs += lib/s390x/io.o
>  cflatobjs += lib/s390x/stack.o
> -- 
> 2.14.3
> 



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux