From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50083) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmKyS-0007in-FS for qemu-devel@nongnu.org; Fri, 29 Nov 2013 05:07:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VmKyJ-0007u6-C0 for qemu-devel@nongnu.org; Fri, 29 Nov 2013 05:07:00 -0500 Received: from e23smtp02.au.ibm.com ([202.81.31.144]:35730) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmKyI-0007tE-KN for qemu-devel@nongnu.org; Fri, 29 Nov 2013 05:06:51 -0500 Received: from /spool/local by e23smtp02.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 29 Nov 2013 20:06:46 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id C054A3578055 for ; Fri, 29 Nov 2013 21:06:43 +1100 (EST) Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id rAT9maAN60882958 for ; Fri, 29 Nov 2013 20:48:37 +1100 Received: from d23av01.au.ibm.com (localhost [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id rATA6g2L012250 for ; Fri, 29 Nov 2013 21:06:43 +1100 From: Lei Li Date: Fri, 29 Nov 2013 18:06:12 +0800 Message-Id: <1385719584-21114-6-git-send-email-lilei@linux.vnet.ibm.com> In-Reply-To: <1385719584-21114-1-git-send-email-lilei@linux.vnet.ibm.com> References: <1385719584-21114-1-git-send-email-lilei@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 05/17] migration-local: introduce qemu_fopen_socket_local() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aarcange@redhat.com, Lei Li , quintela@redhat.com, mrhines@linux.vnet.ibm.com, aliguori@amazon.com, lagarcia@br.ibm.com, pbonzini@redhat.com, rcj@linux.vnet.ibm.com Add qemu_fopen_socket_local() to open QEMUFileLocal introduced earlier. It will create a pipe in write mode if unix_page_flipping is enabled, adjust qemu_local_close() to close pipe as well. Signed-off-by: Lei Li --- include/migration/qemu-file.h | 2 + migration-local.c | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-) diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h index 0f757fb..f9b104a 100644 --- a/include/migration/qemu-file.h +++ b/include/migration/qemu-file.h @@ -99,6 +99,8 @@ QEMUFile *qemu_fopen(const char *filename, const char *mode); QEMUFile *qemu_fdopen(int fd, const char *mode); QEMUFile *qemu_fopen_socket(int fd, const char *mode); QEMUFile *qemu_popen_cmd(const char *command, const char *mode); +QEMUFile *qemu_fopen_socket_local(int sockfd, const char *mode); + int qemu_get_fd(QEMUFile *f); int qemu_fclose(QEMUFile *f); int64_t qemu_ftell(QEMUFile *f); diff --git a/migration-local.c b/migration-local.c index ca01a20..929ed60 100644 --- a/migration-local.c +++ b/migration-local.c @@ -105,6 +105,12 @@ static int qemu_local_close(void *opaque) QEMUFileLocal *s = opaque; closesocket(s->sockfd); + + if (s->unix_page_flipping) { + close(s->pipefd[0]); + close(s->pipefd[1]); + } + g_free(s); return 0; @@ -121,3 +127,43 @@ static const QEMUFileOps pipe_write_ops = { .writev_buffer = qemu_local_writev_buffer, .close = qemu_local_close, }; + +QEMUFile *qemu_fopen_socket_local(int sockfd, const char *mode) +{ + QEMUFileLocal *s; + int pipefd[2]; + + if (qemu_file_mode_is_not_valid(mode)) { + return NULL; + } + + s = g_malloc0(sizeof(QEMUFileLocal)); + s->sockfd = sockfd; + + if (migrate_unix_page_flipping()) { + s->unix_page_flipping = 1; + } + + if (mode[0] == 'w') { + if (s->unix_page_flipping) { + if (pipe(pipefd) < 0) { + fprintf(stderr, "failed to create PIPE\n"); + goto fail; + } + + s->pipefd[0] = pipefd[0]; + s->pipefd[1] = pipefd[1]; + } + + qemu_set_block(s->sockfd); + s->file = qemu_fopen_ops(s, &pipe_write_ops); + } else { + s->file = qemu_fopen_ops(s, &pipe_read_ops); + } + + return s->file; + +fail: + g_free(s); + return NULL; +} -- 1.7.7.6