From nobody Mon Feb 9 08:57:57 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=citrix.com ARC-Seal: i=1; a=rsa-sha256; t=1619194601; cv=none; d=zohomail.com; s=zohoarc; b=BKzYfnDT6R6EvXr/KhW2+U9RY6/SQJTPKyIRVzRUCnugqtdCpDfIMrASIfim08ytpADwD2o8slXuKUjwnQfN/G3PnNOfWiX+zWMxdZJgVshjBOeMRsL7w2jt+9Wn5oknXjctCscnbHuWIZBwbWBcz8gBBV3Sm8eogqBOwTiLd50= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619194601; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=wlKM+ZdcSbGCACu8UOFLJMmFOnvjI7XIJ9qV5fQpxAQ=; b=D/uWHkboM0VDrS73rlHJXErsk4+JC+ed8+CUzYa93cO5Klim6Pl13kkmdJSWM14fXBPol9FYm4EM9MqVxLcKxILCuqVRpQbCvqacVJ8VNuO7iCTJDl1MTy4RKNmNymw7bNfmiDcSQHw+j+sghL1vzuqabCvZQYhKgpkRQ3cn7G8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) header.from= Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 161919460175241.76291694504596; Fri, 23 Apr 2021 09:16:41 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.116484.222320 (Exim 4.92) (envelope-from ) id 1lZyTN-00084D-Tu; Fri, 23 Apr 2021 16:16:05 +0000 Received: by outflank-mailman (output) from mailman id 116484.222320; Fri, 23 Apr 2021 16:16:05 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lZyTN-000846-Qp; Fri, 23 Apr 2021 16:16:05 +0000 Received: by outflank-mailman (input) for mailman id 116484; Fri, 23 Apr 2021 16:16:04 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lZyTM-00082v-3w for xen-devel@lists.xenproject.org; Fri, 23 Apr 2021 16:16:04 +0000 Received: from esa2.hc3370-68.iphmx.com (unknown [216.71.145.153]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id c77d37c6-6766-4ce5-bcd9-5c044828a554; Fri, 23 Apr 2021 16:16:02 +0000 (UTC) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: c77d37c6-6766-4ce5-bcd9-5c044828a554 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1619194562; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=FsT8vvDcYT5FDetvhVj8ocsH//yAfXcxWD8SI48U9Oc=; b=af1Kn1zU4PT+EiHdKiX0DwSAZi/kxmMa1Fivg58kIWrrDEUCaDWJraHp 88367FZNymuR5ICSlnWqGhjk36IJu08cOdxo1qwFad/GeDbxzl0rfTXO3 1o2ts7TwkqgBnQlTneHZQLbkYdNyquhUodEbGGVbdgrX22wGz42my82Uj 8=; Authentication-Results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none IronPort-SDR: 5C9moXt+/ueguOQHh65Yi4Tfu06nqZm3bcHQVpj5Ncf4XWyMMHKjrUviqsmf8bwgAWCVn5AIl4 eE2VMEC1qKiouq5OLGpX1hS+nRIiJRGsiRETlVN3J7Qttid5fcZ70zBZVpcLuUNmOpjcJXHwR6 SCRaQRx8tdy+/fJ24ddxFBYDtyOK8Q4oRuxs0KhJY49jEaFeh4NowqpM9iO1Gw6sIFqtd/O9uV C/xeyuGz5knKhTrGFGz2DP71dTVmykYhMUUqlfk4c6v1y8TrFaFlUpWJJjmtJRyQwXkt8TSm+A 7VM= X-SBRS: 5.1 X-MesageID: 42285498 X-Ironport-Server: esa2.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED IronPort-HdrOrdr: A9a23:qwi5hK5NlCPQPmYwiwPXwE3XdLJzesId70hD6mlaY3VuHPCwvc aogfgdyFvIkz4XQn4tgpStP6OHTHPa+/dOkO8sFJ2lWxTrv3btEZF64eLZskXdMgD36+I178 ddWodkDtmYNzRHpOb8pDK1CtMxhOSAmZrY4Nv261dIYUVUZ7p77wF/YzzrdXFeYAVdH5I2GN 69y6N81lmdUE8aZMi6GXUJNtKrz7ag+a7OWhIICwUq7wODl1qTmdrHOiOVwwsEVHd3yaoimF K16jDR3LmpsP2w13bntlP70pI+orTc4+oGIMSNj8QPQw+c6DqVWA== X-IronPort-AV: E=Sophos;i="5.82,246,1613451600"; d="scan'208";a="42285498" From: Anthony PERARD To: CC: Anthony PERARD , Ian Jackson , Wei Liu Subject: [XEN PATCH 1/8] libxl: Replace deprecated QMP command by "query-cpus-fast" Date: Fri, 23 Apr 2021 17:15:51 +0100 Message-ID: <20210423161558.224367-2-anthony.perard@citrix.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210423161558.224367-1-anthony.perard@citrix.com> References: <20210423161558.224367-1-anthony.perard@citrix.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @citrix.com) Content-Type: text/plain; charset="utf-8" We use the deprecated QMP command "query-cpus" which is removed in the QEMU 6.0 release. There's a replacement which is "query-cpus-fast", and have been available since QEMU 2.12 (April 2018). This patch try the new command first and when the command isn't available, it fall back to the deprecated one so libxl still works with older QEMU versions. Signed-off-by: Anthony PERARD Reviewed-by: Jason Andryuk --- Notes: This is v2 of '[XEN PATCH for-4.15] libxl: Replace deprecated QMP command by "query-cpus-fast"' as the patch never made it into the release. =20 changes: - introduce a fallback for when the new command isn't available. tools/libs/light/libxl_domain.c | 103 ++++++++++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/tools/libs/light/libxl_domain.c b/tools/libs/light/libxl_domai= n.c index 5d4ec9071160..8c003aa7cb04 100644 --- a/tools/libs/light/libxl_domain.c +++ b/tools/libs/light/libxl_domain.c @@ -1740,6 +1740,35 @@ static int libxl__set_vcpuonline_xenstore(libxl__gc = *gc, uint32_t domid, return rc; } =20 +static int qmp_parse_query_cpus_fast(libxl__gc *gc, + libxl_domid domid, + const libxl__json_object *response, + libxl_bitmap *const map) +{ + int i; + const libxl__json_object *cpu; + + libxl_bitmap_set_none(map); + /* Parse response to QMP command "query-cpus-fast": + * [ { 'cpu-index': 'int',...} ] + */ + for (i =3D 0; (cpu =3D libxl__json_array_get(response, i)); i++) { + unsigned int cpu_index; + const libxl__json_object *o; + + o =3D libxl__json_map_get("cpu-index", cpu, JSON_INTEGER); + if (!o) { + LOGD(ERROR, domid, "Failed to retrieve CPU index."); + return ERROR_QEMU_API; + } + + cpu_index =3D libxl__json_object_get_integer(o); + libxl_bitmap_set(map, cpu_index); + } + + return 0; +} + static int qmp_parse_query_cpus(libxl__gc *gc, libxl_domid domid, const libxl__json_object *response, @@ -1778,8 +1807,13 @@ typedef struct set_vcpuonline_state { int index; /* for loop on final_map */ } set_vcpuonline_state; =20 +static void set_vcpuonline_qmp_cpus_fast_queried(libxl__egc *, + libxl__ev_qmp *, const libxl__json_object *, int rc); static void set_vcpuonline_qmp_cpus_queried(libxl__egc *, libxl__ev_qmp *, const libxl__json_object *, int rc); +static void set_vcpuonline_qmp_query_cpus_parse(libxl__egc *, + libxl__ev_qmp *qmp, const libxl__json_object *, + bool query_cpus_fast, int rc); static void set_vcpuonline_qmp_add_cpu(libxl__egc *, libxl__ev_qmp *, const libxl__json_object *response, int rc); static void set_vcpuonline_timeout(libxl__egc *egc, @@ -1840,8 +1874,8 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t dom= id, set_vcpuonline_timeout, LIBXL_QMP_CMD_TIMEOUT * 1000); if (rc) goto out; - qmp->callback =3D set_vcpuonline_qmp_cpus_queried; - rc =3D libxl__ev_qmp_send(egc, qmp, "query-cpus", NULL); + qmp->callback =3D set_vcpuonline_qmp_cpus_fast_queried; + rc =3D libxl__ev_qmp_send(egc, qmp, "query-cpus-fast", NULL); if (rc) goto out; return AO_INPROGRESS; default: @@ -1860,11 +1894,39 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t d= omid, return AO_INPROGRESS; } =20 +static void set_vcpuonline_qmp_cpus_fast_queried(libxl__egc *egc, + libxl__ev_qmp *qmp, const libxl__json_object *response, int rc) +{ + EGC_GC; + set_vcpuonline_state *svos =3D CONTAINER_OF(qmp, *svos, qmp); + + if (rc =3D=3D ERROR_QMP_COMMAND_NOT_FOUND) { + /* Try again, we probably talking to a QEMU older than 2.12 */ + qmp->callback =3D set_vcpuonline_qmp_cpus_queried; + rc =3D libxl__ev_qmp_send(egc, qmp, "query-cpus", NULL); + if (rc) goto out; + return; + } + +out: + set_vcpuonline_qmp_query_cpus_parse(egc, qmp, response, true, rc); +} + static void set_vcpuonline_qmp_cpus_queried(libxl__egc *egc, libxl__ev_qmp *qmp, const libxl__json_object *response, int rc) { EGC_GC; set_vcpuonline_state *svos =3D CONTAINER_OF(qmp, *svos, qmp); + + set_vcpuonline_qmp_query_cpus_parse(egc, qmp, response, false, rc); +} + +static void set_vcpuonline_qmp_query_cpus_parse(libxl__egc *egc, + libxl__ev_qmp *qmp, const libxl__json_object *response, + bool query_cpus_fast, int rc) +{ + EGC_GC; + set_vcpuonline_state *svos =3D CONTAINER_OF(qmp, *svos, qmp); int i; libxl_bitmap current_map; =20 @@ -1876,7 +1938,11 @@ static void set_vcpuonline_qmp_cpus_queried(libxl__e= gc *egc, if (rc) goto out; =20 libxl_bitmap_alloc(CTX, ¤t_map, svos->info.vcpu_max_id + 1); - rc =3D qmp_parse_query_cpus(gc, qmp->domid, response, ¤t_map); + if (query_cpus_fast) { + rc =3D qmp_parse_query_cpus_fast(gc, qmp->domid, response, ¤= t_map); + } else { + rc =3D qmp_parse_query_cpus(gc, qmp->domid, response, ¤t_map= ); + } if (rc) goto out; =20 libxl_bitmap_copy_alloc(CTX, final_map, svos->cpumap); @@ -2121,6 +2187,9 @@ typedef struct { =20 static void retrieve_domain_configuration_lock_acquired( libxl__egc *egc, libxl__ev_slowlock *, int rc); +static void retrieve_domain_configuration_cpu_fast_queried( + libxl__egc *egc, libxl__ev_qmp *qmp, + const libxl__json_object *response, int rc); static void retrieve_domain_configuration_cpu_queried( libxl__egc *egc, libxl__ev_qmp *qmp, const libxl__json_object *response, int rc); @@ -2198,8 +2267,8 @@ static void retrieve_domain_configuration_lock_acquir= ed( if (rc) goto out; libxl_bitmap_alloc(CTX, &rdcs->qemuu_cpus, d_config->b_info.max_vcpus); - rdcs->qmp.callback =3D retrieve_domain_configuration_cpu_queried; - rc =3D libxl__ev_qmp_send(egc, &rdcs->qmp, "query-cpus", NULL); + rdcs->qmp.callback =3D retrieve_domain_configuration_cpu_fast_quer= ied; + rc =3D libxl__ev_qmp_send(egc, &rdcs->qmp, "query-cpus-fast", NULL= ); if (rc) goto out; has_callback =3D true; } @@ -2210,6 +2279,30 @@ static void retrieve_domain_configuration_lock_acqui= red( retrieve_domain_configuration_end(egc, rdcs, rc); } =20 +static void retrieve_domain_configuration_cpu_fast_queried( + libxl__egc *egc, libxl__ev_qmp *qmp, + const libxl__json_object *response, int rc) +{ + EGC_GC; + retrieve_domain_configuration_state *rdcs =3D + CONTAINER_OF(qmp, *rdcs, qmp); + + if (rc =3D=3D ERROR_QMP_COMMAND_NOT_FOUND) { + /* Try again, we probably talking to a QEMU older than 2.12 */ + rdcs->qmp.callback =3D retrieve_domain_configuration_cpu_queried; + rc =3D libxl__ev_qmp_send(egc, &rdcs->qmp, "query-cpus", NULL); + if (rc) goto out; + return; + } + + if (rc) goto out; + + rc =3D qmp_parse_query_cpus_fast(gc, qmp->domid, response, &rdcs->qemu= u_cpus); + +out: + retrieve_domain_configuration_end(egc, rdcs, rc); +} + static void retrieve_domain_configuration_cpu_queried( libxl__egc *egc, libxl__ev_qmp *qmp, const libxl__json_object *response, int rc) --=20 Anthony PERARD