hostmem-file: Add "discard-data" option

The new option can be used to indicate that the file contents can
be destroyed and don't need to be flushed to disk when QEMU exits
or when the memory backend object is removed.

Internally, it will trigger a madvise(MADV_REMOVE) call when the
memory backend is removed.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Message-Id: <20170824192315.5897-4-ehabkost@redhat.com>
[ehabkost: fixup: improved documentation]
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Tested-by: Zack Cornelius <zack.cornelius@kove.net>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
Eduardo Habkost 2017-08-24 16:23:15 -03:00
parent 0f81d33530
commit 11ae6ed8af
2 changed files with 36 additions and 1 deletions

View File

@ -32,6 +32,7 @@ struct HostMemoryBackendFile {
HostMemoryBackend parent_obj; HostMemoryBackend parent_obj;
bool share; bool share;
bool discard_data;
char *mem_path; char *mem_path;
}; };
@ -103,16 +104,44 @@ static void file_memory_backend_set_share(Object *o, bool value, Error **errp)
fb->share = value; fb->share = value;
} }
static bool file_memory_backend_get_discard_data(Object *o, Error **errp)
{
return MEMORY_BACKEND_FILE(o)->discard_data;
}
static void file_memory_backend_set_discard_data(Object *o, bool value,
Error **errp)
{
MEMORY_BACKEND_FILE(o)->discard_data = value;
}
static void file_backend_unparent(Object *obj)
{
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(obj);
if (host_memory_backend_mr_inited(backend) && fb->discard_data) {
void *ptr = memory_region_get_ram_ptr(&backend->mr);
uint64_t sz = memory_region_size(&backend->mr);
qemu_madvise(ptr, sz, QEMU_MADV_REMOVE);
}
}
static void static void
file_backend_class_init(ObjectClass *oc, void *data) file_backend_class_init(ObjectClass *oc, void *data)
{ {
HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc); HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
bc->alloc = file_backend_memory_alloc; bc->alloc = file_backend_memory_alloc;
oc->unparent = file_backend_unparent;
object_class_property_add_bool(oc, "share", object_class_property_add_bool(oc, "share",
file_memory_backend_get_share, file_memory_backend_set_share, file_memory_backend_get_share, file_memory_backend_set_share,
&error_abort); &error_abort);
object_class_property_add_bool(oc, "discard-data",
file_memory_backend_get_discard_data, file_memory_backend_set_discard_data,
&error_abort);
object_class_property_add_str(oc, "mem-path", object_class_property_add_str(oc, "mem-path",
get_mem_path, set_mem_path, get_mem_path, set_mem_path,
&error_abort); &error_abort);

View File

@ -4182,7 +4182,7 @@ property must be set. These objects are placed in the
@table @option @table @option
@item -object memory-backend-file,id=@var{id},size=@var{size},mem-path=@var{dir},share=@var{on|off} @item -object memory-backend-file,id=@var{id},size=@var{size},mem-path=@var{dir},share=@var{on|off},discard-data=@var{on|off}
Creates a memory file backend object, which can be used to back Creates a memory file backend object, which can be used to back
the guest RAM with huge pages. The @option{id} parameter is a the guest RAM with huge pages. The @option{id} parameter is a
@ -4194,6 +4194,12 @@ the path to either a shared memory or huge page filesystem mount.
The @option{share} boolean option determines whether the memory The @option{share} boolean option determines whether the memory
region is marked as private to QEMU, or shared. The latter allows region is marked as private to QEMU, or shared. The latter allows
a co-operating external process to access the QEMU memory region. a co-operating external process to access the QEMU memory region.
Setting the @option{discard-data} boolean option to @var{on}
indicates that file contents can be destroyed when QEMU exits,
to avoid unnecessarily flushing data to the backing file. Note
that @option{discard-data} is only an optimization, and QEMU
might not discard file contents if it aborts unexpectedly or is
terminated using SIGKILL.
@item -object rng-random,id=@var{id},filename=@var{/dev/random} @item -object rng-random,id=@var{id},filename=@var{/dev/random}