All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Kiper <daniel.kiper@oracle.com>
To: Julien Grall <julien.grall@arm.com>
Cc: jgross@suse.com, sstabellini@kernel.org,
	andrew.cooper3@citrix.com, cardoe@cardoe.com,
	pgnet.dev@gmail.com, ning.sun@intel.com, jbeulich@suse.com,
	xen-devel@lists.xenproject.org, qiaowei.ren@intel.com,
	gang.wei@intel.com, fu.wei@linaro.org
Subject: Re: [PATCH v11 06/13] efi: create new early memory allocator
Date: Mon, 12 Dec 2016 15:27:14 +0100	[thread overview]
Message-ID: <20161212142714.GA25118@olila.local.net-space.pl> (raw)
In-Reply-To: <39f731c7-e35b-473b-f586-3bc78c943409@arm.com>

On Fri, Dec 09, 2016 at 06:03:06PM +0000, Julien Grall wrote:
> Hi Daniel,
>
> On 05/12/16 22:25, Daniel Kiper wrote:
> >There is a problem with place_string() which is used as early memory
> >allocator. It gets memory chunks starting from start symbol and goes
> >down. Sadly this does not work when Xen is loaded using multiboot2
> >protocol because then the start lives on 1 MiB address and we should
> >not allocate a memory from below of it. So, I tried to use mem_lower
> >address calculated by GRUB2. However, this solution works only on some
> >machines. There are machines in the wild (e.g. Dell PowerEdge R820)
> >which uses first ~640 KiB for boot services code or data... :-(((
> >Hence, we need new memory allocator for Xen EFI boot code which is
> >quite simple and generic and could be used by place_string() and
> >efi_arch_allocate_mmap_buffer(). I think about following solutions:
> >
> >1) We could use native EFI allocation functions (e.g. AllocatePool()
> >   or AllocatePages()) to get memory chunk. However, later (somewhere
> >   in __start_xen()) we must copy its contents to safe place or reserve
> >   it in e820 memory map and map it in Xen virtual address space. This
> >   means that the code referring to Xen command line, loaded modules and
> >   EFI memory map, mostly in __start_xen(), will be further complicated
> >   and diverge from legacy BIOS cases. Additionally, both former things
> >   have to be placed below 4 GiB because their addresses are stored in
> >   multiboot_info_t structure which has 32-bit relevant members.
> >
> >2) We may allocate memory area statically somewhere in Xen code which
> >   could be used as memory pool for early dynamic allocations. Looks
> >   quite simple. Additionally, it would not depend on EFI at all and
> >   could be used on legacy BIOS platforms if we need it. However, we
> >   must carefully choose size of this pool. We do not want increase Xen
> >   binary size too much and waste too much memory but also we must fit
> >   at least memory map on x86 EFI platforms. As I saw on small machine,
> >   e.g. IBM System x3550 M2 with 8 GiB RAM, memory map may contain more
> >   than 200 entries. Every entry on x86-64 platform is 40 bytes in size.
> >   So, it means that we need more than 8 KiB for EFI memory map only.
> >   Additionally, if we use this memory pool for Xen and modules command
> >   line storage (it would be used when xen.efi is executed as EFI application)
> >   then we should add, I think, about 1 KiB. In this case, to be on safe
> >   side, we should assume at least 64 KiB pool for early memory allocations.
> >   Which is about 4 times of our earlier calculations. However, during
> >   discussion on Xen-devel Jan Beulich suggested that just in case we should
> >   use 1 MiB memory pool like it is in original place_string() implementation.
> >   So, let's use 1 MiB as it was proposed. If we think that we should not
> >   waste unallocated memory in the pool on running system then we can mark
> >   this region as __initdata and move all required data to dynamically
> >   allocated places somewhere in __start_xen().
> >
> >2a) We could put memory pool into .bss.page_aligned section. Then allocate
> >    memory chunks starting from the lowest address. After init phase we can
> >    free unused portion of the memory pool as in case of .init.text or .init.data
> >    sections. This way we do not need to allocate any space in image file and
> >    freeing of unused area in the memory pool is very simple.
> >
> >Now #2a solution is implemented because it is quite simple and requires
> >limited number of changes, especially in __start_xen().
> >
> >New allocator is quite generic and can be used on ARM platforms too.
> >Though it is not enabled on ARM yet due to lack of some prereq.
> >List of them is placed before ebmalloc code.
> >
> >Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
>
> FWIW,
>
> Acked-by: Julien Grall <julien.grall@arm.com>

