cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

replication.c (2530B)


      1/*
      2 * Replication filter
      3 *
      4 * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
      5 * Copyright (c) 2016 Intel Corporation
      6 * Copyright (c) 2016 FUJITSU LIMITED
      7 *
      8 * Author:
      9 *   Changlong Xie <xiecl.fnst@cn.fujitsu.com>
     10 *
     11 * This work is licensed under the terms of the GNU GPL, version 2 or later.
     12 * See the COPYING file in the top-level directory.
     13 */
     14
     15#include "qemu/osdep.h"
     16#include "qapi/error.h"
     17#include "block/replication.h"
     18
     19static QLIST_HEAD(, ReplicationState) replication_states;
     20
     21ReplicationState *replication_new(void *opaque, ReplicationOps *ops)
     22{
     23    ReplicationState *rs;
     24
     25    assert(ops != NULL);
     26    rs = g_new0(ReplicationState, 1);
     27    rs->opaque = opaque;
     28    rs->ops = ops;
     29    QLIST_INSERT_HEAD(&replication_states, rs, node);
     30
     31    return rs;
     32}
     33
     34void replication_remove(ReplicationState *rs)
     35{
     36    if (rs) {
     37        QLIST_REMOVE(rs, node);
     38        g_free(rs);
     39    }
     40}
     41
     42/*
     43 * The caller of the function MUST make sure vm stopped
     44 */
     45void replication_start_all(ReplicationMode mode, Error **errp)
     46{
     47    ReplicationState *rs, *next;
     48    Error *local_err = NULL;
     49
     50    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
     51        if (rs->ops && rs->ops->start) {
     52            rs->ops->start(rs, mode, &local_err);
     53        }
     54        if (local_err) {
     55            error_propagate(errp, local_err);
     56            return;
     57        }
     58    }
     59}
     60
     61void replication_do_checkpoint_all(Error **errp)
     62{
     63    ReplicationState *rs, *next;
     64    Error *local_err = NULL;
     65
     66    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
     67        if (rs->ops && rs->ops->checkpoint) {
     68            rs->ops->checkpoint(rs, &local_err);
     69        }
     70        if (local_err) {
     71            error_propagate(errp, local_err);
     72            return;
     73        }
     74    }
     75}
     76
     77void replication_get_error_all(Error **errp)
     78{
     79    ReplicationState *rs, *next;
     80    Error *local_err = NULL;
     81
     82    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
     83        if (rs->ops && rs->ops->get_error) {
     84            rs->ops->get_error(rs, &local_err);
     85        }
     86        if (local_err) {
     87            error_propagate(errp, local_err);
     88            return;
     89        }
     90    }
     91}
     92
     93void replication_stop_all(bool failover, Error **errp)
     94{
     95    ReplicationState *rs, *next;
     96    Error *local_err = NULL;
     97
     98    QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
     99        if (rs->ops && rs->ops->stop) {
    100            rs->ops->stop(rs, failover, &local_err);
    101        }
    102        if (local_err) {
    103            error_propagate(errp, local_err);
    104            return;
    105        }
    106    }
    107}