From nobody Wed May 8 16:10:59 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=quarantine dis=quarantine) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1613780393; cv=none; d=zohomail.com; s=zohoarc; b=FnopRGElvIsYPXmk5sO53FNTX8/cGilS5EPl1AsouFLM9H5spQ2Lku+AUMfxt9k7WcwErjHANBquG1uJFKflw7feWJ3ABsYY9ekx1GUCqI8BAhrDod0Z2TQq2o33TX4xPIxXEN6vJ8gViyIMYaY0Qcw8tFf3A6fOSkZAfzhn/IA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1613780393; h=Content-Type:Content-Transfer-Encoding:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=06oLtjHkCOwhLvyiAKCeVicAf1HobJkmfVB5khxxxNk=; b=hGgNGnX+5+eqtS9/2SPGGdohWHrw/jBuSYSpfhg10DLdufUVM0dYUvuEYU1jYE4n/OSdlCiDhczirgNTCu8J9JlqowcvbcsGFu064ksW084jO0Zml6wJvdPjcM3LfXTAT9IiaarPqgWxgMRDirlEfSAwz2ceNG23hssZlLXtdGA= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=quarantine dis=quarantine) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 1613780392900413.8585284606596; Fri, 19 Feb 2021 16:19:52 -0800 (PST) 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-484-S46HsotfM-26SN9iOKxgIA-1; Fri, 19 Feb 2021 19:19:49 -0500 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 5A58C801975; Sat, 20 Feb 2021 00:19:43 +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 778E55D9C2; Sat, 20 Feb 2021 00:19:40 +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 66A7B4E58E; Sat, 20 Feb 2021 00:19:36 +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 11K0JXrS003599 for ; Fri, 19 Feb 2021 19:19:34 -0500 Received: by smtp.corp.redhat.com (Postfix) id BFEED1037AD; Sat, 20 Feb 2021 00:19:33 +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 B93B51037AE for ; Sat, 20 Feb 2021 00:19:31 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.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 8C4DD9291A3 for ; Sat, 20 Feb 2021 00:19:31 +0000 (UTC) Received: from de-smtp-delivery-102.mimecast.com (de-smtp-delivery-102.mimecast.com [62.140.7.102]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-nZ9vxe6eOnaknHZHE7NpsQ-1; Fri, 19 Feb 2021 19:19:29 -0500 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05lp2113.outbound.protection.outlook.com [104.47.18.113]) (Using TLS) by relay.mimecast.com with ESMTP id de-mta-4-azG1vNdBOQKHZLUcQkIP5A-1; Sat, 20 Feb 2021 01:19:26 +0100 Received: from AM8PR04MB7970.eurprd04.prod.outlook.com (2603:10a6:20b:24f::9) by AM0PR04MB5202.eurprd04.prod.outlook.com (2603:10a6:208:c6::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3868.27; Sat, 20 Feb 2021 00:19:25 +0000 Received: from AM8PR04MB7970.eurprd04.prod.outlook.com ([fe80::8532:12af:9c2:66ca]) by AM8PR04MB7970.eurprd04.prod.outlook.com ([fe80::8532:12af:9c2:66ca%7]) with mapi id 15.20.3868.027; Sat, 20 Feb 2021 00:19:25 +0000 Received: from linux-tbji.devlab.prv.suse.com (75.169.34.2) by AM3PR07CA0070.eurprd07.prod.outlook.com (2603:10a6:207:4::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.8 via Frontend Transport; Sat, 20 Feb 2021 00:19:24 +0000 X-MC-Unique: S46HsotfM-26SN9iOKxgIA-1 X-MC-Unique: nZ9vxe6eOnaknHZHE7NpsQ-1 X-MC-Unique: azG1vNdBOQKHZLUcQkIP5A-1 From: Jim Fehlig To: libvir-list@redhat.com Subject: [PATCH] libxl: Fix domain shutdown Date: Fri, 19 Feb 2021 17:19:06 -0700 Message-ID: <20210220001906.12778-1-jfehlig@suse.com> X-Originating-IP: [75.169.34.2] X-ClientProxiedBy: AM3PR07CA0070.eurprd07.prod.outlook.com (2603:10a6:207:4::28) To AM8PR04MB7970.eurprd04.prod.outlook.com (2603:10a6:20b:24f::9) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 851dfaad-11e6-4504-9d0a-08d8d5352da7 X-MS-TrafficTypeDiagnostic: AM0PR04MB5202: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0 X-Microsoft-Antispam-Message-Info: hfPbq8QGGOe9txsJPFv27le4SkWcfkGW8EdrbJA4KzPxNBMYjI5rxMe4E7XXDvycFrJpfaFQ9Cnz5m9jgazydNwKsB6LFpyAfILN2qltHru1dIdPNtP9tF/9Dthn/np8Q1xIQQJhy2xPJtCc0Y29cvb7WSPTP6om6z6wnVBVyKcD+6y6q8tOhI4nYtRJ728NMD6N0fzvYJwReU3iY4whLC/ws87xIkMkOdXFavaN4TJT+66uvKboFpzo62zvEsC1ca+m0Vo5hkXKKEopO64pBO5yqw6jqZgCGgeV8wwA3/kpJ2ZJHgI9HTNOOw2sLi0/9+bkqinMhdnodVwE3Z64O0+ydbGj3T/tDKVRzvO5YR68eXzNV6L6hOHeqgo6AypMd7nnUaZ1T94dS+2URdm7irO32ufOAQ3SRrRPCKhu/oibM+bHShW0mKECvdYPtX7qZdddzM8Pz14DX7rZJgljPyJIZAUzrrk3lmUYQAdMLJFDGZW+PcPByViKJWFhjA1GrKnOU01VJ/0ySYZ3lyCeZQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM8PR04MB7970.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(396003)(39840400004)(136003)(376002)(366004)(346002)(478600001)(316002)(6486002)(956004)(86362001)(2616005)(8676002)(186003)(7696005)(6916009)(83380400001)(4326008)(36756003)(52116002)(26005)(16526019)(6666004)(1076003)(2906002)(8936002)(66476007)(66556008)(5660300002)(107886003)(66946007); DIR:OUT; SFP:1101 X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?024SkOBFha5GHjGYejum6MWQb6wNEK066xlZATvF8/oDb2IbHwWKRfETpLcm?= =?us-ascii?Q?thkEy3UqLO0V0bKFVsgeFwelegfAirFVp5NIAR0qsfiYq0zzZIVPRYXzd9xS?= =?us-ascii?Q?MbOPsVow2PwtR7aoeX3eumfSVSszz5QCiH8YV3dZtlUyZ85eVh//VU3pA/cz?= =?us-ascii?Q?krfoqH6Txbfe+jA2WYf0t4Bj1S6Ap2treyBCpx/ERAebtYhVrtjgT8/pGAfQ?= =?us-ascii?Q?FX1N1ESa5ny1ZdkYJgx9Qp6laL6NgqEy//3zpzpj4dMDBASWtC8CCpIpQsnt?= =?us-ascii?Q?Lisgw8NXAjCDEaFWVx5EPih26cGF8Ya0oNgFu+d1WYhWjIopTgMHVzuTW/Ou?= =?us-ascii?Q?LPj7ZqRWGRTiK3jvohvebrRzHwFfD5ZTahNo0tEpIk6yRzzVMsYevGZPs16x?= =?us-ascii?Q?S5N3djyqS8zI0KRKkhLsjodjO/s08I8wyJs3GsQi8GiCk+d6MIObYfu/C+x3?= =?us-ascii?Q?EQBPNBk9VBAIrHtqdCZmfGUPbKprWZJABpBkBB/8rt+SsqvCeXqad941t7vG?= =?us-ascii?Q?iv5sumed1aNtlax8llo24ICd2jnoQxNsKwyuF7oxdu0O5zXZopdyAko8Z0/C?= =?us-ascii?Q?Yu94j1uunfyHtWPZkLFVPiX2ZVUdgLIhccRU9XvSTO2mtrAvmVvf7jJk20sV?= =?us-ascii?Q?yHPwke+uxvgdPNTBJWCtnqvIW8h+yfMNig2yCp+Trps6TyH+IUCvEl+bRprb?= =?us-ascii?Q?0wbw4vTcrsZprB1m7/Jn3Al+9SvWqrzirjJuTL6ggmJSwsytSTVVdYA0YoyX?= =?us-ascii?Q?d0BrFBNoRMkcc8lYkrtDBoSkWjnykzQZrMkJQAIVHMQB1LLCW5en4LnGiE8G?= =?us-ascii?Q?WIBcHu4oWzJf2LdeO6G+uvAvGaQiWpJqmGIZspOPoNbtpP+8jzeiCldybKsZ?= =?us-ascii?Q?R04MQ4woPf3jsT1kMgvCNEMDtC8wIDiFrNegOVcwVokAJ/nBgnmdTHMRnqW3?= =?us-ascii?Q?dJX6q6DW3oND5b4E28xq5TPGVq2DTRxN1IogvrJY2n6DPtLYt1MEJMEZi86p?= =?us-ascii?Q?dVjar9zTPf2SyN8+rW1gHJBbpgUApivAOwSjq8B1JtjZDxPt7XM92ZhRh0/r?= =?us-ascii?Q?+VVGD4SkTdTV1S2P7f1FJyUsy3N0lpuRGwLZVPTlPQHnZ9cc0nR+3I0qIKiC?= =?us-ascii?Q?fKEvsyCCbizO7DoTgtnDDuKldeXIX1vbd21j4L6qpRt5ShDt2u0far2lvNO1?= =?us-ascii?Q?yCAvqJAT43KQ04S+8Bo92Q/bb2w8XQ3m4fJ3RYFVLqot+Jx0ZLUbUuMC0TcF?= =?us-ascii?Q?ZGgo8/Z3RLeJvhrqL3y/1i8KvBCAKln+UMO8AluELknzQS2g6hckH/arMCdq?= =?us-ascii?Q?F0CURXWEvyli1adi9+kv4wwc?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 851dfaad-11e6-4504-9d0a-08d8d5352da7 X-MS-Exchange-CrossTenant-AuthSource: AM8PR04MB7970.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Feb 2021 00:19:25.1346 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pkrZv01xD/B8TsCwstl9JqpdsB/QOve04UY2OblUyjl2O7B1VrBW9qnCrh+VnsapBdH1maARNTCIkd795sx3gA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB5202 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 11K0JXrS003599 X-loop: libvir-list@redhat.com 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" Commit fa30ee04a2 caused a regression in normal domain shutown. Initiating a shutdown from within the domain or via 'virsh shutdown' does cause the guest OS running in the domain to shutdown, but libvirt never reaps the domain so it is always shown in a running state until calling 'virsh destroy'. The shutdown thread is also an internal user of the driver shutdown machinery and eventually calls libxlDomainDestroyInternal where the ignoreDeathEvent inhibitor is set, but running in a thread introduces the possibility of racing with the death event from libxl. This can be prevented by setting ignoreDeathEvent before running the shutdown thread. An additional improvement is to handle the destroy event synchronously instead of spawning a thread. The time consuming aspects of destroying a domain have been completed when the destroy event is delivered. Signed-off-by: Jim Fehlig Reviewed-by: Michal Privoznik --- src/libxl/libxl_domain.c | 115 ++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 61 deletions(-) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index d59153fffa..32dc503089 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -476,6 +476,7 @@ libxlDomainShutdownHandleRestart(libxlDriverPrivatePtr = driver, struct libxlShutdownThreadInfo { libxlDriverPrivatePtr driver; + virDomainObjPtr vm; libxl_event *event; }; =20 @@ -484,7 +485,7 @@ static void libxlDomainShutdownThread(void *opaque) { struct libxlShutdownThreadInfo *shutdown_info =3D opaque; - virDomainObjPtr vm =3D NULL; + virDomainObjPtr vm =3D shutdown_info->vm; libxl_event *ev =3D shutdown_info->event; libxlDriverPrivatePtr driver =3D shutdown_info->driver; virObjectEventPtr dom_event =3D NULL; @@ -494,12 +495,6 @@ libxlDomainShutdownThread(void *opaque) =20 libxl_domain_config_init(&d_config); =20 - vm =3D virDomainObjListFindByID(driver->domains, ev->domid); - if (!vm) { - VIR_INFO("Received event for unknown domain ID %d", ev->domid); - goto cleanup; - } - if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) goto cleanup; =20 @@ -616,32 +611,18 @@ libxlDomainShutdownThread(void *opaque) } =20 static void -libxlDomainDeathThread(void *opaque) +libxlDomainHandleDeath(libxlDriverPrivatePtr driver, virDomainObjPtr vm) { - struct libxlShutdownThreadInfo *shutdown_info =3D opaque; - virDomainObjPtr vm =3D NULL; - libxl_event *ev =3D shutdown_info->event; - libxlDriverPrivatePtr driver =3D shutdown_info->driver; virObjectEventPtr dom_event =3D NULL; - g_autoptr(libxlDriverConfig) cfg =3D libxlDriverConfigGet(driver); - libxlDomainObjPrivatePtr priv; - - vm =3D virDomainObjListFindByID(driver->domains, ev->domid); - if (!vm) { - /* vm->def->id already cleared, means the death was handled by the - * driver already */ - goto cleanup; - } - - priv =3D vm->privateData; + libxlDomainObjPrivatePtr priv =3D vm->privateData; =20 if (priv->ignoreDeathEvent) { priv->ignoreDeathEvent =3D false; - goto cleanup; + return; } =20 if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) - goto cleanup; + return; =20 virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_DESTRO= YED); dom_event =3D virDomainEventLifecycleNewFromObj(vm, @@ -651,12 +632,7 @@ libxlDomainDeathThread(void *opaque) if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); libxlDomainObjEndJob(driver, vm); - - cleanup: - virDomainObjEndAPI(&vm); virObjectEventStateQueue(driver->domainEventState, dom_event); - libxl_event_free(cfg->ctx, ev); - VIR_FREE(shutdown_info); } =20 =20 @@ -668,16 +644,13 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_C= ONST libxl_event *event) { libxlDriverPrivatePtr driver =3D data; libxl_shutdown_reason xl_reason =3D event->u.domain_shutdown.shutdown_= reason; - struct libxlShutdownThreadInfo *shutdown_info =3D NULL; - virThread thread; + virDomainObjPtr vm =3D NULL; g_autoptr(libxlDriverConfig) cfg =3D NULL; - int ret =3D -1; - g_autofree char *name =3D NULL; =20 if (event->type !=3D LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN && event->type !=3D LIBXL_EVENT_TYPE_DOMAIN_DEATH) { VIR_INFO("Unhandled event type %d", event->type); - goto error; + goto cleanup; } =20 /* @@ -685,42 +658,62 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_C= ONST libxl_event *event) * after calling libxl_domain_suspend() are handled by its callers. */ if (xl_reason =3D=3D LIBXL_SHUTDOWN_REASON_SUSPEND) - goto error; + goto cleanup; =20 - /* - * Start a thread to handle shutdown. We don't want to be tying up - * libxl's event machinery by doing a potentially lengthy shutdown. - */ - shutdown_info =3D g_new0(struct libxlShutdownThreadInfo, 1); + vm =3D virDomainObjListFindByID(driver->domains, event->domid); + if (!vm) { + /* Nothing to do if we can't find the virDomainObj */ + goto cleanup; + } =20 - shutdown_info->driver =3D driver; - shutdown_info->event =3D (libxl_event *)event; - name =3D g_strdup_printf("ev-%d", event->domid); - if (event->type =3D=3D LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) - ret =3D virThreadCreateFull(&thread, false, libxlDomainShutdownThr= ead, - name, false, shutdown_info); - else if (event->type =3D=3D LIBXL_EVENT_TYPE_DOMAIN_DEATH) - ret =3D virThreadCreateFull(&thread, false, libxlDomainDeathThread, - name, false, shutdown_info); + if (event->type =3D=3D LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) { + libxlDomainObjPrivatePtr priv =3D vm->privateData; + struct libxlShutdownThreadInfo *shutdown_info =3D NULL; + virThread thread; + g_autofree char *name =3D NULL; =20 - if (ret < 0) { /* - * Not much we can do on error here except log it. + * Start a thread to handle shutdown. We don't want to be tying up + * libxl's event machinery by doing a potentially lengthy shutdown. */ - VIR_ERROR(_("Failed to create thread to handle domain shutdown")); - goto error; - } + shutdown_info =3D g_new0(struct libxlShutdownThreadInfo, 1); =20 - /* - * libxlShutdownThreadInfo and libxl_event are freed in shutdown thread - */ - return; + shutdown_info->driver =3D driver; + shutdown_info->vm =3D vm; + shutdown_info->event =3D (libxl_event *)event; + name =3D g_strdup_printf("ev-%d", event->domid); + /* + * Cleanup will be handled by the shutdown thread. + * Ignore the forthcoming death event from libxl + */ + priv->ignoreDeathEvent =3D true; + if (virThreadCreateFull(&thread, false, libxlDomainShutdownThread, + name, false, shutdown_info) < 0) { + /* + * Not much we can do on error here except log it. + */ + VIR_ERROR(_("Failed to create thread to handle domain shutdown= ")); + VIR_FREE(shutdown_info); + goto cleanup; + } + /* + * virDomainObjEndAPI is called in the shutdown thread, where + * libxlShutdownThreadInfo and libxl_event are also freed. + */ + return; + } else if (event->type =3D=3D LIBXL_EVENT_TYPE_DOMAIN_DEATH) { + /* + * On death the domain is cleaned up from Xen's perspective. + * Cleanup on the libvirt side can be done synchronously. + */ + libxlDomainHandleDeath(driver, vm); + } =20 - error: + cleanup: + virDomainObjEndAPI(&vm); cfg =3D libxlDriverConfigGet(driver); /* Cast away any const */ libxl_event_free(cfg->ctx, (libxl_event *)event); - VIR_FREE(shutdown_info); } =20 char * --=20 2.29.2