qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Hu Tao <hutao@cn.fujitsu.com>
Cc: ehabkost@redhat.com, mtosatti@redhat.com, qemu-devel@nongnu.org,
	a.motakis@virtualopensystems.com, imammedo@redhat.com,
	gaowanlong@cn.fujitsu.com
Subject: Re: [Qemu-devel] [PATCH 2.1 16/28] memory: reorganize file-based allocation
Date: Fri, 07 Mar 2014 08:47:08 +0100	[thread overview]
Message-ID: <5319797C.7040907@redhat.com> (raw)
In-Reply-To: <20140307060925.GK16105@G08FNSTD100614.fnst.cn.fujitsu.com>

Il 07/03/2014 07:09, Hu Tao ha scritto:
> On Tue, Mar 04, 2014 at 03:00:44PM +0100, Paolo Bonzini wrote:
>> Split the internal interface in exec.c to a separate function, and
>> push the check on mem_path up to memory_region_init_ram.
>>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>>  exec.c                  | 105 +++++++++++++++++++++++++++++-------------------
>>  include/exec/cpu-all.h  |   3 --
>>  include/exec/ram_addr.h |   2 +
>>  include/sysemu/sysemu.h |   2 +
>>  memory.c                |   7 +++-
>>  5 files changed, 73 insertions(+), 46 deletions(-)
>>
>> diff --git a/exec.c b/exec.c
>> index b69fd29..0aa4947 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -1240,56 +1240,30 @@ static int memory_try_enable_merging(void *addr, size_t len)
>>      return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
>>  }
>>
>> -ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
>> -                                   MemoryRegion *mr)
>> +static ram_addr_t ram_block_add(RAMBlock *new_block)
>>  {
>> -    RAMBlock *block, *new_block;
>> +    RAMBlock *block;
>>      ram_addr_t old_ram_size, new_ram_size;
>>
>>      old_ram_size = last_ram_offset() >> TARGET_PAGE_BITS;
>>
>> -    size = TARGET_PAGE_ALIGN(size);
>> -    new_block = g_malloc0(sizeof(*new_block));
>> -    new_block->fd = -1;
>> -
>>      /* This assumes the iothread lock is taken here too.  */
>>      qemu_mutex_lock_ramlist();
>> -    new_block->mr = mr;
>> -    new_block->offset = find_ram_offset(size);
>> -    if (host) {
>> -        new_block->host = host;
>> -        new_block->flags |= RAM_PREALLOC_MASK;
>> -    } else if (xen_enabled()) {
>> -        if (mem_path) {
>> -            fprintf(stderr, "-mem-path not supported with Xen\n");
>> -            exit(1);
>> -        }
>> -        xen_ram_alloc(new_block->offset, size, mr);
>> -    } else {
>> -        if (mem_path) {
>> -            if (phys_mem_alloc != qemu_anon_ram_alloc) {
>> -                /*
>> -                 * file_ram_alloc() needs to allocate just like
>> -                 * phys_mem_alloc, but we haven't bothered to provide
>> -                 * a hook there.
>> -                 */
>> -                fprintf(stderr,
>> -                        "-mem-path not supported with this accelerator\n");
>> -                exit(1);
>> -            }
>> -            new_block->host = file_ram_alloc(new_block, size, mem_path);
>> -        }
>> -        if (!new_block->host) {
>> -            new_block->host = phys_mem_alloc(size);
>> +    new_block->offset = find_ram_offset(new_block->length);
>> +
>> +    if (!new_block->host) {
>> +        if (xen_enabled()) {
>> +            xen_ram_alloc(new_block->offset, new_block->length, new_block->mr);
>> +        } else {
>> +            new_block->host = phys_mem_alloc(new_block->length);
>>              if (!new_block->host) {
>>                  fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
>>                          new_block->mr->name, strerror(errno));
>>                  exit(1);
>>              }
>> -            memory_try_enable_merging(new_block->host, size);
>> +            memory_try_enable_merging(new_block->host, new_block->length);
>>          }
>>      }
>> -    new_block->length = size;
>>
>>      /* Keep the list sorted from biggest to smallest block.  */
>>      QTAILQ_FOREACH(block, &ram_list.blocks, next) {
>> @@ -1317,18 +1291,65 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
>>                                     old_ram_size, new_ram_size);
>>         }
>>      }
>> -    cpu_physical_memory_set_dirty_range(new_block->offset, size);
>> +    cpu_physical_memory_set_dirty_range(new_block->offset, new_block->length);
>>
>> -    qemu_ram_setup_dump(new_block->host, size);
>> -    qemu_madvise(new_block->host, size, QEMU_MADV_HUGEPAGE);
>> -    qemu_madvise(new_block->host, size, QEMU_MADV_DONTFORK);
>> +    qemu_ram_setup_dump(new_block->host, new_block->length);
>> +    qemu_madvise(new_block->host, new_block->length, QEMU_MADV_HUGEPAGE);
>> +    qemu_madvise(new_block->host, new_block->length, QEMU_MADV_DONTFORK);
>>
>> -    if (kvm_enabled())
>> -        kvm_setup_guest_memory(new_block->host, size);
>> +    if (kvm_enabled()) {
>> +        kvm_setup_guest_memory(new_block->host, new_block->length);
>> +    }
>>
>>      return new_block->offset;
>>  }
>>
>> +ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
>> +                                    const char *mem_path)
>> +{
>> +    RAMBlock *new_block;
>> +
>> +    if (xen_enabled()) {
>> +        fprintf(stderr, "-mem-path not supported with Xen\n");
>> +        exit(1);
>> +    }
>> +
>> +    if (phys_mem_alloc != qemu_anon_ram_alloc) {
>> +        /*
>> +         * file_ram_alloc() needs to allocate just like
>> +         * phys_mem_alloc, but we haven't bothered to provide
>> +         * a hook there.
>> +         */
>> +        fprintf(stderr,
>> +                "-mem-path not supported with this accelerator\n");
>> +        exit(1);
>> +    }
>> +
>> +    size = TARGET_PAGE_ALIGN(size);
>> +    new_block = g_malloc0(sizeof(*new_block));
>> +    new_block->mr = mr;
>> +    new_block->length = size;
>> +    new_block->host = file_ram_alloc(new_block, size, mem_path);
>> +    return ram_block_add(new_block);
>> +}
>> +
>> +ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
>> +                                   MemoryRegion *mr)
>> +{
>> +    RAMBlock *new_block;
>> +
>> +    size = TARGET_PAGE_ALIGN(size);
>> +    new_block = g_malloc0(sizeof(*new_block));
>> +    new_block->mr = mr;
>> +    new_block->length = size;
>> +    new_block->fd = -1;
>> +    new_block->host = host;
>> +    if (host) {
>> +        new_block->flags |= RAM_PREALLOC_MASK;
>> +    }
>> +    return ram_block_add(new_block);
>> +}
>> +
>>  ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
>>  {
>>      return qemu_ram_alloc_from_ptr(size, NULL, mr);
>> diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
>> index e66ab5b..b44babb 100644
>> --- a/include/exec/cpu-all.h
>> +++ b/include/exec/cpu-all.h
>> @@ -466,9 +466,6 @@ typedef struct RAMList {
>>  } RAMList;
>>  extern RAMList ram_list;
>>
>> -extern const char *mem_path;
>> -extern int mem_prealloc;
>> -
>>  /* Flags stored in the low bits of the TLB virtual address.  These are
>>     defined so that fast path ram access is all zeros.  */
>>  /* Zero if TLB entry is valid.  */
>> diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
>> index 2edfa96..dedb258 100644
>> --- a/include/exec/ram_addr.h
>> +++ b/include/exec/ram_addr.h
>> @@ -22,6 +22,8 @@
>>  #ifndef CONFIG_USER_ONLY
>>  #include "hw/xen/xen.h"
>>
>> +ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
>> +                                    const char *mem_path);
>>  ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
>>                                     MemoryRegion *mr);
>>  ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
>> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
>> index 4870129..03f5ee5 100644
>> --- a/include/sysemu/sysemu.h
>> +++ b/include/sysemu/sysemu.h
>> @@ -132,6 +132,8 @@ extern uint8_t *boot_splash_filedata;
>>  extern size_t boot_splash_filedata_size;
>>  extern uint8_t qemu_extra_params_fw[2];
>>  extern QEMUClockType rtc_clock;
>> +extern const char *mem_path;
>> +extern int mem_prealloc;
>>
>>  #define MAX_NODES 128
>>  #define MAX_CPUMASK_BITS 255
>> diff --git a/memory.c b/memory.c
>> index 59ecc28..32b17a8 100644
>> --- a/memory.c
>> +++ b/memory.c
>> @@ -23,6 +23,7 @@
>>
>>  #include "exec/memory-internal.h"
>>  #include "exec/ram_addr.h"
>> +#include "sysemu/sysemu.h"
>>
>>  //#define DEBUG_UNASSIGNED
>>
>> @@ -1016,7 +1017,11 @@ void memory_region_init_ram(MemoryRegion *mr,
>>      mr->ram = true;
>>      mr->terminates = true;
>>      mr->destructor = memory_region_destructor_ram;
>> -    mr->ram_addr = qemu_ram_alloc(size, mr);
>> +    if (mem_path) {
>> +        mr->ram_addr = qemu_ram_alloc_from_file(size, mr, mem_path);
>> +    } else {
>> +        mr->ram_addr = qemu_ram_alloc(size, mr);
>> +    }
>>  }
>
> This changes the logic of the original code:
>
>   if (mem_path) {
>       ...
>       new_block->host = file_ram_alloc(new_block, size, mem_path);
>   }
>   if (!new_block->host) {
>       new_block->host = phys_mem_alloc(size);
>       ...
>   }