Thanks a lot!

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2016-12-12 14:27 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-05 22:25 [PATCH v11 00/13] x86: multiboot2 protocol support Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 01/13] x86: add " Daniel Kiper
2017-01-10  1:21   ` Doug Goldstein
2017-01-10  8:38     ` Jan Beulich
2017-01-10 15:19       ` Doug Goldstein
2016-12-05 22:25 ` [PATCH v11 02/13] efi: create efi_enabled() Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 03/13] x86: allow EFI reboot method neither on EFI platforms Daniel Kiper
2016-12-07 13:18   ` Jan Beulich
2016-12-07 17:25     ` Daniel Kiper
2017-01-10  1:24     ` Doug Goldstein
2017-01-10  8:21       ` Jan Beulich
2016-12-05 22:25 ` [PATCH v11 04/13] x86: properly calculate xen ELF end of image address Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 05/13] efi: build xen.gz with EFI code Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 06/13] efi: create new early memory allocator Daniel Kiper
2016-12-06  8:27   ` Jan Beulich
2016-12-09 18:03   ` Julien Grall
2016-12-12 14:27     ` Daniel Kiper [this message]
2016-12-05 22:25 ` [PATCH v11 07/13] x86: add multiboot2 protocol support for EFI platforms Daniel Kiper
2016-12-16 13:38   ` Andrew Cooper
2016-12-16 13:50     ` Jan Beulich
2017-01-10  1:37   ` Doug Goldstein
2017-01-10 20:51     ` Doug Goldstein
2017-01-11 19:47       ` Daniel Kiper
2017-01-11 20:20         ` Doug Goldstein
2017-01-12 10:22           ` Jan Beulich
2017-01-12 12:50           ` Daniel Kiper
2017-01-12 15:52             ` Doug Goldstein
2017-01-12 20:28               ` Daniel Kiper
2017-01-12 22:23                 ` Doug Goldstein
2017-01-13  0:04                   ` Daniel Kiper
2017-01-13  0:35                     ` Doug Goldstein
2017-01-13  0:37                     ` Doug Goldstein
2017-01-11 19:08     ` Daniel Kiper
2017-01-11 19:50       ` Doug Goldstein
2017-01-11 20:36         ` Daniel Kiper
2017-01-11 20:31       ` Doug Goldstein
2017-01-12 12:18         ` Daniel Kiper
2017-01-12 15:44           ` Doug Goldstein
2017-01-12 19:30             ` Daniel Kiper
2017-01-12 19:46               ` Doug Goldstein
2017-01-12 21:45                 ` Daniel Kiper
2017-01-12 22:20                   ` Doug Goldstein
2017-01-12 23:44                     ` Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 08/13] x86/boot: implement early command line parser in C Daniel Kiper
2016-12-07 13:43   ` Jan Beulich
2016-12-07 17:27     ` Daniel Kiper
2016-12-08 23:08       ` Daniel Kiper
2016-12-09  8:19         ` Jan Beulich
2016-12-09 13:32           ` Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 09/13] x86: change default load address from 1 MiB to 2 MiB Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 10/13] x86/setup: use XEN_IMG_OFFSET instead of Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 11/13] x86: make Xen early boot code relocatable Daniel Kiper
2017-01-10  2:05   ` Doug Goldstein
2017-01-11 20:05     ` Daniel Kiper
2017-01-11 20:23       ` Doug Goldstein
2016-12-05 22:25 ` [PATCH v11 12/13] x86/boot: rename sym_phys() to sym_offs() Daniel Kiper
2016-12-05 22:25 ` [PATCH v11 13/13] x86: add multiboot2 protocol support for relocatable images Daniel Kiper
2016-12-16 15:59 ` [PATCH v11 00/13] x86: multiboot2 protocol support Doug Goldstein
2017-01-10 23:12 ` [PATCH 2/??] memory allocation fix Doug Goldstein
2017-01-11 20:46 ` [PATCH v11 00/13] x86: multiboot2 protocol support Daniel Kiper
2017-01-13 15:45   ` Doug Goldstein
2017-01-13 16:18     ` Daniel Kiper
2017-01-12 17:46 ` Doug Goldstein
2017-01-12 18:26   ` Daniel Kiper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161212142714.GA25118@olila.local.net-space.pl \
    --to=daniel.kiper@oracle.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=cardoe@cardoe.com \
    --cc=fu.wei@linaro.org \
    --cc=gang.wei@intel.com \
    --cc=jbeulich@suse.com \
    --cc=jgross@suse.com \
    --cc=julien.grall@arm.com \
    --cc=ning.sun@intel.com \
    --cc=pgnet.dev@gmail.com \
    --cc=qiaowei.ren@intel.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.