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