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
					
				| 
						 | 
				
			
			@ -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),                                        \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										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 (alloc && (field->flags & VMS_ALLOC)) {
 | 
			
		||||
            int n_elems = vmstate_n_elems(opaque, field);
 | 
			
		||||
            if (n_elems) {
 | 
			
		||||
                gsize size = n_elems * field->size;
 | 
			
		||||
            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) {
 | 
			
		||||
                    size = n_elems * field->size;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (size) {
 | 
			
		||||
                *((void **)base_addr + field->start) = g_malloc(size);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue