Commit 2c21ee76 authored by Jianjun Duan's avatar Jianjun Duan Committed by Dr. David Alan Gilbert
Browse files

migration: extend VMStateInfo



Current migration code cannot handle some data structures such as
QTAILQ in qemu/queue.h. Here we extend the signatures of put/get
in VMStateInfo so that customized handling is supported. put now
will return int type.

Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>

Signed-off-by: default avatarJianjun Duan <duanj@linux.vnet.ibm.com>
Message-Id: <1484852453-12728-2-git-send-email-duanj@linux.vnet.ibm.com>
Signed-off-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
parent d7fc72ce
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1003,7 +1003,8 @@ static const VMStateDescription vmstate_virtio_gpu_scanouts = {
    },
};

static void virtio_gpu_save(QEMUFile *f, void *opaque, size_t size)
static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
                           VMStateField *field, QJSON *vmdesc)
{
    VirtIOGPU *g = opaque;
    struct virtio_gpu_simple_resource *res;
@@ -1028,9 +1029,12 @@ static void virtio_gpu_save(QEMUFile *f, void *opaque, size_t size)
    qemu_put_be32(f, 0); /* end of list */

    vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL);

    return 0;
}

static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size)
static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
                           VMStateField *field)
{
    VirtIOGPU *g = opaque;
    struct virtio_gpu_simple_resource *res;
+6 −2
Original line number Diff line number Diff line
@@ -286,7 +286,8 @@ static void kvm_s390_release_adapter_routes(S390FLICState *fs,
 * increase until buffer is sufficient or maxium size is
 * reached
 */
static void kvm_flic_save(QEMUFile *f, void *opaque, size_t size)
static int kvm_flic_save(QEMUFile *f, void *opaque, size_t size,
                         VMStateField *field, QJSON *vmdesc)
{
    KVMS390FLICState *flic = opaque;
    int len = FLIC_SAVE_INITIAL_SIZE;
@@ -319,6 +320,8 @@ static void kvm_flic_save(QEMUFile *f, void *opaque, size_t size)
                        count * sizeof(struct kvm_s390_irq));
    }
    g_free(buf);

    return 0;
}

/**
@@ -331,7 +334,8 @@ static void kvm_flic_save(QEMUFile *f, void *opaque, size_t size)
 * Note: Do nothing when no interrupts where stored
 * in QEMUFile
 */
