From nobody Sun May 5 12:40:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1594663465; cv=none; d=zohomail.com; s=zohoarc; b=ONdszVLhbWeT2YTmq/SVWzbwKoczsUySkmwdHXXERKk9bPRjZsNLozx082uhpbrI8gx9pd+vz7Qh9NJ85L97vdwfz9bmCo+aiM8Mv4687Y76tTPrSyRPJxqir3gEBgnKNfQkLb8rwo3QsMD0M6Nc3iIVEd6nvmNxDgI5nhSJB0E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594663465; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=lleitkvC4RSsDoWpTISLpaeVoIi1au+/py05cYp9LZE=; b=lasf2Y2NPN0Rni67ckn+k9oCoKWQ5GxQSqZ6BJNa0+0Iacfj2d9TpbZ7uD30t8+v4d/Si0UbRuq+TXX8lPcHMCnW3TpvOSWA9f4BSj5JjWiO8cFP4ly9NwLQJISOp8FtyKWE5sFce/Wvxak6t6KLEgTSy2kjLdK+GNiNyO00sxc= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1594663465111138.44415778673215; Mon, 13 Jul 2020 11:04:25 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-463-RaRDsIP6MJuTHjqMbqgF2Q-1; Mon, 13 Jul 2020 14:04:21 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 38A0718C63C3; Mon, 13 Jul 2020 18:04:16 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BFA607981F; Mon, 13 Jul 2020 18:04:15 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 9076494EF4; Mon, 13 Jul 2020 18:04:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 06DI3vBn007653 for ; Mon, 13 Jul 2020 14:03:57 -0400 Received: by smtp.corp.redhat.com (Postfix) id 354FF80543; Mon, 13 Jul 2020 18:03:57 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3001182871 for ; Mon, 13 Jul 2020 18:03:54 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C96F480CC26 for ; Mon, 13 Jul 2020 18:03:54 +0000 (UTC) Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-366-cSRb4_f8PnuvRfyxnjxmMQ-1; Mon, 13 Jul 2020 14:03:52 -0400 Received: by mail-pl1-f193.google.com with SMTP id x9so5853564plr.2 for ; Mon, 13 Jul 2020 11:03:51 -0700 (PDT) Received: from localhost.localdomain ([116.72.84.11]) by smtp.gmail.com with ESMTPSA id q11sm238552pjj.17.2020.07.13.11.03.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2020 11:03:50 -0700 (PDT) X-MC-Unique: RaRDsIP6MJuTHjqMbqgF2Q-1 X-MC-Unique: cSRb4_f8PnuvRfyxnjxmMQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lleitkvC4RSsDoWpTISLpaeVoIi1au+/py05cYp9LZE=; b=nZMfVH9EKnPUVdKfuntDYjDWhUuE5oK60obEjYKoYHRMnbszSjq9BQ82Dx5tRZUWsO xXrNidja/6/vPdJ/FKpnyeXrsmsCCIa/IlCZpnvx0yON6rY0pvJuuDgNOCH5v8RElTAa Qqq5gnRysYJhPf+Ymoj+fx83bYha3EY7lwuVHl9524h10ykWeEGKWgDkOMRQx9ysvCQU qDgtShSsjON3+qertXczyLPad2l2boqVAehzpM4CNGOMaP6eLXNq9tLj4/qY0teuvF7J IH8RK4PG8XLftRsrt51+Qk0/HPhtKcCr4BwbTzhaosD5ba1YeBgMbEeJTa9iIZltE9Bd DdKg== X-Gm-Message-State: AOAM5330lTeKMt+Xz7hFcz+zJQjGgbzNbF61+dsGRPXeIM4ZdTQfdFFM 4SrBy/DFqLj87m+lJIYTsyWji1yBVco= X-Google-Smtp-Source: ABdhPJyFOuryRfbQM3/1xIr/xsAgEmWtA5fnHAARM4FUHWyfu4wFiBV8NJHCxghpbDlqQko5LpbMBQ== X-Received: by 2002:a17:90a:7483:: with SMTP id p3mr618377pjk.64.1594663430710; Mon, 13 Jul 2020 11:03:50 -0700 (PDT) From: Prathamesh Chavan To: libvir-list@redhat.com Subject: [GSoC][PATCH v4 1/4] qemu_domain: remove passing `qemuDomainObjPrivatePtr` as param Date: Mon, 13 Jul 2020 23:33:38 +0530 Message-Id: <20200713180341.173183-2-pc44800@gmail.com> In-Reply-To: <20200713180341.173183-1-pc44800@gmail.com> References: <20200713180341.173183-1-pc44800@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Prathamesh Chavan X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" `qemuDomainObjPrivatePtr` parameter was avoided being passed as a paramter in functions `qemuDomainObjPrivateXMLParseJob` and `qemuDomainObjPrivateXMLFormatJob`, as we already pass `virDomainObjPtr`, which can be used to get `privateData` pointer. Signed-off-by: Prathamesh Chavan Reviewed-by: Michal Privoznik --- src/qemu/qemu_domain.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2d9d8226d6..b448c89417 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2224,11 +2224,11 @@ qemuDomainObjPrivateXMLFormatNBDMigration(virBuffer= Ptr buf, =20 static int qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, - virDomainObjPtr vm, - qemuDomainObjPrivatePtr priv) + virDomainObjPtr vm) { g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); + qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuDomainJob job =3D priv->job.active; =20 if (!qemuDomainTrackJob(job)) @@ -2399,7 +2399,7 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, if (priv->lockState) virBufferAsprintf(buf, "%s\n", priv->lockSt= ate); =20 - if (qemuDomainObjPrivateXMLFormatJob(buf, vm, priv) < 0) + if (qemuDomainObjPrivateXMLFormatJob(buf, vm) < 0) return -1; =20 if (priv->fakeReboot) @@ -2948,9 +2948,9 @@ qemuDomainObjPrivateXMLParseJobNBDSource(xmlNodePtr n= ode, =20 static int qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr vm, - qemuDomainObjPrivatePtr priv, xmlXPathContextPtr ctxt) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; g_autofree xmlNodePtr *nodes =3D NULL; size_t i; int n; @@ -2986,9 +2986,9 @@ qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr vm, =20 static int qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, - qemuDomainObjPrivatePtr priv, xmlXPathContextPtr ctxt) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; VIR_XPATH_NODE_AUTORESTORE(ctxt); g_autofree char *tmp =3D NULL; =20 @@ -3034,7 +3034,7 @@ qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, return -1; } =20 - if (qemuDomainObjPrivateXMLParseJobNBD(vm, priv, ctxt) < 0) + if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0) return -1; =20 if (qemuMigrationParamsParse(ctxt, &priv->job.migParams) < 0) @@ -3203,7 +3203,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, =20 priv->lockState =3D virXPathString("string(./lockstate)", ctxt); =20 - if (qemuDomainObjPrivateXMLParseJob(vm, priv, ctxt) < 0) + if (qemuDomainObjPrivateXMLParseJob(vm, ctxt) < 0) goto error; =20 priv->fakeReboot =3D virXPathBoolean("boolean(./fakereboot)", ctxt) = =3D=3D 1; --=20 2.25.1 From nobody Sun May 5 12:40:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1594663451; cv=none; d=zohomail.com; s=zohoarc; b=W6hvxm7rhzmZtY1bUNEt8Sl9r+9dEbQ9TiLlAhiTkWWnBQ7xepVjfUquU8/hC1wcTxRuC3XYdCLO8z9eN5GlzWZRrYSAVPcnPvsR5FE1A6vXyu4IYXLwGkFfBQCioGZhAbgRrngFBcwWLIHerFJOJuw7GqqrZLM/+OjE6UVUdL0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594663451; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=T0NygK+AiKn4h/RSqi8Do4xVbnt1dkQa6SfMgcdW1WQ=; b=TsJpUu1ubRjU51c7XU1TnutdIGYZ8QmWuajIdoIIc6NwyTCjwhSarrp243iSzF/bHDXZMZkG/QpSunPkZZsJp2idWHKZ26cqC4czqNAWEPBXa721daYeIyojcv99O/ElEra5Q1iCDq6dGO8Mtr+9NmurjTUM3/UEkE0EXcDqZsc= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1594663451400970.9279537185009; Mon, 13 Jul 2020 11:04:11 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-11-YBO-m_2_PheakfpJ_I4WNw-1; Mon, 13 Jul 2020 14:04:07 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 440231098; Mon, 13 Jul 2020 18:04:02 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EF72C79505; Mon, 13 Jul 2020 18:04:01 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6BD141809554; Mon, 13 Jul 2020 18:04:00 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 06DI3vYd007658 for ; Mon, 13 Jul 2020 14:03:58 -0400 Received: by smtp.corp.redhat.com (Postfix) id D39057D297; Mon, 13 Jul 2020 18:03:57 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CF29180548 for ; Mon, 13 Jul 2020 18:03:57 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B22138007CD for ; Mon, 13 Jul 2020 18:03:57 +0000 (UTC) Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.182]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-503--yZpDFE5Nb-SDTXKHOu8QQ-1; Mon, 13 Jul 2020 14:03:55 -0400 Received: by mail-pg1-f182.google.com with SMTP id d4so6367312pgk.4 for ; Mon, 13 Jul 2020 11:03:54 -0700 (PDT) Received: from localhost.localdomain ([116.72.84.11]) by smtp.gmail.com with ESMTPSA id q11sm238552pjj.17.2020.07.13.11.03.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2020 11:03:52 -0700 (PDT) X-MC-Unique: YBO-m_2_PheakfpJ_I4WNw-1 X-MC-Unique: -yZpDFE5Nb-SDTXKHOu8QQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=T0NygK+AiKn4h/RSqi8Do4xVbnt1dkQa6SfMgcdW1WQ=; b=NaqJF06AVuliP1l4CRAsegjSCKdtgZDMNgoeZD2pTEgYynFCmILtz//+w7RAJeF6Qj Kne+8GTLkrhn/F36Vnz+SXp/b7l6+6srHMFkZ/dN/4MAz2fmhyOF5lDBMO9M5/z8+skd 1jVz8ow9pHHV1jTr7PxL8C/zFg+/ScpNyvJuQUyjyZt4mqulUxhITnGk7RnJTjJHkP/d wsD+9WxmqWkh1BRLJVAZMOCTMQiSa7t1VOWulBpjaQiQeTDH8GCK3MsoaEpIZzmQsHiF XLsa80ChaT+wc3BvxRXKrDw04LGQNG52JFYwDu2nucjkEgkg4xA94UulVwvD6ijYOBVQ NTHQ== X-Gm-Message-State: AOAM533bvh9HsZoOkW0fXXBM0dj10Qz2WQwtLCUtbGsfKpz+JFR5khkk WQso8/qRUN/CkvI4FrE0dskIFbZEECc= X-Google-Smtp-Source: ABdhPJwtUzOQmyalw0czOVeYL3eCw9Ta1gQgYJmNZzlW3RDTuhXDPNtTTKpNhMMP0Nt9T6AphOuG8w== X-Received: by 2002:a62:ab15:: with SMTP id p21mr997594pff.146.1594663433459; Mon, 13 Jul 2020 11:03:53 -0700 (PDT) From: Prathamesh Chavan To: libvir-list@redhat.com Subject: [GSoC][PATCH v4 2/4] qemu_domainjob: moved PrivateXML parse-job and format-job Date: Mon, 13 Jul 2020 23:33:39 +0530 Message-Id: <20200713180341.173183-3-pc44800@gmail.com> In-Reply-To: <20200713180341.173183-1-pc44800@gmail.com> References: <20200713180341.173183-1-pc44800@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Prathamesh Chavan X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Functions `qemuDomainObjPrivateXMLParseJob` and `qemuDomainObjPrivateXMLFormatJob` moved from `qemu_domain` to `qemu_domainjob`. Signed-off-by: Prathamesh Chavan Reviewed-by: Michal Privoznik --- src/qemu/qemu_domain.c | 241 -------------------------------------- src/qemu/qemu_domainjob.c | 241 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domainjob.h | 8 ++ 3 files changed, 249 insertions(+), 241 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b448c89417..10d2033db1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2168,102 +2168,6 @@ qemuDomainObjPrivateXMLFormatPR(virBufferPtr buf, } =20 =20 -static int -qemuDomainObjPrivateXMLFormatNBDMigrationSource(virBufferPtr buf, - virStorageSourcePtr src, - virDomainXMLOptionPtr xmlo= pt) -{ - g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; - g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); - - virBufferAsprintf(&attrBuf, " type=3D'%s' format=3D'%s'", - virStorageTypeToString(src->type), - virStorageFileFormatTypeToString(src->format)); - - if (virDomainDiskSourceFormat(&childBuf, src, "source", 0, false, - VIR_DOMAIN_DEF_FORMAT_STATUS, - false, false, xmlopt) < 0) - return -1; - - virXMLFormatElement(buf, "migrationSource", &attrBuf, &childBuf); - - return 0; -} - - -static int -qemuDomainObjPrivateXMLFormatNBDMigration(virBufferPtr buf, - virDomainObjPtr vm) -{ - qemuDomainObjPrivatePtr priv =3D vm->privateData; - size_t i; - virDomainDiskDefPtr disk; - qemuDomainDiskPrivatePtr diskPriv; - - for (i =3D 0; i < vm->def->ndisks; i++) { - g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; - g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); - disk =3D vm->def->disks[i]; - diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); - - virBufferAsprintf(&attrBuf, " dev=3D'%s' migrating=3D'%s'", - disk->dst, diskPriv->migrating ? "yes" : "no"); - - if (diskPriv->migrSource && - qemuDomainObjPrivateXMLFormatNBDMigrationSource(&childBuf, - diskPriv->migr= Source, - priv->driver->= xmlopt) < 0) - return -1; - - virXMLFormatElement(buf, "disk", &attrBuf, &childBuf); - } - - return 0; -} - - -static int -qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, - virDomainObjPtr vm) -{ - g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; - g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); - qemuDomainObjPrivatePtr priv =3D vm->privateData; - qemuDomainJob job =3D priv->job.active; - - if (!qemuDomainTrackJob(job)) - job =3D QEMU_JOB_NONE; - - if (job =3D=3D QEMU_JOB_NONE && - priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_NONE) - return 0; - - virBufferAsprintf(&attrBuf, " type=3D'%s' async=3D'%s'", - qemuDomainJobTypeToString(job), - qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); - - if (priv->job.phase) { - virBufferAsprintf(&attrBuf, " phase=3D'%s'", - qemuDomainAsyncJobPhaseToString(priv->job.asyncJ= ob, - priv->job.phase)= ); - } - - if (priv->job.asyncJob !=3D QEMU_ASYNC_JOB_NONE) - virBufferAsprintf(&attrBuf, " flags=3D'0x%lx'", priv->job.apiFlags= ); - - if (priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_MIGRATION_OUT && - qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0) - return -1; - - if (priv->job.migParams) - qemuMigrationParamsFormat(&childBuf, priv->job.migParams); - - virXMLFormatElement(buf, "job", &attrBuf, &childBuf); - - return 0; -} - - static bool qemuDomainHasSlirp(virDomainObjPtr vm) { @@ -2899,151 +2803,6 @@ qemuDomainObjPrivateXMLParsePR(xmlXPathContextPtr c= txt, } =20 =20 -static int -qemuDomainObjPrivateXMLParseJobNBDSource(xmlNodePtr node, - xmlXPathContextPtr ctxt, - virDomainDiskDefPtr disk, - virDomainXMLOptionPtr xmlopt) -{ - VIR_XPATH_NODE_AUTORESTORE(ctxt); - qemuDomainDiskPrivatePtr diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); - g_autofree char *format =3D NULL; - g_autofree char *type =3D NULL; - g_autoptr(virStorageSource) migrSource =3D NULL; - xmlNodePtr sourceNode; - - ctxt->node =3D node; - - if (!(ctxt->node =3D virXPathNode("./migrationSource", ctxt))) - return 0; - - if (!(type =3D virXMLPropString(ctxt->node, "type"))) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("missing storage source type")); - return -1; - } - - if (!(format =3D virXMLPropString(ctxt->node, "format"))) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("missing storage source format")); - return -1; - } - - if (!(migrSource =3D virDomainStorageSourceParseBase(type, format, NUL= L))) - return -1; - - /* newer libvirt uses the subelement instead of formatting the - * source directly into */ - if ((sourceNode =3D virXPathNode("./source", ctxt))) - ctxt->node =3D sourceNode; - - if (virDomainStorageSourceParse(ctxt->node, ctxt, migrSource, - VIR_DOMAIN_DEF_PARSE_STATUS, xmlopt) <= 0) - return -1; - - diskPriv->migrSource =3D g_steal_pointer(&migrSource); - return 0; -} - - -static int -qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr vm, - xmlXPathContextPtr ctxt) -{ - qemuDomainObjPrivatePtr priv =3D vm->privateData; - g_autofree xmlNodePtr *nodes =3D NULL; - size_t i; - int n; - - if ((n =3D virXPathNodeSet("./disk[@migrating=3D'yes']", ctxt, &nodes)= ) < 0) - return -1; - - if (n > 0) { - if (priv->job.asyncJob !=3D QEMU_ASYNC_JOB_MIGRATION_OUT) { - VIR_WARN("Found disks marked for migration but we were not " - "migrating"); - n =3D 0; - } - for (i =3D 0; i < n; i++) { - virDomainDiskDefPtr disk; - g_autofree char *dst =3D NULL; - - if ((dst =3D virXMLPropString(nodes[i], "dev")) && - (disk =3D virDomainDiskByTarget(vm->def, dst))) { - QEMU_DOMAIN_DISK_PRIVATE(disk)->migrating =3D true; - - if (qemuDomainObjPrivateXMLParseJobNBDSource(nodes[i], ctx= t, - disk, - priv->driver-= >xmlopt) < 0) - return -1; - } - } - } - - return 0; -} - - -static int -qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, - xmlXPathContextPtr ctxt) -{ - qemuDomainObjPrivatePtr priv =3D vm->privateData; - VIR_XPATH_NODE_AUTORESTORE(ctxt); - g_autofree char *tmp =3D NULL; - - if (!(ctxt->node =3D virXPathNode("./job[1]", ctxt))) - return 0; - - if ((tmp =3D virXPathString("string(@type)", ctxt))) { - int type; - - if ((type =3D qemuDomainJobTypeFromString(tmp)) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown job type %s"), tmp); - return -1; - } - VIR_FREE(tmp); - priv->job.active =3D type; - } - - if ((tmp =3D virXPathString("string(@async)", ctxt))) { - int async; - - if ((async =3D qemuDomainAsyncJobTypeFromString(tmp)) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown async job type %s"), tmp); - return -1; - } - VIR_FREE(tmp); - priv->job.asyncJob =3D async; - - if ((tmp =3D virXPathString("string(@phase)", ctxt))) { - priv->job.phase =3D qemuDomainAsyncJobPhaseFromString(async, t= mp); - if (priv->job.phase < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown job phase %s"), tmp); - return -1; - } - VIR_FREE(tmp); - } - } - - if (virXPathULongHex("string(@flags)", ctxt, &priv->job.apiFlags) =3D= =3D -2) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid job flags"= )); - return -1; - } - - if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0) - return -1; - - if (qemuMigrationParamsParse(ctxt, &priv->job.migParams) < 0) - return -1; - - return 0; -} - - static int qemuDomainObjPrivateXMLParseSlirpFeatures(xmlNodePtr featuresNode, xmlXPathContextPtr ctxt, diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index 654f1c4f90..d96d5334a3 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -1184,3 +1184,244 @@ qemuDomainObjAbortAsyncJob(virDomainObjPtr obj) priv->job.abortJob =3D true; virDomainObjBroadcast(obj); } + + +static int +qemuDomainObjPrivateXMLFormatNBDMigrationSource(virBufferPtr buf, + virStorageSourcePtr src, + virDomainXMLOptionPtr xmlo= pt) +{ + g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); + + virBufferAsprintf(&attrBuf, " type=3D'%s' format=3D'%s'", + virStorageTypeToString(src->type), + virStorageFileFormatTypeToString(src->format)); + + if (virDomainDiskSourceFormat(&childBuf, src, "source", 0, false, + VIR_DOMAIN_DEF_FORMAT_STATUS, + false, false, xmlopt) < 0) + return -1; + + virXMLFormatElement(buf, "migrationSource", &attrBuf, &childBuf); + + return 0; +} + + +static int +qemuDomainObjPrivateXMLFormatNBDMigration(virBufferPtr buf, + virDomainObjPtr vm) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + size_t i; + virDomainDiskDefPtr disk; + qemuDomainDiskPrivatePtr diskPriv; + + for (i =3D 0; i < vm->def->ndisks; i++) { + g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); + disk =3D vm->def->disks[i]; + diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); + + virBufferAsprintf(&attrBuf, " dev=3D'%s' migrating=3D'%s'", + disk->dst, diskPriv->migrating ? "yes" : "no"); + + if (diskPriv->migrSource && + qemuDomainObjPrivateXMLFormatNBDMigrationSource(&childBuf, + diskPriv->migr= Source, + priv->driver->= xmlopt) < 0) + return -1; + + virXMLFormatElement(buf, "disk", &attrBuf, &childBuf); + } + + return 0; +} + + +int +qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, + virDomainObjPtr vm) +{ + g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); + qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJob job =3D priv->job.active; + + if (!qemuDomainTrackJob(job)) + job =3D QEMU_JOB_NONE; + + if (job =3D=3D QEMU_JOB_NONE && + priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_NONE) + return 0; + + virBufferAsprintf(&attrBuf, " type=3D'%s' async=3D'%s'", + qemuDomainJobTypeToString(job), + qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); + + if (priv->job.phase) { + virBufferAsprintf(&attrBuf, " phase=3D'%s'", + qemuDomainAsyncJobPhaseToString(priv->job.asyncJ= ob, + priv->job.phase)= ); + } + + if (priv->job.asyncJob !=3D QEMU_ASYNC_JOB_NONE) + virBufferAsprintf(&attrBuf, " flags=3D'0x%lx'", priv->job.apiFlags= ); + + if (priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_MIGRATION_OUT && + qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0) + return -1; + + if (priv->job.migParams) + qemuMigrationParamsFormat(&childBuf, priv->job.migParams); + + virXMLFormatElement(buf, "job", &attrBuf, &childBuf); + + return 0; +} + + +static int +qemuDomainObjPrivateXMLParseJobNBDSource(xmlNodePtr node, + xmlXPathContextPtr ctxt, + virDomainDiskDefPtr disk, + virDomainXMLOptionPtr xmlopt) +{ + VIR_XPATH_NODE_AUTORESTORE(ctxt); + qemuDomainDiskPrivatePtr diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); + g_autofree char *format =3D NULL; + g_autofree char *type =3D NULL; + g_autoptr(virStorageSource) migrSource =3D NULL; + xmlNodePtr sourceNode; + + ctxt->node =3D node; + + if (!(ctxt->node =3D virXPathNode("./migrationSource", ctxt))) + return 0; + + if (!(type =3D virXMLPropString(ctxt->node, "type"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing storage source type")); + return -1; + } + + if (!(format =3D virXMLPropString(ctxt->node, "format"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing storage source format")); + return -1; + } + + if (!(migrSource =3D virDomainStorageSourceParseBase(type, format, NUL= L))) + return -1; + + /* newer libvirt uses the subelement instead of formatting the + * source directly into */ + if ((sourceNode =3D virXPathNode("./source", ctxt))) + ctxt->node =3D sourceNode; + + if (virDomainStorageSourceParse(ctxt->node, ctxt, migrSource, + VIR_DOMAIN_DEF_PARSE_STATUS, xmlopt) <= 0) + return -1; + + diskPriv->migrSource =3D g_steal_pointer(&migrSource); + return 0; +} + + +static int +qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr vm, + xmlXPathContextPtr ctxt) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + g_autofree xmlNodePtr *nodes =3D NULL; + size_t i; + int n; + + if ((n =3D virXPathNodeSet("./disk[@migrating=3D'yes']", ctxt, &nodes)= ) < 0) + return -1; + + if (n > 0) { + if (priv->job.asyncJob !=3D QEMU_ASYNC_JOB_MIGRATION_OUT) { + VIR_WARN("Found disks marked for migration but we were not " + "migrating"); + n =3D 0; + } + for (i =3D 0; i < n; i++) { + virDomainDiskDefPtr disk; + g_autofree char *dst =3D NULL; + + if ((dst =3D virXMLPropString(nodes[i], "dev")) && + (disk =3D virDomainDiskByTarget(vm->def, dst))) { + QEMU_DOMAIN_DISK_PRIVATE(disk)->migrating =3D true; + + if (qemuDomainObjPrivateXMLParseJobNBDSource(nodes[i], ctx= t, + disk, + priv->driver-= >xmlopt) < 0) + return -1; + } + } + } + + return 0; +} + + +int +qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, + xmlXPathContextPtr ctxt) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + VIR_XPATH_NODE_AUTORESTORE(ctxt); + g_autofree char *tmp =3D NULL; + + if (!(ctxt->node =3D virXPathNode("./job[1]", ctxt))) + return 0; + + if ((tmp =3D virXPathString("string(@type)", ctxt))) { + int type; + + if ((type =3D qemuDomainJobTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown job type %s"), tmp); + return -1; + } + VIR_FREE(tmp); + priv->job.active =3D type; + } + + if ((tmp =3D virXPathString("string(@async)", ctxt))) { + int async; + + if ((async =3D qemuDomainAsyncJobTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown async job type %s"), tmp); + return -1; + } + VIR_FREE(tmp); + priv->job.asyncJob =3D async; + + if ((tmp =3D virXPathString("string(@phase)", ctxt))) { + priv->job.phase =3D qemuDomainAsyncJobPhaseFromString(async, t= mp); + if (priv->job.phase < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown job phase %s"), tmp); + return -1; + } + VIR_FREE(tmp); + } + } + + if (virXPathULongHex("string(@flags)", ctxt, &priv->job.apiFlags) =3D= =3D -2) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid job flags"= )); + return -1; + } + + if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0) + return -1; + + if (qemuMigrationParamsParse(ctxt, &priv->job.migParams) < 0) + return -1; + + return 0; +} diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index 124664354d..9d2ee14584 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -267,3 +267,11 @@ void qemuDomainObjFreeJob(qemuDomainJobObjPtr job); int qemuDomainObjInitJob(qemuDomainJobObjPtr job); =20 bool qemuDomainJobAllowed(qemuDomainJobObjPtr jobs, qemuDomainJob newJob); + +int +qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, + virDomainObjPtr vm); + +int +qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, + xmlXPathContextPtr ctxt); --=20 2.25.1 From nobody Sun May 5 12:40:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1594663471; cv=none; d=zohomail.com; s=zohoarc; b=gxX1dxfLo8fOZUxi4YzcokLtP94FXMOLWmWetUVga+FyKzZqDxVa0spkrwvth9DmA652bmdUrVFeWUR5vuLN+cM3RaO61Zh/SdpOwKE1G3Z25W0XwjfsrNk9kzVhzxzzrvNJh6wkZVOlvrI97EI8u8vPbMKFJyu78IQ9k2sEmRE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594663471; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=uCIioNONlwdfvJYUol14ssO/xI0sN9Tzh8ZTuhD41/o=; b=BFjGpBzOBIZ1CY7mQtbdH4ydIkkiXm+V9BbEjfLaNJ6us8jCildoZfjb4EXKazdP0HB7rOPqdwV8d/KQFbw/kuYmQt7mlrKc3r4akOWoR1L82hz6WG2wY/19We8ezQl2SwLwg7+S/5lbcdzXPCRP7m4hdi28kMmr0CQ03bjmrkE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1594663471092849.3629906959513; Mon, 13 Jul 2020 11:04:31 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-46-bVOkosX1MqG3bvWCBXxfpg-1; Mon, 13 Jul 2020 14:04:27 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D43AE18C63C1; Mon, 13 Jul 2020 18:04:19 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AE435710B6; Mon, 13 Jul 2020 18:04:19 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 7F45A94EF4; Mon, 13 Jul 2020 18:04:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 06DI41ve007681 for ; Mon, 13 Jul 2020 14:04:01 -0400 Received: by smtp.corp.redhat.com (Postfix) id DE2D78056A; Mon, 13 Jul 2020 18:04:00 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B6C4B80543 for ; Mon, 13 Jul 2020 18:04:00 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9B1AD100E7C6 for ; Mon, 13 Jul 2020 18:04:00 +0000 (UTC) Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-70-Aurkn5VFPwORWFlFzP60KA-1; Mon, 13 Jul 2020 14:03:58 -0400 Received: by mail-pl1-f193.google.com with SMTP id m16so4645030pls.5 for ; Mon, 13 Jul 2020 11:03:57 -0700 (PDT) Received: from localhost.localdomain ([116.72.84.11]) by smtp.gmail.com with ESMTPSA id q11sm238552pjj.17.2020.07.13.11.03.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2020 11:03:54 -0700 (PDT) X-MC-Unique: bVOkosX1MqG3bvWCBXxfpg-1 X-MC-Unique: Aurkn5VFPwORWFlFzP60KA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uCIioNONlwdfvJYUol14ssO/xI0sN9Tzh8ZTuhD41/o=; b=rNdjbvuUiop3jAujT8DcYGUhoaO/Xv4VlZVRZYf924BY8/Q5+hgXzuS7y/Wk8mNh3k r8tKwP2Q+fo8TxOgNYybn5Jrz7U2YHefERyhMmN4SKIw8oPjDZYSARXxP13NmJB0BhVZ vRb+CAQOVEVB0YrhQOISlV+Ub/6rV8UR2fv6wTmXuK0ObQLpd5+vUy2uWMVcLUdpOEj8 SmVz7YpXYZpMeGE89TzPO9/itArpFlhMKnrqY9aGxXJCznj3+6XcGrrviQKTnAApKGyv JSv5eCA/DMBAN9zjR5lZk60kmGKglfWAKjOYmCNfhKR9yX7JVWIajL5Ev2idGv5KyZeS hzVw== X-Gm-Message-State: AOAM531SeeCQYoZtttyoida6XuiKBjGvHyxNY8UA8/xb2JOyxlyOKbqq WTOO6hKmdm4E0p5IQS27y40KOTYCEvA= X-Google-Smtp-Source: ABdhPJxAsa4ryQ7nlPICf4Sa5I9lEIE43Qx8qAXQWgsvw/mhKE/pikFox6okZYO+X/NbLbOqURHTKQ== X-Received: by 2002:a17:90a:1f87:: with SMTP id x7mr572552pja.101.1594663435631; Mon, 13 Jul 2020 11:03:55 -0700 (PDT) From: Prathamesh Chavan To: libvir-list@redhat.com Subject: [GSoC][PATCH v4 3/4] qemu_domainjob: introduce `privateData` for `qemuDomainJob` Date: Mon, 13 Jul 2020 23:33:40 +0530 Message-Id: <20200713180341.173183-4-pc44800@gmail.com> In-Reply-To: <20200713180341.173183-1-pc44800@gmail.com> References: <20200713180341.173183-1-pc44800@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Prathamesh Chavan X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To remove dependecy of `qemuDomainJob` on job specific paramters, a `privateData` pointer is introduced. To handle it, structure of callback functions is also introduced. Signed-off-by: Prathamesh Chavan --- The static callback functions structure was declared in `qemu_domain.c` Due to this, all callback functions (present in `qemu_domainobj.c`) were exposed using the .h file to allow their access by the `qemu_domain.c` file. src/qemu/qemu_domain.c | 9 ++- src/qemu/qemu_domain.h | 10 ++++ src/qemu/qemu_domainjob.c | 94 ++++++++++++++++++++++++-------- src/qemu/qemu_domainjob.h | 44 ++++++++++++--- src/qemu/qemu_driver.c | 3 +- src/qemu/qemu_migration.c | 28 +++++++--- src/qemu/qemu_migration_params.c | 9 ++- src/qemu/qemu_process.c | 15 +++-- 8 files changed, 165 insertions(+), 47 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 10d2033db1..a02865dc59 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -88,6 +88,13 @@ VIR_ENUM_IMPL(qemuDomainNamespace, "mount", ); =20 +static qemuDomainObjPrivateJobCallbacks qemuPrivateJobCallbacks =3D { + .allocJobPrivate =3D &qemuJobAllocPrivate, + .freeJobPrivate =3D &qemuJobFreePrivate, + .formatJob =3D &qemuDomainFormatJobPrivate, + .parseJob =3D &qemuDomainParseJobPrivate, +}; + /** * qemuDomainObjFromDomain: * @domain: Domain pointer that has to be looked up @@ -1585,7 +1592,7 @@ qemuDomainObjPrivateAlloc(void *opaque) if (VIR_ALLOC(priv) < 0) return NULL; =20 - if (qemuDomainObjInitJob(&priv->job) < 0) { + if (qemuDomainObjInitJob(&priv->job, &qemuPrivateJobCallbacks) < 0) { virReportSystemError(errno, "%s", _("Unable to init qemu driver mutexes")); goto error; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index e524fd0002..bb9b414a46 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -492,6 +492,16 @@ struct _qemuDomainXmlNsDef { char **capsdel; }; =20 +typedef struct _qemuDomainJobPrivate qemuDomainJobPrivate; +typedef qemuDomainJobPrivate *qemuDomainJobPrivatePtr; +struct _qemuDomainJobPrivate { + bool spiceMigration; /* we asked for spice migration an= d we + * should wait for it to finish */ + bool spiceMigrated; /* spice migration completed */ + bool dumpCompleted; /* dump completed */ + qemuMigrationParamsPtr migParams; +}; + int qemuDomainObjStartWorker(virDomainObjPtr dom); void qemuDomainObjStopWorker(virDomainObjPtr dom); =20 diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index d96d5334a3..fe160afe79 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -159,23 +159,32 @@ qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driv= er, virObjectEventStateQueue(driver->domainEventState, event); } =20 - -int -qemuDomainObjInitJob(qemuDomainJobObjPtr job) +void * +qemuJobAllocPrivate(void) { - memset(job, 0, sizeof(*job)); - - if (virCondInit(&job->cond) < 0) - return -1; + qemuDomainJobPrivatePtr priv; + if (VIR_ALLOC(priv) < 0) + return NULL; + return (void *)priv; +} =20 - if (virCondInit(&job->asyncCond) < 0) { - virCondDestroy(&job->cond); - return -1; - } =20 - return 0; +static void +qemuJobFreePrivateData(qemuDomainJobPrivatePtr priv) +{ + priv->spiceMigration =3D false; + priv->spiceMigrated =3D false; + priv->dumpCompleted =3D false; + qemuMigrationParamsFree(priv->migParams); + priv->migParams =3D NULL; } =20 +void +qemuJobFreePrivate(void *opaque) +{ + qemuDomainJobObjPtr job =3D (qemuDomainJobObjPtr) opaque; + qemuJobFreePrivateData(job->privateData); +} =20 static void qemuDomainObjResetJob(qemuDomainJobObjPtr job) @@ -207,14 +216,11 @@ qemuDomainObjResetAsyncJob(qemuDomainJobObjPtr job) job->phase =3D 0; job->mask =3D QEMU_JOB_DEFAULT_MASK; job->abortJob =3D false; - job->spiceMigration =3D false; - job->spiceMigrated =3D false; - job->dumpCompleted =3D false; VIR_FREE(job->error); g_clear_pointer(&job->current, qemuDomainJobInfoFree); - qemuMigrationParamsFree(job->migParams); - job->migParams =3D NULL; + job->cb->freeJobPrivate(job); job->apiFlags =3D 0; + job->cb =3D NULL; } =20 void @@ -229,7 +235,7 @@ qemuDomainObjRestoreJob(virDomainObjPtr obj, job->asyncJob =3D priv->job.asyncJob; job->asyncOwner =3D priv->job.asyncOwner; job->phase =3D priv->job.phase; - job->migParams =3D g_steal_pointer(&priv->job.migParams); + job->privateData =3D g_steal_pointer(&priv->job.privateData); job->apiFlags =3D priv->job.apiFlags; =20 qemuDomainObjResetJob(&priv->job); @@ -1239,14 +1245,24 @@ qemuDomainObjPrivateXMLFormatNBDMigration(virBuffer= Ptr buf, return 0; } =20 +int +qemuDomainFormatJobPrivate(virBufferPtr buf, + qemuDomainJobObjPtr job) +{ + qemuDomainJobPrivatePtr priv =3D job->privateData; + if (priv->migParams) + qemuMigrationParamsFormat(buf, priv->migParams); + return 0; +} =20 int qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, virDomainObjPtr vm) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobObjPtr jobObj =3D &priv->job; g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); - qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuDomainJob job =3D priv->job.active; =20 if (!qemuDomainTrackJob(job)) @@ -1273,8 +1289,8 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0) return -1; =20 - if (priv->job.migParams) - qemuMigrationParamsFormat(&childBuf, priv->job.migParams); + if (jobObj->cb->formatJob(&childBuf, jobObj) < 0) + return -1; =20 virXMLFormatElement(buf, "job", &attrBuf, &childBuf); =20 @@ -1366,12 +1382,22 @@ qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr = vm, return 0; } =20 +int +qemuDomainParseJobPrivate(xmlXPathContextPtr ctxt, + qemuDomainJobObjPtr job) +{ + qemuDomainJobPrivatePtr jobPriv =3D job->privateData; + if (qemuMigrationParamsParse(ctxt, &jobPriv->migParams) < 0) + return -1; + return 0; +} =20 int qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, xmlXPathContextPtr ctxt) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobObjPtr job =3D &priv->job; VIR_XPATH_NODE_AUTORESTORE(ctxt); g_autofree char *tmp =3D NULL; =20 @@ -1420,8 +1446,32 @@ qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0) return -1; =20 - if (qemuMigrationParamsParse(ctxt, &priv->job.migParams) < 0) + if (job->cb->parseJob(ctxt, job) < 0) + return -1; + + return 0; +} + + +int +qemuDomainObjInitJob(qemuDomainJobObjPtr job, + qemuDomainObjPrivateJobCallbacksPtr cb) +{ + memset(job, 0, sizeof(*job)); + job->cb =3D cb; + + if (!(job->privateData =3D job->cb->allocJobPrivate())) { + qemuDomainObjFreeJob(job); + return -1; + } + + if (virCondInit(&job->cond) < 0) + return -1; + + if (virCondInit(&job->asyncCond) < 0) { + virCondDestroy(&job->cond); return -1; + } =20 return 0; } diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index 9d2ee14584..b0e840adc8 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -156,6 +156,23 @@ qemuDomainJobInfoCopy(qemuDomainJobInfoPtr info); =20 typedef struct _qemuDomainJobObj qemuDomainJobObj; typedef qemuDomainJobObj *qemuDomainJobObjPtr; + +typedef void *(*qemuDomainObjPrivateJobAlloc)(void); +typedef void (*qemuDomainObjPrivateJobFree)(void *); +typedef int (*qemuDomainObjPrivateJobFormat)(virBufferPtr, + qemuDomainJobObjPtr); +typedef int (*qemuDomainObjPrivateJobParse)(xmlXPathContextPtr, + qemuDomainJobObjPtr); + +typedef struct _qemuDomainObjPrivateJobCallbacks qemuDomainObjPrivateJobCa= llbacks; +typedef qemuDomainObjPrivateJobCallbacks *qemuDomainObjPrivateJobCallbacks= Ptr; +struct _qemuDomainObjPrivateJobCallbacks { + qemuDomainObjPrivateJobAlloc allocJobPrivate; + qemuDomainObjPrivateJobFree freeJobPrivate; + qemuDomainObjPrivateJobFormat formatJob; + qemuDomainObjPrivateJobParse parseJob; +}; + struct _qemuDomainJobObj { virCond cond; /* Use to coordinate jobs */ =20 @@ -182,14 +199,11 @@ struct _qemuDomainJobObj { qemuDomainJobInfoPtr current; /* async job progress data */ qemuDomainJobInfoPtr completed; /* statistics data of a recently c= ompleted job */ bool abortJob; /* abort of the job requested */ - bool spiceMigration; /* we asked for spice migration an= d we - * should wait for it to finish */ - bool spiceMigrated; /* spice migration completed */ char *error; /* job event completion error */ - bool dumpCompleted; /* dump completed */ - - qemuMigrationParamsPtr migParams; unsigned long apiFlags; /* flags passed to the API which started the a= sync job */ + + void *privateData; /* job specific collection of data= */ + qemuDomainObjPrivateJobCallbacksPtr cb; }; =20 const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job, @@ -264,7 +278,9 @@ bool qemuDomainTrackJob(qemuDomainJob job); =20 void qemuDomainObjFreeJob(qemuDomainJobObjPtr job); =20 -int qemuDomainObjInitJob(qemuDomainJobObjPtr job); +int +qemuDomainObjInitJob(qemuDomainJobObjPtr job, + qemuDomainObjPrivateJobCallbacksPtr cb); =20 bool qemuDomainJobAllowed(qemuDomainJobObjPtr jobs, qemuDomainJob newJob); =20 @@ -275,3 +291,17 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf, int qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm, xmlXPathContextPtr ctxt); + +void * +qemuJobAllocPrivate(void); + +void +qemuJobFreePrivate(void *opaque); + +int +qemuDomainFormatJobPrivate(virBufferPtr buf, + qemuDomainJobObjPtr job); + +int +qemuDomainParseJobPrivate(xmlXPathContextPtr ctxt, + qemuDomainJobObjPtr job); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d185666ed8..d9c5f21f21 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3701,9 +3701,10 @@ static int qemuDumpWaitForCompletion(virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; =20 VIR_DEBUG("Waiting for dump completion"); - while (!priv->job.dumpCompleted && !priv->job.abortJob) { + while (!jobPriv->dumpCompleted && !priv->job.abortJob) { if (virDomainObjWait(vm) < 0) return -1; } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 78e64344f6..2c7bf349c3 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1422,12 +1422,13 @@ static int qemuMigrationSrcWaitForSpice(virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; =20 - if (!priv->job.spiceMigration) + if (!jobPriv->spiceMigration) return 0; =20 VIR_DEBUG("Waiting for SPICE to finish migration"); - while (!priv->job.spiceMigrated && !priv->job.abortJob) { + while (!jobPriv->spiceMigrated && !priv->job.abortJob) { if (virDomainObjWait(vm) < 0) return -1; } @@ -1856,9 +1857,11 @@ qemuMigrationSrcGraphicsRelocate(virQEMUDriverPtr dr= iver, =20 if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) =3D= =3D 0) { + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; + ret =3D qemuMonitorGraphicsRelocate(priv->mon, type, listenAddress, port, tlsPort, tlsSubject); - priv->job.spiceMigration =3D !ret; + jobPriv->spiceMigration =3D !ret; if (qemuDomainObjExitMonitor(driver, vm) < 0) ret =3D -1; } @@ -1993,6 +1996,7 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm, { virQEMUDriverPtr driver =3D opaque; qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; =20 VIR_DEBUG("vm=3D%s, conn=3D%p, asyncJob=3D%s, phase=3D%s", vm->def->name, conn, @@ -2018,7 +2022,7 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm, " domain was successfully started on destination or not", vm->def->name); qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, - priv->job.migParams, priv->job.apiFlags); + jobPriv->migParams, priv->job.apiFlags); /* clear the job and let higher levels decide what to do */ qemuDomainObjDiscardAsyncJob(driver, vm); break; @@ -2382,6 +2386,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, int dataFD[2] =3D { -1, -1 }; qemuDomainObjPrivatePtr priv =3D NULL; qemuMigrationCookiePtr mig =3D NULL; + qemuDomainJobPrivatePtr jobPriv =3D NULL; bool tunnel =3D !!st; g_autofree char *xmlout =3D NULL; unsigned int cookieFlags; @@ -2505,6 +2510,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, *def =3D NULL; =20 priv =3D vm->privateData; + jobPriv =3D priv->job.privateData; priv->origname =3D g_strdup(origname); =20 if (taint_hook) { @@ -2710,7 +2716,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, =20 stopjob: qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN, - priv->job.migParams, priv->job.apiFlags); + jobPriv->migParams, priv->job.apiFlags); =20 if (stopProcess) { unsigned int stopFlags =3D VIR_QEMU_PROCESS_STOP_MIGRATED; @@ -2979,6 +2985,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver, virObjectEventPtr event; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; qemuDomainJobInfoPtr jobInfo =3D NULL; =20 VIR_DEBUG("driver=3D%p, vm=3D%p, cookiein=3D%s, cookieinlen=3D%d, " @@ -3064,7 +3071,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver, qemuMigrationSrcRestoreDomainState(driver, vm); =20 qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, - priv->job.migParams, priv->job.apiFlags); + jobPriv->migParams, priv->job.apiFlags); =20 if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) VIR_WARN("Failed to save status on vm %s", vm->def->name); @@ -4642,6 +4649,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver, virErrorPtr orig_err =3D NULL; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; =20 if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, flags) < 0) @@ -4699,7 +4707,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver, */ if (!v3proto && ret < 0) qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, - priv->job.migParams, priv->job.apiFlags); + jobPriv->migParams, priv->job.apiFlags); =20 qemuMigrationSrcRestoreDomainState(driver, vm); =20 @@ -4740,6 +4748,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver, unsigned long resource) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; int ret =3D -1; =20 /* If we didn't start the job in the begin phase, start it now. */ @@ -4774,7 +4783,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver, endjob: if (ret < 0) { qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, - priv->job.migParams, priv->job.apiFlags); + jobPriv->migParams, priv->job.apiFlags); qemuMigrationJobFinish(driver, vm); } else { qemuMigrationJobContinue(vm); @@ -4973,6 +4982,7 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver, virErrorPtr orig_err =3D NULL; int cookie_flags =3D 0; qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); unsigned short port; unsigned long long timeReceived =3D 0; @@ -5226,7 +5236,7 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver, } =20 qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN, - priv->job.migParams, priv->job.apiFlags); + jobPriv->migParams, priv->job.apiFlags); =20 qemuMigrationJobFinish(driver, vm); if (!virDomainObjIsActive(vm)) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_par= ams.c index aea17b1ac8..fc282960da 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -950,6 +950,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver, qemuMigrationParamsPtr migParams) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; g_autoptr(virJSONValue) tlsProps =3D NULL; g_autoptr(virJSONValue) secProps =3D NULL; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); @@ -961,7 +962,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver, return -1; } =20 - if (!priv->job.migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) { + if (!jobPriv->migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("TLS migration is not supported with this " "QEMU binary")); @@ -1025,8 +1026,9 @@ qemuMigrationParamsDisableTLS(virDomainObjPtr vm, qemuMigrationParamsPtr migParams) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; =20 - if (!priv->job.migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) + if (!jobPriv->migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) return 0; =20 if (qemuMigrationParamsSetString(migParams, @@ -1150,6 +1152,7 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver, virBitmapPtr remoteCaps) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; qemuMigrationCapability cap; qemuMigrationParty party; size_t i; @@ -1203,7 +1206,7 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver, * to ask QEMU for their current settings. */ =20 - return qemuMigrationParamsFetch(driver, vm, asyncJob, &priv->job.migPa= rams); + return qemuMigrationParamsFetch(driver, vm, asyncJob, &jobPriv->migPar= ams); } =20 =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 70fc24b993..af060b3180 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1608,6 +1608,7 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon G_G= NUC_UNUSED, void *opaque G_GNUC_UNUSED) { qemuDomainObjPrivatePtr priv; + qemuDomainJobPrivatePtr jobPriv; =20 virObjectLock(vm); =20 @@ -1615,12 +1616,13 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon G= _GNUC_UNUSED, vm, vm->def->name); =20 priv =3D vm->privateData; + jobPriv =3D priv->job.privateData; if (priv->job.asyncJob !=3D QEMU_ASYNC_JOB_MIGRATION_OUT) { VIR_DEBUG("got SPICE_MIGRATE_COMPLETED event without a migration j= ob"); goto cleanup; } =20 - priv->job.spiceMigrated =3D true; + jobPriv->spiceMigrated =3D true; virDomainObjBroadcast(vm); =20 cleanup: @@ -1720,6 +1722,7 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G_G= NUC_UNUSED, void *opaque G_GNUC_UNUSED) { qemuDomainObjPrivatePtr priv; + qemuDomainJobPrivatePtr jobPriv; =20 virObjectLock(vm); =20 @@ -1727,11 +1730,12 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G= _GNUC_UNUSED, vm, vm->def->name, stats, NULLSTR(error)); =20 priv =3D vm->privateData; + jobPriv =3D priv->job.privateData; if (priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_NONE) { VIR_DEBUG("got DUMP_COMPLETED event without a dump_completed job"); goto cleanup; } - priv->job.dumpCompleted =3D true; + jobPriv->dumpCompleted =3D true; priv->job.current->stats.dump =3D *stats; priv->job.error =3D g_strdup(error); =20 @@ -3411,6 +3415,8 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver, virDomainState state, int reason) { + + qemuDomainJobPrivatePtr jobPriv =3D job->privateData; bool postcopy =3D (state =3D=3D VIR_DOMAIN_PAUSED && reason =3D=3D VIR_DOMAIN_PAUSED_POSTCOPY_FAILED) || (state =3D=3D VIR_DOMAIN_RUNNING && @@ -3459,7 +3465,7 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver, } =20 qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE, - job->migParams, job->apiFlags); + jobPriv->migParams, job->apiFlags); return 0; } =20 @@ -3471,6 +3477,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr drive= r, int reason, unsigned int *stopFlags) { + qemuDomainJobPrivatePtr jobPriv =3D job->privateData; bool postcopy =3D state =3D=3D VIR_DOMAIN_PAUSED && (reason =3D=3D VIR_DOMAIN_PAUSED_POSTCOPY || reason =3D=3D VIR_DOMAIN_PAUSED_POSTCOPY_FAILED); @@ -3554,7 +3561,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr drive= r, } =20 qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE, - job->migParams, job->apiFlags); + jobPriv->migParams, job->apiFlags); return 0; } =20 --=20 2.25.1 From nobody Sun May 5 12:40:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1594663467; cv=none; d=zohomail.com; s=zohoarc; b=lcuOgfWSRFyKK8BlUPmJmausYMMwgw4dyaXJNWHsbEZVymP/C4dVxIvhjO9mb6ezEuwVJSp/cdxHur/5GK51nNdhNdPQGTKwkPAKLuC30V7LsuYrwKtrtf2gDBUyAAC+X6NLI2QVxA1MVNhlcSBBpo5jTCav1qeHRE1mePrRoAc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594663467; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=r7hrXqhbspxCl/Aro1gFoH8gqp+RaMSK/IzcI6O9eag=; b=Hc5iqWwEi83DGehGR6Ra0lGsYMDKQlrWCxC+QF51/o/GXFf1TyXnx4gKav7C39nBCa+xoNuwR60PVyS14kS2KU2rfZrjDufp3dQKnrJrPzXmcpb4ahBIvQQyxdudCs/7Y8CtleD4cxRQitsPGVSoVmSrlW17qXnBP9z7pJqa73w= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1594663467763158.43431341478663; Mon, 13 Jul 2020 11:04:27 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-20-PQZPuq_dPT2HCjhQs7meTw-1; Mon, 13 Jul 2020 14:04:23 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 75DFF18C63D2; Mon, 13 Jul 2020 18:04:18 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 50FC0797E8; Mon, 13 Jul 2020 18:04:18 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id EA5321800B72; Mon, 13 Jul 2020 18:04:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 06DI426O007703 for ; Mon, 13 Jul 2020 14:04:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7255E2166BA4; Mon, 13 Jul 2020 18:04:02 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 38E372157F26 for ; Mon, 13 Jul 2020 18:04:02 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1A328100E7C6 for ; Mon, 13 Jul 2020 18:04:02 +0000 (UTC) Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-61-Qa6csQujPvOecwS1L-xiFg-1; Mon, 13 Jul 2020 14:03:59 -0400 Received: by mail-pj1-f66.google.com with SMTP id f16so227352pjt.0 for ; Mon, 13 Jul 2020 11:03:59 -0700 (PDT) Received: from localhost.localdomain ([116.72.84.11]) by smtp.gmail.com with ESMTPSA id q11sm238552pjj.17.2020.07.13.11.03.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2020 11:03:57 -0700 (PDT) X-MC-Unique: PQZPuq_dPT2HCjhQs7meTw-1 X-MC-Unique: Qa6csQujPvOecwS1L-xiFg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=r7hrXqhbspxCl/Aro1gFoH8gqp+RaMSK/IzcI6O9eag=; b=ANKUxKcS0DR3GNg8Tv47N9AsJv4NdHJ1pf1eBi+HdERQErT8j5MG/vpHQKu00Bjm8f FF2C66Oxg2BkzJC3mz28FxQzKwejbTwEGWq60v+x7Hd9oYKRwGnjZisc2KoioAVEc/+2 mIyfBvd0KQ9/X+dRM7sM7e7Cyym1t1JYIwTHPHR+USevqIGlAd0M559iQ9ZjHGVGCW8h QaC27/Ae44fA0R4B+DIzijCWU31reZHse/itH4PWpiQYwOS8z4aX+xRZgM+tPQEzJf4V mfEdoxKS3pQZ9SN5j676JIpQ16KvAv2/1sCLP8cWT8q+Gpbd45NGgO7q5qMDlI5EYPET G5fQ== X-Gm-Message-State: AOAM530pGvS60giz3y34RQQWs+Z88nqwpgbo3+fvdNtmzL8j7utDY+f7 KJnALh+BIMfBhBGKZrFrM5gRDJyy9jo= X-Google-Smtp-Source: ABdhPJyKFxQGEKP4KStTlhViF7cse7pV1J2LPaoI/0GIMdqsBAzy53D536EHcDuQSb9j33AE4EEPcQ== X-Received: by 2002:a17:90a:6acb:: with SMTP id b11mr573046pjm.71.1594663437805; Mon, 13 Jul 2020 11:03:57 -0700 (PDT) From: Prathamesh Chavan To: libvir-list@redhat.com Subject: [GSoC][PATCH v4 4/4] qemu_domainjob: introduce `privateData` for `qemuDomainJobInfo` Date: Mon, 13 Jul 2020 23:33:41 +0530 Message-Id: <20200713180341.173183-5-pc44800@gmail.com> In-Reply-To: <20200713180341.173183-1-pc44800@gmail.com> References: <20200713180341.173183-1-pc44800@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Prathamesh Chavan X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To remove dependecy of `qemuDomainJobInfo` on job specific paramters, a `privateData` pointer is introduced. To handle it, structure of callback functions is also introduced. Signed-off-by: Prathamesh Chavan --- src/qemu/qemu_backup.c | 15 +++-- src/qemu/qemu_domain.h | 18 ++++++ src/qemu/qemu_domainjob.c | 98 +++++++++++++++++++++++++------- src/qemu/qemu_domainjob.h | 31 +++++----- src/qemu/qemu_driver.c | 18 +++--- src/qemu/qemu_migration.c | 14 +++-- src/qemu/qemu_migration_cookie.c | 7 ++- src/qemu/qemu_process.c | 11 +++- 8 files changed, 154 insertions(+), 58 deletions(-) diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c index b711f8f623..a0832b4587 100644 --- a/src/qemu/qemu_backup.c +++ b/src/qemu/qemu_backup.c @@ -529,6 +529,7 @@ qemuBackupJobTerminate(virDomainObjPtr vm, =20 { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobInfoPrivatePtr jobInfoPriv; size_t i; =20 qemuDomainJobInfoUpdateTime(priv->job.current); @@ -536,10 +537,13 @@ qemuBackupJobTerminate(virDomainObjPtr vm, g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree); priv->job.completed =3D qemuDomainJobInfoCopy(priv->job.current); =20 - priv->job.completed->stats.backup.total =3D priv->backup->push_total; - priv->job.completed->stats.backup.transferred =3D priv->backup->push_t= ransferred; - priv->job.completed->stats.backup.tmp_used =3D priv->backup->pull_tmp_= used; - priv->job.completed->stats.backup.tmp_total =3D priv->backup->pull_tmp= _total; + + jobInfoPriv =3D priv->job.completed->privateData; + + jobInfoPriv->stats.backup.total =3D priv->backup->push_total; + jobInfoPriv->stats.backup.transferred =3D priv->backup->push_transferr= ed; + jobInfoPriv->stats.backup.tmp_used =3D priv->backup->pull_tmp_used; + jobInfoPriv->stats.backup.tmp_total =3D priv->backup->pull_tmp_total; =20 priv->job.completed->status =3D jobstatus; priv->job.completed->errmsg =3D g_strdup(priv->backup->errmsg); @@ -1069,7 +1073,8 @@ qemuBackupGetJobInfoStats(virQEMUDriverPtr driver, virDomainObjPtr vm, qemuDomainJobInfoPtr jobInfo) { - qemuDomainBackupStats *stats =3D &jobInfo->stats.backup; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; + qemuDomainBackupStats *stats =3D &jobInfoPriv->stats.backup; qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuMonitorJobInfoPtr *blockjobs =3D NULL; size_t nblockjobs =3D 0; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index bb9b414a46..7fcbefd0c0 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -502,6 +502,24 @@ struct _qemuDomainJobPrivate { qemuMigrationParamsPtr migParams; }; =20 +typedef struct _qemuDomainBackupStats qemuDomainBackupStats; +struct _qemuDomainBackupStats { + unsigned long long transferred; + unsigned long long total; + unsigned long long tmp_used; + unsigned long long tmp_total; +}; + +typedef struct _qemuDomainJobInfoPrivate qemuDomainJobInfoPrivate; +typedef qemuDomainJobInfoPrivate *qemuDomainJobInfoPrivatePtr; +struct _qemuDomainJobInfoPrivate { + union { + qemuMonitorMigrationStats mig; + qemuMonitorDumpStats dump; + qemuDomainBackupStats backup; + } stats; +}; + int qemuDomainObjStartWorker(virDomainObjPtr dom); void qemuDomainObjStopWorker(virDomainObjPtr dom); =20 diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index fe160afe79..bb086db2b7 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -63,6 +63,7 @@ VIR_ENUM_IMPL(qemuDomainAsyncJob, "backup", ); =20 + const char * qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job, int phase G_GNUC_UNUSED) @@ -115,27 +116,78 @@ qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob = job, return -1; } =20 +static void +qemuJobInfoFreePrivateData(qemuDomainJobInfoPrivatePtr priv) +{ + g_free(&priv->stats); +} + +static void +qemuJobInfoFreePrivate(void *opaque) +{ + qemuDomainJobInfoPtr jobInfo =3D (qemuDomainJobInfoPtr) opaque; + qemuJobInfoFreePrivateData(jobInfo->privateData); +} =20 void qemuDomainJobInfoFree(qemuDomainJobInfoPtr info) { + info->cb->freeJobInfoPrivate(info); g_free(info->errmsg); g_free(info); } =20 +static void * +qemuDomainJobInfoPrivateAlloc(void) +{ + qemuDomainJobInfoPrivatePtr retPriv =3D g_new0(qemuDomainJobInfoPrivat= e, 1); + return (void *)retPriv; +} + +static void +qemuDomainJobInfoPrivateCopy(qemuDomainJobInfoPtr src, + qemuDomainJobInfoPtr dest) +{ + memcpy(dest->privateData, src->privateData, + sizeof(qemuDomainJobInfoPrivate)); +} + +static qemuDomainJobInfoPtr +qemuDomainJobInfoAlloc(qemuDomainObjPrivateJobInfoCallbacksPtr cb) +{ + qemuDomainJobInfoPtr ret =3D g_new0(qemuDomainJobInfo, 1); + ret->cb =3D cb; + ret->privateData =3D ret->cb->allocJobInfoPrivate(); + return ret; +} + +static void +qemuDomainCurrentJobInfoInit(qemuDomainJobObjPtr job, + qemuDomainObjPrivateJobInfoCallbacksPtr cb) +{ + job->current =3D qemuDomainJobInfoAlloc(cb); + job->current->status =3D QEMU_DOMAIN_JOB_STATUS_ACTIVE; +} =20 qemuDomainJobInfoPtr qemuDomainJobInfoCopy(qemuDomainJobInfoPtr info) { - qemuDomainJobInfoPtr ret =3D g_new0(qemuDomainJobInfo, 1); + qemuDomainJobInfoPtr ret =3D qemuDomainJobInfoAlloc(info->cb); =20 memcpy(ret, info, sizeof(*info)); =20 + ret->cb->copyJobInfoPrivate(info, ret); ret->errmsg =3D g_strdup(info->errmsg); =20 return ret; } =20 +static qemuDomainObjPrivateJobInfoCallbacks qemuJobInfoPrivateCallbacks = =3D { + .allocJobInfoPrivate =3D &qemuDomainJobInfoPrivateAlloc, + .freeJobInfoPrivate =3D &qemuJobInfoFreePrivate, + .copyJobInfoPrivate =3D &qemuDomainJobInfoPrivateCopy, +}; + void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver, virDomainObjPtr vm) @@ -285,6 +337,7 @@ int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo) { unsigned long long now; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; =20 if (!jobInfo->stopped) return 0; @@ -298,8 +351,8 @@ qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jo= bInfo) return 0; } =20 - jobInfo->stats.mig.downtime =3D now - jobInfo->stopped; - jobInfo->stats.mig.downtime_set =3D true; + jobInfoPriv->stats.mig.downtime =3D now - jobInfo->stopped; + jobInfoPriv->stats.mig.downtime_set =3D true; return 0; } =20 @@ -334,38 +387,39 @@ int qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo, virDomainJobInfoPtr info) { + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; info->type =3D qemuDomainJobStatusToType(jobInfo->status); info->timeElapsed =3D jobInfo->timeElapsed; =20 switch (jobInfo->statsType) { case QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION: - info->memTotal =3D jobInfo->stats.mig.ram_total; - info->memRemaining =3D jobInfo->stats.mig.ram_remaining; - info->memProcessed =3D jobInfo->stats.mig.ram_transferred; - info->fileTotal =3D jobInfo->stats.mig.disk_total + + info->memTotal =3D jobInfoPriv->stats.mig.ram_total; + info->memRemaining =3D jobInfoPriv->stats.mig.ram_remaining; + info->memProcessed =3D jobInfoPriv->stats.mig.ram_transferred; + info->fileTotal =3D jobInfoPriv->stats.mig.disk_total + jobInfo->mirrorStats.total; - info->fileRemaining =3D jobInfo->stats.mig.disk_remaining + + info->fileRemaining =3D jobInfoPriv->stats.mig.disk_remaining + (jobInfo->mirrorStats.total - jobInfo->mirrorStats.transferred); - info->fileProcessed =3D jobInfo->stats.mig.disk_transferred + + info->fileProcessed =3D jobInfoPriv->stats.mig.disk_transferred + jobInfo->mirrorStats.transferred; break; =20 case QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP: - info->memTotal =3D jobInfo->stats.mig.ram_total; - info->memRemaining =3D jobInfo->stats.mig.ram_remaining; - info->memProcessed =3D jobInfo->stats.mig.ram_transferred; + info->memTotal =3D jobInfoPriv->stats.mig.ram_total; + info->memRemaining =3D jobInfoPriv->stats.mig.ram_remaining; + info->memProcessed =3D jobInfoPriv->stats.mig.ram_transferred; break; =20 case QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP: - info->memTotal =3D jobInfo->stats.dump.total; - info->memProcessed =3D jobInfo->stats.dump.completed; + info->memTotal =3D jobInfoPriv->stats.dump.total; + info->memProcessed =3D jobInfoPriv->stats.dump.completed; info->memRemaining =3D info->memTotal - info->memProcessed; break; =20 case QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP: - info->fileTotal =3D jobInfo->stats.backup.total; - info->fileProcessed =3D jobInfo->stats.backup.transferred; + info->fileTotal =3D jobInfoPriv->stats.backup.total; + info->fileProcessed =3D jobInfoPriv->stats.backup.transferred; info->fileRemaining =3D info->fileTotal - info->fileProcessed; break; =20 @@ -387,7 +441,8 @@ qemuDomainMigrationJobInfoToParams(qemuDomainJobInfoPtr= jobInfo, virTypedParameterPtr *params, int *nparams) { - qemuMonitorMigrationStats *stats =3D &jobInfo->stats.mig; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; + qemuMonitorMigrationStats *stats =3D &jobInfoPriv->stats.mig; qemuDomainMirrorStatsPtr mirrorStats =3D &jobInfo->mirrorStats; virTypedParameterPtr par =3D NULL; int maxpar =3D 0; @@ -564,7 +619,8 @@ qemuDomainDumpJobInfoToParams(qemuDomainJobInfoPtr jobI= nfo, virTypedParameterPtr *params, int *nparams) { - qemuMonitorDumpStats *stats =3D &jobInfo->stats.dump; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; + qemuMonitorDumpStats *stats =3D &jobInfoPriv->stats.dump; virTypedParameterPtr par =3D NULL; int maxpar =3D 0; int npar =3D 0; @@ -607,7 +663,8 @@ qemuDomainBackupJobInfoToParams(qemuDomainJobInfoPtr jo= bInfo, virTypedParameterPtr *params, int *nparams) { - qemuDomainBackupStats *stats =3D &jobInfo->stats.backup; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; + qemuDomainBackupStats *stats =3D &jobInfoPriv->stats.backup; g_autoptr(virTypedParamList) par =3D g_new0(virTypedParamList, 1); =20 if (virTypedParamListAddInt(par, jobInfo->operation, @@ -890,8 +947,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, qemuDomainAsyncJobTypeToString(asyncJob), obj, obj->def->name); qemuDomainObjResetAsyncJob(&priv->job); - priv->job.current =3D g_new0(qemuDomainJobInfo, 1); - priv->job.current->status =3D QEMU_DOMAIN_JOB_STATUS_ACTIVE; + qemuDomainCurrentJobInfoInit(&priv->job, &qemuJobInfoPrivateCa= llbacks); priv->job.asyncJob =3D asyncJob; priv->job.asyncOwner =3D virThreadSelfID(); priv->job.asyncOwnerAPI =3D virThreadJobGet(); diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index b0e840adc8..3c55cf29ed 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -107,16 +107,22 @@ struct _qemuDomainMirrorStats { unsigned long long total; }; =20 -typedef struct _qemuDomainBackupStats qemuDomainBackupStats; -struct _qemuDomainBackupStats { - unsigned long long transferred; - unsigned long long total; - unsigned long long tmp_used; - unsigned long long tmp_total; -}; - typedef struct _qemuDomainJobInfo qemuDomainJobInfo; typedef qemuDomainJobInfo *qemuDomainJobInfoPtr; + +typedef void *(*qemuDomainObjJobInfoPrivateAlloc)(void); +typedef void (*qemuDomainObjJobInfoPrivateFree)(void *); +typedef void (*qemuDomainObjJobInfoPrivateCopy)(qemuDomainJobInfoPtr, + qemuDomainJobInfoPtr); + +typedef struct _qemuDomainObjPrivateJobInfoCallbacks qemuDomainObjPrivateJ= obInfoCallbacks; +typedef qemuDomainObjPrivateJobInfoCallbacks *qemuDomainObjPrivateJobInfoC= allbacksPtr; +struct _qemuDomainObjPrivateJobInfoCallbacks { + qemuDomainObjJobInfoPrivateAlloc allocJobInfoPrivate; + qemuDomainObjJobInfoPrivateFree freeJobInfoPrivate; + qemuDomainObjJobInfoPrivateCopy copyJobInfoPrivate; +}; + struct _qemuDomainJobInfo { qemuDomainJobStatus status; virDomainJobOperation operation; @@ -136,14 +142,11 @@ struct _qemuDomainJobInfo { bool timeDeltaSet; /* Raw values from QEMU */ qemuDomainJobStatsType statsType; - union { - qemuMonitorMigrationStats mig; - qemuMonitorDumpStats dump; - qemuDomainBackupStats backup; - } stats; qemuDomainMirrorStats mirrorStats; - char *errmsg; /* optional error message for failed completed jobs */ + + void *privateData; /* job specific collection of info */ + qemuDomainObjPrivateJobInfoCallbacksPtr cb; }; =20 void diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d9c5f21f21..058e15e864 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3702,6 +3702,7 @@ qemuDumpWaitForCompletion(virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuDomainJobPrivatePtr jobPriv =3D priv->job.privateData; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D priv->job.current->private= Data; =20 VIR_DEBUG("Waiting for dump completion"); while (!jobPriv->dumpCompleted && !priv->job.abortJob) { @@ -3709,7 +3710,7 @@ qemuDumpWaitForCompletion(virDomainObjPtr vm) return -1; } =20 - if (priv->job.current->stats.dump.status =3D=3D QEMU_MONITOR_DUMP_STAT= US_FAILED) { + if (jobInfoPriv->stats.dump.status =3D=3D QEMU_MONITOR_DUMP_STATUS_FAI= LED) { if (priv->job.error) virReportError(VIR_ERR_OPERATION_FAILED, _("memory-only dump failed: %s"), @@ -13527,6 +13528,7 @@ qemuDomainGetJobInfoDumpStats(virQEMUDriverPtr driv= er, { qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuMonitorDumpStats stats =3D { 0 }; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; int rc; =20 if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < = 0) @@ -13537,33 +13539,33 @@ qemuDomainGetJobInfoDumpStats(virQEMUDriverPtr dr= iver, if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) return -1; =20 - jobInfo->stats.dump =3D stats; + jobInfoPriv->stats.dump =3D stats; =20 if (qemuDomainJobInfoUpdateTime(jobInfo) < 0) return -1; =20 - switch (jobInfo->stats.dump.status) { + switch (jobInfoPriv->stats.dump.status) { case QEMU_MONITOR_DUMP_STATUS_NONE: case QEMU_MONITOR_DUMP_STATUS_FAILED: case QEMU_MONITOR_DUMP_STATUS_LAST: virReportError(VIR_ERR_OPERATION_FAILED, _("dump query failed, status=3D%d"), - jobInfo->stats.dump.status); + jobInfoPriv->stats.dump.status); return -1; break; =20 case QEMU_MONITOR_DUMP_STATUS_ACTIVE: jobInfo->status =3D QEMU_DOMAIN_JOB_STATUS_ACTIVE; VIR_DEBUG("dump active, bytes written=3D'%llu' remaining=3D'%llu'", - jobInfo->stats.dump.completed, - jobInfo->stats.dump.total - - jobInfo->stats.dump.completed); + jobInfoPriv->stats.dump.completed, + jobInfoPriv->stats.dump.total - + jobInfoPriv->stats.dump.completed); break; =20 case QEMU_MONITOR_DUMP_STATUS_COMPLETED: jobInfo->status =3D QEMU_DOMAIN_JOB_STATUS_COMPLETED; VIR_DEBUG("dump completed, bytes written=3D'%llu'", - jobInfo->stats.dump.completed); + jobInfoPriv->stats.dump.completed); break; } =20 diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 2c7bf349c3..0c4136ef8a 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1439,7 +1439,8 @@ qemuMigrationSrcWaitForSpice(virDomainObjPtr vm) static void qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo) { - switch ((qemuMonitorMigrationStatus) jobInfo->stats.mig.status) { + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; + switch ((qemuMonitorMigrationStatus) jobInfoPriv->stats.mig.status) { case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY: jobInfo->status =3D QEMU_DOMAIN_JOB_STATUS_POSTCOPY; break; @@ -1486,6 +1487,7 @@ qemuMigrationAnyFetchStats(virQEMUDriverPtr driver, char **error) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; qemuMonitorMigrationStats stats; int rv; =20 @@ -1497,7 +1499,7 @@ qemuMigrationAnyFetchStats(virQEMUDriverPtr driver, if (qemuDomainObjExitMonitor(driver, vm) < 0 || rv < 0) return -1; =20 - jobInfo->stats.mig =3D stats; + jobInfoPriv->stats.mig =3D stats; =20 return 0; } @@ -1539,12 +1541,13 @@ qemuMigrationJobCheckStatus(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuDomainJobInfoPtr jobInfo =3D priv->job.current; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; char *error =3D NULL; bool events =3D virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVE= NT); int ret =3D -1; =20 if (!events || - jobInfo->stats.mig.status =3D=3D QEMU_MONITOR_MIGRATION_STATUS_ERR= OR) { + jobInfoPriv->stats.mig.status =3D=3D QEMU_MONITOR_MIGRATION_STATUS= _ERROR) { if (qemuMigrationAnyFetchStats(driver, vm, asyncJob, jobInfo, &err= or) < 0) return -1; } @@ -3013,6 +3016,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver, /* Update times with the values sent by the destination daemon */ if (mig->jobInfo && jobInfo) { int reason; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D mig->jobInfo->privateD= ata; =20 /* We need to refresh migration statistics after a completed post-= copy * migration since priv->job.completed contains obsolete data from= the @@ -3027,8 +3031,8 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver, qemuDomainJobInfoUpdateTime(jobInfo); jobInfo->timeDeltaSet =3D mig->jobInfo->timeDeltaSet; jobInfo->timeDelta =3D mig->jobInfo->timeDelta; - jobInfo->stats.mig.downtime_set =3D mig->jobInfo->stats.mig.downti= me_set; - jobInfo->stats.mig.downtime =3D mig->jobInfo->stats.mig.downtime; + jobInfoPriv->stats.mig.downtime_set =3D jobInfoPriv->stats.mig.dow= ntime_set; + jobInfoPriv->stats.mig.downtime =3D jobInfoPriv->stats.mig.downtim= e; } =20 if (flags & VIR_MIGRATE_OFFLINE) diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_coo= kie.c index 81b557e0a8..a3e3ff95e8 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -641,7 +641,8 @@ static void qemuMigrationCookieStatisticsXMLFormat(virBufferPtr buf, qemuDomainJobInfoPtr jobInfo) { - qemuMonitorMigrationStats *stats =3D &jobInfo->stats.mig; + qemuDomainJobInfoPrivatePtr jobInfoPriv =3D jobInfo->privateData; + qemuMonitorMigrationStats *stats =3D &jobInfoPriv->stats.mig; =20 virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); @@ -1043,14 +1044,16 @@ qemuMigrationCookieStatisticsXMLParse(xmlXPathConte= xtPtr ctxt) { qemuDomainJobInfoPtr jobInfo =3D NULL; qemuMonitorMigrationStats *stats; + qemuDomainJobInfoPrivatePtr jobInfoPriv; VIR_XPATH_NODE_AUTORESTORE(ctxt); =20 if (!(ctxt->node =3D virXPathNode("./statistics", ctxt))) return NULL; =20 jobInfo =3D g_new0(qemuDomainJobInfo, 1); + jobInfoPriv =3D jobInfo->privateData; =20 - stats =3D &jobInfo->stats.mig; + stats =3D &jobInfoPriv->stats.mig; jobInfo->status =3D QEMU_DOMAIN_JOB_STATUS_COMPLETED; =20 virXPathULongLong("string(./started[1])", ctxt, &jobInfo->started); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index af060b3180..eb9b980a6a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1641,6 +1641,7 @@ qemuProcessHandleMigrationStatus(qemuMonitorPtr mon G= _GNUC_UNUSED, virQEMUDriverPtr driver =3D opaque; virObjectEventPtr event =3D NULL; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + qemuDomainJobInfoPrivatePtr jobInfoPriv; int reason; =20 virObjectLock(vm); @@ -1650,12 +1651,14 @@ qemuProcessHandleMigrationStatus(qemuMonitorPtr mon= G_GNUC_UNUSED, qemuMonitorMigrationStatusTypeToString(status)); =20 priv =3D vm->privateData; + jobInfoPriv =3D priv->job.current->privateData; + if (priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_NONE) { VIR_DEBUG("got MIGRATION event without a migration job"); goto cleanup; } =20 - priv->job.current->stats.mig.status =3D status; + jobInfoPriv->stats.mig.status =3D status; virDomainObjBroadcast(vm); =20 if (status =3D=3D QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY && @@ -1723,6 +1726,7 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G_G= NUC_UNUSED, { qemuDomainObjPrivatePtr priv; qemuDomainJobPrivatePtr jobPriv; + qemuDomainJobInfoPrivatePtr jobInfoPriv; =20 virObjectLock(vm); =20 @@ -1731,18 +1735,19 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G= _GNUC_UNUSED, =20 priv =3D vm->privateData; jobPriv =3D priv->job.privateData; + jobInfoPriv =3D priv->job.current->privateData; if (priv->job.asyncJob =3D=3D QEMU_ASYNC_JOB_NONE) { VIR_DEBUG("got DUMP_COMPLETED event without a dump_completed job"); goto cleanup; } jobPriv->dumpCompleted =3D true; - priv->job.current->stats.dump =3D *stats; + jobInfoPriv->stats.dump =3D *stats; priv->job.error =3D g_strdup(error); =20 /* Force error if extracting the DUMP_COMPLETED status failed */ if (!error && status < 0) { priv->job.error =3D g_strdup(virGetLastErrorMessage()); - priv->job.current->stats.dump.status =3D QEMU_MONITOR_DUMP_STATUS_= FAILED; + jobInfoPriv->stats.dump.status =3D QEMU_MONITOR_DUMP_STATUS_FAILED; } =20 virDomainObjBroadcast(vm); --=20 2.25.1