Commit 0b183fc8 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Michael S. Tsirkin
Browse files

memory: move mem_path handling to memory_region_allocate_system_memory



Like the previous patch did in exec.c, split memory_region_init_ram and
memory_region_init_ram_from_file, and push mem_path one step further up.
Other RAM regions than system memory will now be backed by regular RAM.

Also, boards that do not use memory_region_allocate_system_memory will
not support -mem-path anymore.  This can be changed before the patches
are merged by migrating boards to use the function.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarHu Tao <hutao@cn.fujitsu.com>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 7febe36f
Loading
Loading
Loading
Loading
+2 −8
Original line number Original line Diff line number Diff line
@@ -1090,14 +1090,6 @@ error:
    }
    }
    return NULL;
    return NULL;
}
}
#else
static void *file_ram_alloc(RAMBlock *block,
                            ram_addr_t memory,
                            const char *path)
{
    fprintf(stderr, "-mem-path not supported on this host\n");
    exit(1);
}
#endif
#endif


static ram_addr_t find_ram_offset(ram_addr_t size)
static ram_addr_t find_ram_offset(ram_addr_t size)
@@ -1287,6 +1279,7 @@ static ram_addr_t ram_block_add(RAMBlock *new_block)
    return new_block->offset;
    return new_block->offset;
}
}


#ifdef __linux__
ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                    const char *mem_path)
                                    const char *mem_path)
{
{
@@ -1315,6 +1308,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
    new_block->host = file_ram_alloc(new_block, size, mem_path);
    new_block->host = file_ram_alloc(new_block, size, mem_path);
    return ram_block_add(new_block);
    return ram_block_add(new_block);
}
}
#endif


ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
                                   MemoryRegion *mr)
                                   MemoryRegion *mr)
+18 −0
Original line number Original line Diff line number Diff line
@@ -311,6 +311,24 @@ void memory_region_init_ram(MemoryRegion *mr,
                            const char *name,
                            const char *name,
                            uint64_t size);
                            uint64_t size);


#ifdef __linux__
/**
 * memory_region_init_ram_from_file:  Initialize RAM memory region with a
 *                                    mmap-ed backend.
 *
 * @mr: the #MemoryRegion to be initialized.
 * @owner: the object that tracks the region's reference count
 * @name: the name of the region.
 * @size: size of the region.
 * @path: the path in which to allocate the RAM.
 */
void memory_region_init_ram_from_file(MemoryRegion *mr,
                                      struct Object *owner,
                                      const char *name,
                                      uint64_t size,
                                      const char *path);
#endif

/**
/**
 * memory_region_init_ram_ptr:  Initialize RAM memory region from a
 * memory_region_init_ram_ptr:  Initialize RAM memory region from a
 *                              user-provided pointer.  Accesses into the
 *                              user-provided pointer.  Accesses into the
+16 −5
Original line number Original line Diff line number Diff line
@@ -1030,12 +1030,23 @@ void memory_region_init_ram(MemoryRegion *mr,
    mr->ram = true;
    mr->ram = true;
    mr->terminates = true;
    mr->terminates = true;
    mr->destructor = memory_region_destructor_ram;
    mr->destructor = memory_region_destructor_ram;
    if (mem_path) {
        mr->ram_addr = qemu_ram_alloc_from_file(size, mr, mem_path);
    } else {
    mr->ram_addr = qemu_ram_alloc(size, mr);
    mr->ram_addr = qemu_ram_alloc(size, mr);
}
}

#ifdef __linux__
void memory_region_init_ram_from_file(MemoryRegion *mr,
                                      struct Object *owner,
                                      const char *name,
                                      uint64_t size,
                                      const char *path)
{
    memory_region_init(mr, owner, name, size);
    mr->ram = true;
    mr->terminates = true;
    mr->destructor = memory_region_destructor_ram;
    mr->ram_addr = qemu_ram_alloc_from_file(size, mr, path);
}
}
#endif


void memory_region_init_ram_ptr(MemoryRegion *mr,
void memory_region_init_ram_ptr(MemoryRegion *mr,
                                Object *owner,
                                Object *owner,
+10 −1
Original line number Original line Diff line number Diff line
@@ -228,7 +228,16 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
                                           const char *name,
                                           const char *name,
                                           uint64_t ram_size)
                                           uint64_t ram_size)
{
{
    if (mem_path) {
#ifdef __linux__
        memory_region_init_ram_from_file(mr, owner, name, ram_size, mem_path);
#else
        fprintf(stderr, "-mem-path not supported on this host\n");
        exit(1);
#endif
    } else {
        memory_region_init_ram(mr, owner, name, ram_size);
        memory_region_init_ram(mr, owner, name, ram_size);
    }
    vmstate_register_ram_global(mr);
    vmstate_register_ram_global(mr);
}
}