static int kvm_flic_load(QEMUFile *f, void *opaque, size_t size)
static int kvm_flic_load(QEMUFile *f, void *opaque, size_t size,
                         VMStateField *field)
{
    uint64_t len = 0;
    uint64_t count = 0;
+18 −6
Original line number Diff line number Diff line
@@ -2451,7 +2451,8 @@ static void vmxnet3_put_tx_stats_to_file(QEMUFile *f,
    qemu_put_be64(f, tx_stat->pktsTxDiscard);
}

static int vmxnet3_get_txq_descr(QEMUFile *f, void *pv, size_t size)
static int vmxnet3_get_txq_descr(QEMUFile *f, void *pv, size_t size,
    VMStateField *field)
{
    Vmxnet3TxqDescr *r = pv;

@@ -2465,7 +2466,8 @@ static int vmxnet3_get_txq_descr(QEMUFile *f, void *pv, size_t size)
    return 0;
}

static void vmxnet3_put_txq_descr(QEMUFile *f, void *pv, size_t size)
static int vmxnet3_put_txq_descr(QEMUFile *f, void *pv, size_t size,
                                 VMStateField *field, QJSON *vmdesc)
{
    Vmxnet3TxqDescr *r = pv;

@@ -2474,6 +2476,8 @@ static void vmxnet3_put_txq_descr(QEMUFile *f, void *pv, size_t size)
    qemu_put_byte(f, r->intr_idx);
    qemu_put_be64(f, r->tx_stats_pa);
    vmxnet3_put_tx_stats_to_file(f, &r->txq_stats);

    return 0;
}

static const VMStateInfo txq_descr_info = {
@@ -2512,7 +2516,8 @@ static void vmxnet3_put_rx_stats_to_file(QEMUFile *f,
    qemu_put_be64(f, rx_stat->pktsRxError);
}

static int vmxnet3_get_rxq_descr(QEMUFile *f, void *pv, size_t size)
static int vmxnet3_get_rxq_descr(QEMUFile *f, void *pv, size_t size,
    VMStateField *field)
{
    Vmxnet3RxqDescr *r = pv;
    int i;
@@ -2530,7 +2535,8 @@ static int vmxnet3_get_rxq_descr(QEMUFile *f, void *pv, size_t size)
    return 0;
}

static void vmxnet3_put_rxq_descr(QEMUFile *f, void *pv, size_t size)
static int vmxnet3_put_rxq_descr(QEMUFile *f, void *pv, size_t size,
                                 VMStateField *field, QJSON *vmdesc)
{
    Vmxnet3RxqDescr *r = pv;
    int i;
@@ -2543,6 +2549,8 @@ static void vmxnet3_put_rxq_descr(QEMUFile *f, void *pv, size_t size)
    qemu_put_byte(f, r->intr_idx);
    qemu_put_be64(f, r->rx_stats_pa);
    vmxnet3_put_rx_stats_to_file(f, &r->rxq_stats);

    return 0;
}

static int vmxnet3_post_load(void *opaque, int version_id)
@@ -2575,7 +2583,8 @@ static const VMStateInfo rxq_descr_info = {
    .put = vmxnet3_put_rxq_descr
};

static int vmxnet3_get_int_state(QEMUFile *f, void *pv, size_t size)
static int vmxnet3_get_int_state(QEMUFile *f, void *pv, size_t size,
    VMStateField *field)
{
    Vmxnet3IntState *r = pv;

@@ -2586,13 +2595,16 @@ static int vmxnet3_get_int_state(QEMUFile *f, void *pv, size_t size)
    return 0;
}

static void vmxnet3_put_int_state(QEMUFile *f, void *pv, size_t size)
static int vmxnet3_put_int_state(QEMUFile *f, void *pv, size_t size,
                                 VMStateField *field, QJSON *vmdesc)
{
    Vmxnet3IntState *r = pv;

    qemu_put_byte(f, r->is_masked);
    qemu_put_byte(f, r->is_pending);
    qemu_put_byte(f, r->is_asserted);

    return 0;
}

static const VMStateInfo int_state_info = {
+6 −2
Original line number Diff line number Diff line
@@ -94,18 +94,22 @@ struct _eeprom_t {
   This is a Big hack, but it is how the old state did it.
 */

static int get_uint16_from_uint8(QEMUFile *f, void *pv, size_t size)
static int get_uint16_from_uint8(QEMUFile *f, void *pv, size_t size,
                                 VMStateField *field)
{
    uint16_t *v = pv;
    *v = qemu_get_ubyte(f);
    return 0;
}

static void put_unused(QEMUFile *f, void *pv, size_t size)
static int put_unused(QEMUFile *f, void *pv, size_t size, VMStateField *field,
                      QJSON *vmdesc)
{
    fprintf(stderr, "uint16_from_uint8 is used only for backwards compatibility.\n");
    fprintf(stderr, "Never should be used to write a new state.\n");
    exit(0);

    return 0;
}

static const VMStateInfo vmstate_hack_uint16_from_uint8 = {
+6 −2
Original line number Diff line number Diff line
@@ -555,17 +555,21 @@ static void fw_cfg_reset(DeviceState *d)
   Or we broke compatibility in the state, or we can't use struct tm
 */

static int get_uint32_as_uint16(QEMUFile *f, void *pv, size_t size)
static int get_uint32_as_uint16(QEMUFile *f, void *pv, size_t size,
                                VMStateField *field)
{
    uint32_t *v = pv;
    *v = qemu_get_be16(f);
    return 0;
}

static void put_unused(QEMUFile *f, void *pv, size_t size)
static int put_unused(QEMUFile *f, void *pv, size_t size, VMStateField *field,
                      QJSON *vmdesc)
{
    fprintf(stderr, "uint32_as_uint16 is only used for backward compatibility.\n");
    fprintf(stderr, "This functions shouldn't be called.\n");

    return 0;
}

static const VMStateInfo vmstate_hack_uint32_as_uint16 = {
Loading