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