From patchwork Sat Jun 29 01:41:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhanghaoyu (A)" X-Patchwork-Id: 255703 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 0D9D42C00A3 for ; Sat, 29 Jun 2013 11:42:46 +1000 (EST) Received: from localhost ([::1]:34403 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UskBW-00082P-Vy for incoming@patchwork.ozlabs.org; Fri, 28 Jun 2013 21:42:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51409) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UskBI-00082J-7J for qemu-devel@nongnu.org; Fri, 28 Jun 2013 21:42:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UskBG-0001oi-Uy for qemu-devel@nongnu.org; Fri, 28 Jun 2013 21:42:28 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:63437) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UskBG-0001oF-D5 for qemu-devel@nongnu.org; Fri, 28 Jun 2013 21:42:26 -0400 Received: from 172.24.2.119 (EHLO szxeml211-edg.china.huawei.com) ([172.24.2.119]) by szxrg03-dlp.huawei.com (MOS 4.4.2a-FCS FastPath queued) with ESMTP id ABJ48403; Sat, 29 Jun 2013 09:42:20 +0800 (CST) Received: from SZXEML422-HUB.china.huawei.com (10.82.67.161) by szxeml211-edg.china.huawei.com (172.24.2.182) with Microsoft SMTP Server (TLS) id 14.1.323.7; Sat, 29 Jun 2013 09:42:10 +0800 Received: from szxeml556-mbx.china.huawei.com ([169.254.3.163]) by szxeml422-hub.china.huawei.com ([10.82.67.161]) with mapi id 14.01.0323.007; Sat, 29 Jun 2013 09:41:58 +0800 From: "Zhanghaoyu (A)" To: qemu-devel Thread-Topic: [PATCH] migration: add timeout option for tcp migraion send/receive socket Thread-Index: Ac50adXifFJHfBByR2mXy5/atzhMPQ== Date: Sat, 29 Jun 2013 01:41:57 +0000 Message-ID: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.135.68.97] MIME-Version: 1.0 X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.66 Cc: Zengjunliang , Luonengjun , "Huangweidong \(C\)" , "Wangrui \(K\)" Subject: [Qemu-devel] [PATCH] migration: add timeout option for tcp migraion send/receive socket X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org When network disconnection occurs during live migration, the migration thread will be stuck in the function sendmsg(), as the migration socket is in ~O_NONBLOCK mode now. Signed-off-by: Zeng Junliang --- include/migration/migration.h | 4 ++++ migration-tcp.c | 23 ++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletions(-) \ No newline at end of file diff --git a/include/migration/migration.h b/include/migration/migration.h index f0640e0..1a56248 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -23,6 +23,8 @@ #include "qapi-types.h" #include "exec/cpu-common.h" +#define QEMU_MIGRATE_SOCKET_OP_TIMEOUT 60 + struct MigrationParams { bool blk; bool shared; @@ -109,6 +111,8 @@ uint64_t xbzrle_mig_pages_transferred(void); uint64_t xbzrle_mig_pages_overflow(void); uint64_t xbzrle_mig_pages_cache_miss(void); +int tcp_migration_set_socket_timeout(int fd, int optname, int timeout_in_sec); + /** * @migrate_add_blocker - prevent migration from proceeding * diff --git a/migration-tcp.c b/migration-tcp.c index b20ee58..391db0a 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -33,7 +33,7 @@ static void tcp_wait_for_connect(int fd, void *opaque) { MigrationState *s = opaque; - if (fd < 0) { + if (tcp_migration_set_socket_timeout(fd, SO_SNDTIMEO, QEMU_MIGRATE_SOCKET_OP_TIMEOUT) < 0) { DPRINTF("migrate connect error\n"); s->file = NULL; migrate_fd_error(s); @@ -76,6 +76,10 @@ static void tcp_accept_incoming_migration(void *opaque) goto out; } + if (tcp_migration_set_socket_timeout(c, SO_RCVTIMEO, QEMU_MIGRATE_SOCKET_OP_TIMEOUT) < 0) { + fprintf(stderr, "set tcp migration socket receive timeout error\n"); + goto out; + } process_incoming_migration(f); return; @@ -95,3 +99,20 @@ void tcp_start_incoming_migration(const char *host_port, Error **errp) qemu_set_fd_handler2(s, NULL, tcp_accept_incoming_migration, NULL, (void *)(intptr_t)s); } + +int tcp_migration_set_socket_timeout(int fd, int optname, int timeout_in_sec) +{ + struct timeval timeout; + int ret = 0; + + if (fd < 0 || timeout_in_sec < 0 || + (optname != SO_RCVTIMEO && optname != SO_SNDTIMEO)) + return -1; + + timeout.tv_sec = timeout_in_sec; + timeout.tv_usec = 0; + + ret = qemu_setsockopt(fd, SOL_SOCKET, optname, &timeout, sizeof(timeout)); + + return ret; +}