ram_block_add is still calling phys_mem_alloc:

     new_block = g_malloc0(sizeof(*new_block));
     new_block->mr = mr;
     new_block->length = size;
     new_block->host = file_ram_alloc(new_block, size, mem_path);
     return ram_block_add(new_block);

Paolo

>>
>>  void memory_region_init_ram_ptr(MemoryRegion *mr,
>> --
>> 1.8.5.3
>>
>
>

  parent reply	other threads:[~2014-03-07  7:47 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-04 14:00 [Qemu-devel] [PATCH 2.1 00/28] Current state of NUMA series, and hostmem improvements Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 01/28] NUMA: move numa related code to new file numa.c Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 02/28] NUMA: check if the total numa memory size is equal to ram_size Paolo Bonzini
2014-03-04 17:00   ` Eric Blake
2014-03-04 17:19     ` Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 03/28] NUMA: Add numa_info structure to contain numa nodes info Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 04/28] NUMA: convert -numa option to use OptsVisitor Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 05/28] NUMA: expand MAX_NODES from 64 to 128 Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 06/28] man: improve -numa doc Paolo Bonzini
2014-03-11 18:53   ` Eduardo Habkost
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 07/28] qemu-option: introduce qemu_find_opts_singleton Paolo Bonzini
2014-03-05 10:08   ` Andreas Färber
2014-03-07  2:27   ` Hu Tao
2014-03-11 18:55   ` Eduardo Habkost
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 08/28] vl: convert -m to QemuOpts Paolo Bonzini
2014-03-05 10:06   ` Andreas Färber
2014-03-05 10:31     ` Paolo Bonzini
2014-03-05 15:09     ` Igor Mammedov
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 09/28] vl: redo -object parsing Paolo Bonzini
2014-03-07  2:56   ` Hu Tao
2014-03-07  7:39     ` Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 10/28] qmp: allow object-add completion handler to get canonical path Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 11/28] qmp: improve error reporting for -object and object-add Paolo Bonzini
2014-03-07  3:07   ` Hu Tao
2014-03-07  7:57     ` Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 12/28] pc: pass QEMUMachineInitArgs to pc_memory_init Paolo Bonzini
2014-03-07  3:09   ` Hu Tao
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 13/28] numa: introduce memory_region_allocate_system_memory Paolo Bonzini
2014-03-07  3:18   ` Hu Tao
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 14/28] add memdev backend infrastructure Paolo Bonzini
2014-03-07  3:31   ` Hu Tao
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 15/28] numa: add -numa node, memdev= option Paolo Bonzini
2014-03-04 17:52   ` Eric Blake
2014-03-07  5:33   ` Hu Tao
2014-03-07  7:41     ` Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 16/28] memory: reorganize file-based allocation Paolo Bonzini
2014-03-07  6:09   ` Hu Tao
2014-03-07  6:34     ` Hu Tao
2014-03-07  7:47     ` Paolo Bonzini [this message]
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 17/28] memory: move mem_path handling to memory_region_allocate_system_memory Paolo Bonzini
2014-03-11  3:50   ` Hu Tao
2014-03-11  8:03     ` Paolo Bonzini
2014-03-12  2:08       ` Marcelo Tosatti
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 18/28] memory: add error propagation to file-based RAM allocation Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 19/28] memory: move preallocation code out of exec.c Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 20/28] memory: move RAM_PREALLOC_MASK to exec.c, rename Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 21/28] hostmem: add file-based HostMemoryBackend Paolo Bonzini
2014-03-04 17:38   ` Eric Blake
2014-03-04 18:12     ` Paolo Bonzini
2014-03-07  6:57   ` Hu Tao
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 22/28] hostmem: separate allocation from UserCreatable complete method Paolo Bonzini
2014-03-07  7:08   ` Hu Tao
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 23/28] hostmem: add merge and dump properties Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 24/28] hostmem: allow preallocation of any memory region Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 25/28] hostmem: add property to map memory with MAP_SHARED Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 26/28] configure: add Linux libnuma detection Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 27/28] hostmem: add properties for NUMA memory policy Paolo Bonzini
2014-03-04 14:00 ` [Qemu-devel] [PATCH 2.1 28/28] qmp: add query-memdev Paolo Bonzini
2014-03-04 17:37   ` Eric Blake
2014-03-04 18:11     ` Paolo Bonzini
2014-03-05  3:50       ` Hu Tao
2014-03-05  8:17         ` Paolo Bonzini
2014-03-05  3:48   ` Hu Tao
2014-03-05 11:05 ` [Qemu-devel] [PATCH 2.1 00/28] Current state of NUMA series, and hostmem improvements Andreas Färber
2014-03-05 11:30   ` Paolo Bonzini
2014-03-07 11:59     ` Andreas Färber
2014-03-07 12:20       ` Paolo Bonzini
2014-03-07 12:56         ` Igor Mammedov
2014-03-07 13:35           ` Paolo Bonzini
2014-03-07 14:54             ` Igor Mammedov

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=5319797C.7040907@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=a.motakis@virtualopensystems.com \
    --cc=ehabkost@redhat.com \
    --cc=gaowanlong@cn.fujitsu.com \
    --cc=hutao@cn.fujitsu.com \
    --cc=imammedo@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=qemu-devel@nongnu.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 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).