From nobody Wed May 14 06:08:19 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1525879988281198.6843097788868; Wed, 9 May 2018 08:33:08 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B9DBD3003A3E; Wed, 9 May 2018 15:33:06 +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 8909010840CC; Wed, 9 May 2018 15:33:06 +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 14C2A180BADB; Wed, 9 May 2018 15:33:06 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w49FX3VJ009866 for ; Wed, 9 May 2018 11:33:03 -0400 Received: by smtp.corp.redhat.com (Postfix) id AF28010016C6; Wed, 9 May 2018 15:33:03 +0000 (UTC) Received: from mx1.redhat.com (ext-mx11.extmail.prod.ext.phx2.redhat.com [10.5.110.40]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A66AB1001645 for ; Wed, 9 May 2018 15:33:01 +0000 (UTC) Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 698BE32FEBC6 for ; Wed, 9 May 2018 15:33:00 +0000 (UTC) Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w49FISL7117466 for ; Wed, 9 May 2018 11:32:59 -0400 Received: from e06smtp11.uk.ibm.com (e06smtp11.uk.ibm.com [195.75.94.107]) by mx0b-001b2d01.pphosted.com with ESMTP id 2hv34wtjaj-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 09 May 2018 11:32:59 -0400 Received: from localhost by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 9 May 2018 16:32:56 +0100 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 9 May 2018 16:32:54 +0100 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w49FWNkf3408274 for ; Wed, 9 May 2018 15:32:53 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1DC1CB57D1 for ; Wed, 9 May 2018 15:46:36 +0100 (BST) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 043EEAE96C for ; Wed, 9 May 2018 15:46:36 +0100 (BST) Received: from marc-ibm.boeblingen.de.ibm.com (unknown [9.152.224.71]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP for ; Wed, 9 May 2018 15:46:35 +0100 (BST) From: Marc Hartmayer To: Date: Wed, 9 May 2018 16:56:16 +0200 In-Reply-To: <20180509145622.23049-1-mhartmay@linux.vnet.ibm.com> References: <20180509145622.23049-1-mhartmay@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18050915-0040-0000-0000-00000457BDA8 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18050915-0041-0000-0000-000020FBCA41 Message-Id: <20180509145622.23049-7-mhartmay@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2018-05-09_06:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1805090142 X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Wed, 09 May 2018 15:33:00 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Wed, 09 May 2018 15:33:00 +0000 (UTC) for IP:'148.163.158.5' DOMAIN:'mx0b-001b2d01.pphosted.com' HELO:'mx0a-001b2d01.pphosted.com' FROM:'mhartmay@linux.vnet.ibm.com' RCPT:'' X-RedHat-Spam-Score: -0.7 (RCVD_IN_DNSWL_LOW) 148.163.158.5 mx0b-001b2d01.pphosted.com 148.163.158.5 mx0b-001b2d01.pphosted.com X-Scanned-By: MIMEDefang 2.84 on 10.5.110.40 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 06/12] qemu: Add the functionality to override the boot configuration 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]); Wed, 09 May 2018 15:33:07 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add the functionality to override the boot configuration of a domain at the start time to the QEMU driver. Signed-off-by: Marc Hartmayer Reviewed-by: Boris Fiuczynski Reviewed-by: Stefan Zimmermann --- src/qemu/qemu_driver.c | 36 ++++++++++++++++++++++++++---------- src/qemu/qemu_migration.c | 3 ++- src/qemu/qemu_process.c | 16 +++++++++++----- src/qemu/qemu_process.h | 2 ++ 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c129321a5c25..9a43d4157b09 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -145,7 +145,8 @@ static int qemuDomainObjStart(virConnectPtr conn, virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags, - qemuDomainAsyncJob asyncJob); + qemuDomainAsyncJob asyncJob, + const virCreateParams *createParams); =20 static int qemuDomainManagedSaveLoad(virDomainObjPtr vm, void *opaque); @@ -257,6 +258,7 @@ qemuAutostartDomain(virDomainObjPtr vm, int flags =3D 0; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); int ret =3D -1; + const virCreateParams createParams =3D { 0 }; =20 if (cfg->autoStartBypassCache) flags |=3D VIR_DOMAIN_START_BYPASS_CACHE; @@ -275,7 +277,7 @@ qemuAutostartDomain(virDomainObjPtr vm, } =20 if (qemuDomainObjStart(NULL, driver, vm, flags, - QEMU_ASYNC_JOB_START) < 0) { + QEMU_ASYNC_JOB_START, &createParams) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to autostart VM '%s': %s"), vm->def->name, virGetLastErrorMessage()); @@ -1735,6 +1737,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, virCapsPtr caps =3D NULL; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_ABI_UPDATE; + const virCreateParams createParams =3D { 0 }; =20 virCheckFlags(VIR_DOMAIN_START_PAUSED | VIR_DOMAIN_START_AUTODESTROY | @@ -1776,7 +1779,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, if (qemuProcessStart(conn, driver, vm, NULL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, - start_flags) < 0) { + &createParams, start_flags) < 0) { virDomainAuditStart(vm, "booted", false); qemuDomainRemoveInactive(driver, vm); qemuProcessEndJob(driver, vm); @@ -6558,6 +6561,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); virQEMUSaveHeaderPtr header =3D &data->header; qemuDomainSaveCookiePtr cookie =3D NULL; + const virCreateParams createParams =3D { 0 }; =20 if (virSaveCookieParseString(data->cookie, (virObjectPtr *)&cookie, virDomainXMLOptionGetSaveCookie(driver->x= mlopt)) < 0) @@ -6592,7 +6596,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, asyncJob, "stdio", *fd, path, NULL, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, - VIR_QEMU_PROCESS_START_PAUSED) =3D=3D 0) + &createParams, VIR_QEMU_PROCESS_START_PAUSED) =3D= =3D 0) restored =3D true; =20 if (intermediatefd !=3D -1) { @@ -7234,7 +7238,8 @@ qemuDomainObjStart(virConnectPtr conn, virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags, - qemuDomainAsyncJob asyncJob) + qemuDomainAsyncJob asyncJob, + const virCreateParams *createParams) { int ret =3D -1; char *managed_save; @@ -7270,6 +7275,13 @@ qemuDomainObjStart(virConnectPtr conn, virDomainJobOperation op =3D priv->job.current->operation; priv->job.current->operation =3D VIR_DOMAIN_JOB_OPERATION_REST= ORE; =20 + if (createParams->bootDeviceIdentifier || createParams->kernel= || + createParams->initrd || createParams->cmdline) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Transient changes are not possible with = the managed save option.")); + goto cleanup; + } + ret =3D qemuDomainObjRestore(conn, driver, vm, managed_save, start_paused, bypass_cache, asyncJo= b); =20 @@ -7294,7 +7306,8 @@ qemuDomainObjStart(virConnectPtr conn, =20 ret =3D qemuProcessStart(conn, driver, vm, NULL, asyncJob, NULL, -1, NULL, NULL, - VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags= ); + VIR_NETDEV_VPORT_PROFILE_OP_CREATE, + createParams, start_flags); virDomainAuditStart(vm, "booted", ret >=3D 0); if (ret >=3D 0) { virObjectEventPtr event =3D @@ -7317,12 +7330,14 @@ qemuDomainObjStart(virConnectPtr conn, return ret; } =20 + static int qemuDomainCreateWithFlags(virDomainPtr dom, unsigned int flags) { virQEMUDriverPtr driver =3D dom->conn->privateData; virDomainObjPtr vm; int ret =3D -1; + const virCreateParams createParams =3D { 0 }; =20 virCheckFlags(VIR_DOMAIN_START_PAUSED | VIR_DOMAIN_START_AUTODESTROY | @@ -7348,7 +7363,7 @@ qemuDomainCreateWithFlags(virDomainPtr dom, unsigned = int flags) } =20 if (qemuDomainObjStart(dom->conn, driver, vm, flags, - QEMU_ASYNC_JOB_START) < 0) + QEMU_ASYNC_JOB_START, &createParams) < 0) goto endjob; =20 dom->id =3D vm->def->id; @@ -15769,6 +15784,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, bool was_stopped =3D false; qemuDomainSaveCookiePtr cookie; virCPUDefPtr origCPU =3D NULL; + const virCreateParams createParams =3D { 0 }; =20 virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED | @@ -15990,7 +16006,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, cookie ? cookie->cpu : NULL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, sn= ap, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, - VIR_QEMU_PROCESS_START_PAUSED); + &createParams, VIR_QEMU_PROCESS_START_PA= USED); virDomainAuditStart(vm, "from-snapshot", rc >=3D 0); detail =3D VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT; event =3D virDomainEventLifecycleNewFromObj(vm, @@ -16083,7 +16099,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, qemuDomainEventQueue(driver, event); rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, NU= LL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, NU= LL, - VIR_NETDEV_VPORT_PROFILE_OP_CREATE, + VIR_NETDEV_VPORT_PROFILE_OP_CREATE, &cre= ateParams, start_flags); virDomainAuditStart(vm, "from-snapshot", rc >=3D 0); if (rc < 0) { @@ -18393,7 +18409,7 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, qemuDomainObjPrivatePtr priv =3D NULL; virDomainDefPtr def =3D NULL; virDomainDefPtr persistentDef =3D NULL; - virDomainBlockIoTuneInfo reply =3D {0}; + virDomainBlockIoTuneInfo reply =3D { 0 }; char *device =3D NULL; int ret =3D -1; int maxparams; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 7602a304c57f..6709af8cba16 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2178,6 +2178,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, int rv; char *tlsAlias =3D NULL; char *secAlias =3D NULL; + const virCreateParams createParams =3D { 0 }; =20 virNWFilterReadLockFilterUpdates(); =20 @@ -2335,7 +2336,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, startFlags =3D VIR_QEMU_PROCESS_START_AUTODESTROY; =20 if (qemuProcessInit(driver, vm, mig->cpu, QEMU_ASYNC_JOB_MIGRATION_IN, - true, startFlags) < 0) + true, &createParams, startFlags) < 0) goto stopjob; stopProcess =3D true; =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 37876b8d0aa6..218eb4691a86 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5008,6 +5008,7 @@ qemuProcessInit(virQEMUDriverPtr driver, virCPUDefPtr updatedCPU, qemuDomainAsyncJob asyncJob, bool migration, + const virCreateParams *createParams, unsigned int flags) { virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); @@ -5061,6 +5062,9 @@ qemuProcessInit(virQEMUDriverPtr driver, if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm) < 0) goto cleanup; =20 + if (virDomainDefOverrideBootConf(vm->def, createParams) < 0) + goto cleanup; + if (flags & VIR_QEMU_PROCESS_START_PRETEND) { if (qemuDomainSetPrivatePaths(driver, vm) < 0) { virDomainObjRemoveTransientDef(vm); @@ -6296,6 +6300,7 @@ qemuProcessStart(virConnectPtr conn, const char *migratePath, virDomainSnapshotObjPtr snapshot, virNetDevVPortProfileOp vmop, + const virCreateParams *createParams, unsigned int flags) { qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -6307,11 +6312,11 @@ qemuProcessStart(virConnectPtr conn, =20 VIR_DEBUG("conn=3D%p driver=3D%p vm=3D%p name=3D%s id=3D%d asyncJob=3D= %s " "migrateFrom=3D%s migrateFd=3D%d migratePath=3D%s " - "snapshot=3D%p vmop=3D%d flags=3D0x%x", + "snapshot=3D%p vmop=3D%d createParams=3D%p flags=3D0x%x", conn, driver, vm, vm->def->name, vm->def->id, qemuDomainAsyncJobTypeToString(asyncJob), NULLSTR(migrateFrom), migrateFd, NULLSTR(migratePath), - snapshot, vmop, flags); + snapshot, vmop, createParams, flags); =20 virCheckFlagsGoto(VIR_QEMU_PROCESS_START_COLD | VIR_QEMU_PROCESS_START_PAUSED | @@ -6320,8 +6325,8 @@ qemuProcessStart(virConnectPtr conn, if (!migrateFrom && !snapshot) flags |=3D VIR_QEMU_PROCESS_START_NEW; =20 - if (qemuProcessInit(driver, vm, updatedCPU, - asyncJob, !!migrateFrom, flags) < 0) + if (qemuProcessInit(driver, vm, updatedCPU, asyncJob, !!migrateFrom, + createParams, flags) < 0) goto cleanup; =20 if (migrateFrom) { @@ -6396,6 +6401,7 @@ qemuProcessCreatePretendCmd(virQEMUDriverPtr driver, unsigned int flags) { virCommandPtr cmd =3D NULL; + const virCreateParams createParams =3D { 0 }; =20 virCheckFlagsGoto(VIR_QEMU_PROCESS_START_COLD | VIR_QEMU_PROCESS_START_PAUSED | @@ -6405,7 +6411,7 @@ qemuProcessCreatePretendCmd(virQEMUDriverPtr driver, flags |=3D VIR_QEMU_PROCESS_START_NEW; =20 if (qemuProcessInit(driver, vm, NULL, QEMU_ASYNC_JOB_NONE, - !!migrateURI, flags) < 0) + !!migrateURI, &createParams, flags) < 0) goto cleanup; =20 if (qemuProcessPrepareDomain(driver, vm, flags) < 0) diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 9dd5c97642db..e344ad532618 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -91,6 +91,7 @@ int qemuProcessStart(virConnectPtr conn, const char *stdin_path, virDomainSnapshotObjPtr snapshot, virNetDevVPortProfileOp vmop, + const virCreateParams *params, unsigned int flags); =20 virCommandPtr qemuProcessCreatePretendCmd(virQEMUDriverPtr driver, @@ -105,6 +106,7 @@ int qemuProcessInit(virQEMUDriverPtr driver, virCPUDefPtr updatedCPU, qemuDomainAsyncJob asyncJob, bool migration, + const virCreateParams *params, unsigned int flags); =20 int qemuProcessPrepareDomain(virQEMUDriverPtr driver, --=20 2.13.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list