Commit 94ed706d authored by Alexey Kardashevskiy's avatar Alexey Kardashevskiy Committed by Juan Quintela
Browse files

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: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: default avatarJuan Quintela <quintela@redhat.com>
parent 7ea2d269
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -484,6 +484,17 @@ extern const VMStateInfo vmstate_info_bitmap;
    .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) { \
    .name       = (stringify(_field)),                               \
    .version_id = (_version),                                        \
+10 −3
Original line number Diff line number Diff line
@@ -49,9 +49,16 @@ static void *vmstate_base_addr(void *opaque, VMStateField *field, bool alloc)

    if (field->flags & VMS_POINTER) {
        if (alloc && (field->flags & VMS_ALLOC)) {
            gsize size = 0;
            if (field->flags & VMS_VBUFFER) {
                size = vmstate_size(opaque, field);
            } else {
                int n_elems = vmstate_n_elems(opaque, field);
                if (n_elems) {
                gsize size = n_elems * field->size;
                    size = n_elems * field->size;
                }
            }
            if (size) {
                *((void **)base_addr + field->start) = g_malloc(size);
            }
        }