mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
vmstate: Allow dynamic allocation for VBUFFER during migration
This extends use of VMS_ALLOC flag from arrays to VBUFFER as well. This defines VMSTATE_VBUFFER_ALLOC_UINT32 which makes use of VMS_ALLOC and uses uint32_t type for a size. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
7ea2d269cb
commit
94ed706d53
2 changed files with 21 additions and 3 deletions
|
@ -484,6 +484,17 @@ extern const VMStateInfo vmstate_info_bitmap;
|
||||||
.start = (_start), \
|
.start = (_start), \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VMSTATE_VBUFFER_ALLOC_UINT32(_field, _state, _version, _test, _start, _field_size) { \
|
||||||
|
.name = (stringify(_field)), \
|
||||||
|
.version_id = (_version), \
|
||||||
|
.field_exists = (_test), \
|
||||||
|
.size_offset = vmstate_offset_value(_state, _field_size, uint32_t),\
|
||||||
|
.info = &vmstate_info_buffer, \
|
||||||
|
.flags = VMS_VBUFFER|VMS_POINTER|VMS_ALLOC, \
|
||||||
|
.offset = offsetof(_state, _field), \
|
||||||
|
.start = (_start), \
|
||||||
|
}
|
||||||
|
|
||||||
#define VMSTATE_BUFFER_UNSAFE_INFO(_field, _state, _version, _info, _size) { \
|
#define VMSTATE_BUFFER_UNSAFE_INFO(_field, _state, _version, _info, _size) { \
|
||||||
.name = (stringify(_field)), \
|
.name = (stringify(_field)), \
|
||||||
.version_id = (_version), \
|
.version_id = (_version), \
|
||||||
|
|
13
vmstate.c
13
vmstate.c
|
@ -49,9 +49,16 @@ static void *vmstate_base_addr(void *opaque, VMStateField *field, bool alloc)
|
||||||
|
|
||||||
if (field->flags & VMS_POINTER) {
|
if (field->flags & VMS_POINTER) {
|
||||||
if (alloc && (field->flags & VMS_ALLOC)) {
|
if (alloc && (field->flags & VMS_ALLOC)) {
|
||||||
int n_elems = vmstate_n_elems(opaque, field);
|
gsize size = 0;
|
||||||
if (n_elems) {
|
if (field->flags & VMS_VBUFFER) {
|
||||||
gsize size = n_elems * field->size;
|
size = vmstate_size(opaque, field);
|
||||||
|
} else {
|
||||||
|
int n_elems = vmstate_n_elems(opaque, field);
|
||||||
|
if (n_elems) {
|
||||||
|
size = n_elems * field->size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
*((void **)base_addr + field->start) = g_malloc(size);
|
*((void **)base_addr + field->start) = g_malloc(size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue