From patchwork Mon Oct 3 18:24:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jianjun Duan X-Patchwork-Id: 9360791 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1EF2E601C0 for ; Mon, 3 Oct 2016 18:29:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 07AF3289CB for ; Mon, 3 Oct 2016 18:29:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EFC6B289DA; Mon, 3 Oct 2016 18:29:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 61D1A289CB for ; Mon, 3 Oct 2016 18:29:29 +0000 (UTC) Received: from localhost ([::1]:38583 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1br7zU-0003fJ-85 for patchwork-qemu-devel@patchwork.kernel.org; Mon, 03 Oct 2016 14:29:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36269) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1br7vR-0000kD-TU for qemu-devel@nongnu.org; Mon, 03 Oct 2016 14:25:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1br7vN-0004GT-Ik for qemu-devel@nongnu.org; Mon, 03 Oct 2016 14:25:16 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:34760) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1br7vN-0004G7-8q for qemu-devel@nongnu.org; Mon, 03 Oct 2016 14:25:13 -0400 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id u93INj9B053292 for ; Mon, 3 Oct 2016 14:25:12 -0400 Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209]) by mx0a-001b2d01.pphosted.com with ESMTP id 25utrn6s7s-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 03 Oct 2016 14:25:12 -0400 Received: from localhost by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 3 Oct 2016 14:25:11 -0400 Received: from d01dlp02.pok.ibm.com (9.56.250.167) by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 3 Oct 2016 14:25:05 -0400 Received: from b01cxnp22035.gho.pok.ibm.com (b01cxnp22035.gho.pok.ibm.com [9.57.198.25]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 407416E803C; Mon, 3 Oct 2016 14:24:41 -0400 (EDT) Received: from b01ledav001.gho.pok.ibm.com (b01ledav001.gho.pok.ibm.com [9.57.199.106]) by b01cxnp22035.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u93IP1PQ16908562; Mon, 3 Oct 2016 18:25:04 GMT Received: from b01ledav001.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 27AAB2803D; Mon, 3 Oct 2016 14:25:04 -0400 (EDT) Received: from jianjun-w530.ibm.com (unknown [9.48.109.118]) by b01ledav001.gho.pok.ibm.com (Postfix) with ESMTP id 4189F28050; Mon, 3 Oct 2016 14:25:01 -0400 (EDT) From: Jianjun Duan To: qemu-devel@nongnu.org Date: Mon, 3 Oct 2016 11:24:52 -0700 X-Mailer: git-send-email 1.9.1 In-Reply-To: <1475519097-27611-1-git-send-email-duanj@linux.vnet.ibm.com> References: <1475519097-27611-1-git-send-email-duanj@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16100318-0056-0000-0000-00000186949F X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00005848; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000186; SDB=6.00763933; UDB=6.00364696; IPR=6.00539579; BA=6.00004779; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00012860; XFM=3.00000011; UTC=2016-10-03 18:25:09 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16100318-0057-0000-0000-000005B9AB44 Message-Id: <1475519097-27611-2-git-send-email-duanj@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-10-03_11:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609280000 definitions=main-1610030317 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [QEMU PATCH v5 1/6] migration: alternative way to set instance_id in SaveStateEntry X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: veroniabahaa@gmail.com, peter.maydell@linaro.org, dgilbert@redhat.com, duanj@linux.vnet.ibm.com, mst@redhat.com, quintela@redhat.com, mark.cave-ayland@ilande.co.uk, mdroth@linux.vnet.ibm.com, mreitz@redhat.com, blauwirbel@gmail.com, amit.shah@redhat.com, qemu-ppc@nongnu.org, kraxel@redhat.com, kwolf@redhat.com, dmitry@daynix.com, pbonzini@redhat.com, rth@twiddle.net, leon.alrae@imgtec.com, aurelien@aurel32.net, david@gibson.dropbear.id.au Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP In QOM(QEMU Object Model) migrated objects are identified with instance_id which is calculated automatically using their path in the QOM composition tree. For some objects, this path could change from source to target in migration. To migrate such objects, we need to make sure the instance_id does not change from source to target. We add a hook in DeviceClass to do customized instance_id calculation in such cases. As a result, in these cases compat will not be set in the concerned SaveStateEntry. This will prevent the inconsistent idstr to be sent over in migration. We could have set alias_id in a similar way. But that will be overloading the purpose of alias_id. The first application will be setting instance_id for DRC using its unique index. Doing this makes the instance_id of DRC to be consistent across migration and supports flexible management of DRC objects in migration. Signed-off-by: Jianjun Duan --- include/hw/qdev-core.h | 6 ++++++ migration/savevm.c | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index 2c97347..a012e8e 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -139,6 +139,12 @@ typedef struct DeviceClass { qdev_initfn init; /* TODO remove, once users are converted to realize */ qdev_event exit; /* TODO remove, once users are converted to unrealize */ const char *bus_type; + + /* When this field is set, qemu will use it to get an unique instance_id + * instead of calculating an auto idstr and instanc_id for the relevant + * SaveStateEntry + */ + int (*dev_get_instance_id)(DeviceState *dev); } DeviceClass; typedef struct NamedGPIOList NamedGPIOList; diff --git a/migration/savevm.c b/migration/savevm.c index 33a2911..ef5c3d1 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -495,6 +495,11 @@ int register_savevm_live(DeviceState *dev, void *opaque) { SaveStateEntry *se; + /* when it is a device and it provides a way to get instance_id, + * we will use it and skip setting idstr and compat. + */ + bool flag = (dev != NULL) && + (DEVICE_GET_CLASS(dev)->dev_get_instance_id != NULL); se = g_new0(SaveStateEntry, 1); se->version_id = version_id; @@ -507,7 +512,7 @@ int register_savevm_live(DeviceState *dev, se->is_ram = 1; } - if (dev) { + if (dev && !flag) { char *id = qdev_get_dev_path(dev); if (id) { pstrcpy(se->idstr, sizeof(se->idstr), id); @@ -523,6 +528,9 @@ int register_savevm_live(DeviceState *dev, } pstrcat(se->idstr, sizeof(se->idstr), idstr); + if (flag) { + instance_id = DEVICE_GET_CLASS(dev)->dev_get_instance_id(dev); + } if (instance_id == -1) { se->instance_id = calculate_new_instance_id(se->idstr); } else { @@ -580,6 +588,11 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id, int required_for_version) { SaveStateEntry *se; + /* when it is a device and it provides a way to get instance_id, + * we will use it and skip setting idstr and compat. + */ + bool flag = (dev != NULL) && + (DEVICE_GET_CLASS(dev)->dev_get_instance_id != NULL); /* If this triggers, alias support can be dropped for the vmsd. */ assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id); @@ -591,7 +604,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id, se->vmsd = vmsd; se->alias_id = alias_id; - if (dev) { + if (dev && !flag) { char *id = qdev_get_dev_path(dev); if (id) { pstrcpy(se->idstr, sizeof(se->idstr), id); @@ -607,6 +620,9 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id, } pstrcat(se->idstr, sizeof(se->idstr), vmsd->name); + if (flag) { + instance_id = DEVICE_GET_CLASS(dev)->dev_get_instance_id(dev); + } if (instance_id == -1) { se->instance_id = calculate_new_instance_id(se->idstr); } else {