From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:52829) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQWun-0006Xg-LB for qemu-devel@nongnu.org; Fri, 12 Apr 2013 01:52:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UQWul-00081i-2t for qemu-devel@nongnu.org; Fri, 12 Apr 2013 01:52:49 -0400 Received: from e39.co.us.ibm.com ([32.97.110.160]:39544) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQWuk-00081d-T8 for qemu-devel@nongnu.org; Fri, 12 Apr 2013 01:52:47 -0400 Received: from /spool/local by e39.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 11 Apr 2013 23:52:46 -0600 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id 0E10338C804D for ; Fri, 12 Apr 2013 01:52:43 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3C5qgRF282734 for ; Fri, 12 Apr 2013 01:52:42 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3C5qgMY001621 for ; Fri, 12 Apr 2013 02:52:42 -0300 From: mrhines@linux.vnet.ibm.com Date: Fri, 12 Apr 2013 01:52:05 -0400 Message-Id: <1365745929-24871-5-git-send-email-mrhines@linux.vnet.ibm.com> In-Reply-To: <1365745929-24871-3-git-send-email-mrhines@linux.vnet.ibm.com> References: <1365745929-24871-3-git-send-email-mrhines@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 4/8] rdma: implement new QEMUFileOps hooks List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, mst@redhat.com, owasserm@redhat.com, abali@us.ibm.com, mrhines@us.ibm.com, gokul@us.ibm.com, pbonzini@redhat.com From: "Michael R. Hines" These are the actual definitions of the accessor methods which call out to QEMUFileOps hooks during the RAM iteration faces. These hooks are accessed by arch_init.c, which comes later in the patch series. Signed-off-by: Michael R. Hines --- savevm.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 7 deletions(-) diff --git a/savevm.c b/savevm.c index b1d8988..fb452fc 100644 --- a/savevm.c +++ b/savevm.c @@ -409,14 +409,23 @@ static const QEMUFileOps socket_write_ops = { .close = socket_close }; -QEMUFile *qemu_fopen_socket(int fd, const char *mode) +bool qemu_file_mode_is_not_valid(const char *mode) { - QEMUFileSocket *s = g_malloc0(sizeof(QEMUFileSocket)); - if (mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 'b' || mode[2] != 0) { fprintf(stderr, "qemu_fopen: Argument validity check failed\n"); + return true; + } + + return false; +} + +QEMUFile *qemu_fopen_socket(int fd, const char *mode) +{ + QEMUFileSocket *s = g_malloc0(sizeof(QEMUFileSocket)); + + if (qemu_file_mode_is_not_valid(mode)) { return NULL; } @@ -434,10 +443,7 @@ QEMUFile *qemu_fopen(const char *filename, const char *mode) { QEMUFileStdio *s; - if (mode == NULL || - (mode[0] != 'r' && mode[0] != 'w') || - mode[1] != 'b' || mode[2] != 0) { - fprintf(stderr, "qemu_fopen: Argument validity check failed\n"); + if (qemu_file_mode_is_not_valid(mode)) { return NULL; } @@ -554,6 +560,67 @@ static void qemu_fflush(QEMUFile *f) } } +void ram_control_before_iterate(QEMUFile *f, uint32_t flags) +{ + int ret = 0; + + if (f->ops->before_ram_iterate) { + qemu_fflush(f); + ret = f->ops->before_ram_iterate(f, f->opaque, flags); + if (ret < 0) { + qemu_file_set_error(f, ret); + } + } +} + +void ram_control_after_iterate(QEMUFile *f, uint32_t flags) +{ + int ret = 0; + + if (f->ops->after_ram_iterate) { + qemu_fflush(f); + ret = f->ops->after_ram_iterate(f, f->opaque, flags); + if (ret < 0) { + qemu_file_set_error(f, ret); + } + } +} + +void ram_control_load_hook(QEMUFile *f, uint32_t flags) +{ + int ret = 0; + + if (f->ops->hook_ram_load) { + qemu_fflush(f); + ret = f->ops->hook_ram_load(f, f->opaque, flags); + if (ret < 0) { + qemu_file_set_error(f, ret); + } + } +} + +size_t ram_control_save_page(QEMUFile *f, + ram_addr_t block_offset, + ram_addr_t offset, + size_t size, uint8_t *va) +{ + if (f->ops->save_page) { + size_t bytes; + + qemu_fflush(f); + + bytes = f->ops->save_page(f, f->opaque, block_offset, offset, size, va); + + if (bytes > 0) { + f->pos += bytes; + } + + return bytes; + } + + return -1; +} + static void qemu_fill_buffer(QEMUFile *f) { int len; -- 1.7.10.4