From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689234243604.8693119102786; Tue, 4 Feb 2025 09:13:54 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id D6EDD1BEB; Tue, 4 Feb 2025 12:13:42 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5E1151D73; Tue, 4 Feb 2025 12:12:01 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id AFFCB1A8E; Tue, 4 Feb 2025 12:11:50 -0500 (EST) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 253B81B66 for ; Tue, 4 Feb 2025 12:11:50 -0500 (EST) Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GEmRN023214 for ; Tue, 4 Feb 2025 17:11:49 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44kn62gpmr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:49 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514GEEA4024461 for ; Tue, 4 Feb 2025 17:11:47 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44hxxn4jb2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:47 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBiWY50397638 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2054C200B5; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0F33B200B9; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=7iSrhLROJEDxI+7p7 QqbcNp8OwBOdGYvRFlX6rbSfv4=; b=PYY5mpSanfIkZM9UZvC7isnSHPtnkpcsT nT9rkM+hPWJmdIe27NtfOcUOiET5vuWOb0q44FWKiVEwS2sQv2mqOL9cqSkA8q1t 8zXk636YQCbidBsSJ+BxS0RljyJkGZ4axiXL/q0U+Zr9W/Q6r5zI4nCfmXFmWbni 2hvvpA+dfJDXCNwTyqRKcaek0PpMs7A07g5gFAM24RztLV5bOJOhReBV+iCbRTyl 3GD1KDKFaEaxdIBhcklL509I/jQDfkR5n67zISY/3Xn39YdillOizllClUMAPR1U shA8Vdez05/jW6agGIIrtgxMy8MGEQ+Qow3iDYOusHq30nBrHoc1g== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 1/8] nodedev: refactor CCW device address format Date: Tue, 4 Feb 2025 18:11:36 +0100 Message-ID: <20250204171143.93141-2-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: d4H_HKeaORpQmOlubnD0eOaKmcR0Trab X-Proofpoint-ORIG-GUID: d4H_HKeaORpQmOlubnD0eOaKmcR0Trab X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1015 priorityscore=1501 suspectscore=0 impostorscore=0 bulkscore=0 mlxlogscore=999 spamscore=0 lowpriorityscore=0 phishscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: E3LMMHORVZTDYOD7GWNEHQSJMAK3ETYJ X-Message-ID-Hash: E3LMMHORVZTDYOD7GWNEHQSJMAK3ETYJ X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689256694019000 Content-Type: text/plain; charset="utf-8" Refactor for reuse in the following patch. Reviewed-by: Marc Hartmayer Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- src/conf/node_device_conf.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 08a89942ba..9711594994 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -623,6 +623,19 @@ virNodeDeviceCapVDPADefFormat(virBuffer *buf, } =20 =20 +static void +virCCWDeviceAddressFormat(virBuffer *buf, + const virCCWDeviceAddress *ccw_address) +{ + virBufferAsprintf(buf, "0x%x\n", + ccw_address->cssid); + virBufferAsprintf(buf, "0x%x\n", + ccw_address->ssid); + virBufferAsprintf(buf, "0x%04x\n", + ccw_address->devno); +} + + static void virNodeDeviceCapCCWDefFormat(virBuffer *buf, const virNodeDevCapData *data) @@ -645,12 +658,9 @@ virNodeDeviceCapCSSDefFormat(virBuffer *buf, virNodeDeviceCapCCWDefFormat(buf, data); =20 if (ccw_dev.channel_dev_addr) { - virCCWDeviceAddress *ccw =3D ccw_dev.channel_dev_addr; virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virBufferAsprintf(buf, "0x%x\n", ccw->cssid); - virBufferAsprintf(buf, "0x%x\n", ccw->ssid); - virBufferAsprintf(buf, "0x%04x\n", ccw->devno); + virCCWDeviceAddressFormat(buf, ccw_dev.channel_dev_addr); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); } --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689327703827.5538801375135; Tue, 4 Feb 2025 09:15:27 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id AB6291D0C; Tue, 4 Feb 2025 12:15:26 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A45541DAF; Tue, 4 Feb 2025 12:12:09 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 23B861B57; Tue, 4 Feb 2025 12:11:51 -0500 (EST) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7463A1B9C for ; Tue, 4 Feb 2025 12:11:50 -0500 (EST) Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GF2D6023992 for ; Tue, 4 Feb 2025 17:11:49 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44kn62gpmt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:49 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514FvYWx024540 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44hxxn4jb3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:47 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBipX50397640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 36878200B9; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 245EF200BA; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=aVLQ0F0ugSwWMfJqs VaXFG+Fg8T5W6srtSRn5z+9DIU=; b=fenh2JHep1aEcemj3XvJ0Dct/qIPLAh+u RgPYxkrJtmY2h/Seae5/yu46kpVrUN3vxw3Pzg9Zi+3vtAlm+XucaHTK9WfEGjvE Ontpea1C5EG72qNKQPaWo+DgMTYbaDjk14gV70UrZmV+t8e4x3FK/U04rHxe1Vcr lGZgf8xJicm307kCoa7cQ2+vRghCyKI5a0YgIiDD9wCVwAx57vsrkT4WisAOfMzm T0rmahuk4C1ImGdgeF4yjGQMtT8Q6Ru8gA8SMQsetXMh4LTqLF70HImhG39c51zO 9T4NRQPpBDKnqvnF/cxjgIR2K1g3oAiUonCf9LAiw6kflFtfHCB5Q== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 2/8] nodedev: refactor CCW device address Date: Tue, 4 Feb 2025 18:11:37 +0100 Message-ID: <20250204171143.93141-3-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: wzc0kCGYLPrRqw-kfjggjS1KP9VgraY3 X-Proofpoint-ORIG-GUID: wzc0kCGYLPrRqw-kfjggjS1KP9VgraY3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1015 priorityscore=1501 suspectscore=0 impostorscore=0 bulkscore=0 mlxlogscore=803 spamscore=0 lowpriorityscore=0 phishscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: TXXBQII7NAQW5H3BJVFK72U4KFTSILPU X-Message-ID-Hash: TXXBQII7NAQW5H3BJVFK72U4KFTSILPU X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689329939019100 Content-Type: text/plain; charset="utf-8" Replace cssid, ssid and devno elements with virCCWDeviceAddress. Reviewed-by: Marc Hartmayer Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- src/conf/node_device_conf.c | 16 ++++++---------- src/conf/node_device_conf.h | 4 +--- src/node_device/node_device_driver.c | 11 ++--------- src/node_device/node_device_udev.c | 9 ++++++--- tests/nodedevmdevctltest.c | 7 ++++--- 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 9711594994..85effb7d78 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -640,12 +640,7 @@ static void virNodeDeviceCapCCWDefFormat(virBuffer *buf, const virNodeDevCapData *data) { - virBufferAsprintf(buf, "0x%x\n", - data->ccw_dev.cssid); - virBufferAsprintf(buf, "0x%x\n", - data->ccw_dev.ssid); - virBufferAsprintf(buf, "0x%04x\n", - data->ccw_dev.devno); + virCCWDeviceAddressFormat(buf, data->ccw_dev.dev_addr); } =20 =20 @@ -1231,9 +1226,7 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt, if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr= ) < 0) return -1; =20 - ccw_dev->cssid =3D ccw_addr->cssid; - ccw_dev->ssid =3D ccw_addr->ssid; - ccw_dev->devno =3D ccw_addr->devno; + ccw_dev->dev_addr =3D g_steal_pointer(&ccw_addr); =20 return 0; } @@ -2621,6 +2614,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) g_free(data->mdev.parent_addr); break; case VIR_NODE_DEV_CAP_CSS_DEV: + g_free(data->ccw_dev.dev_addr); for (i =3D 0; i < data->ccw_dev.nmdev_types; i++) virMediatedDeviceTypeFree(data->ccw_dev.mdev_types[i]); g_free(data->ccw_dev.mdev_types); @@ -2638,10 +2632,12 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) g_free(data->mdev_parent.mdev_types); g_free(data->mdev_parent.address); break; + case VIR_NODE_DEV_CAP_CCW_DEV: + g_free(data->ccw_dev.dev_addr); + break; case VIR_NODE_DEV_CAP_DRM: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: - case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_AP_CARD: case VIR_NODE_DEV_CAP_AP_QUEUE: diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index 25666a333e..ad2258e90d 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -281,9 +281,7 @@ struct _virNodeDevCapDRM { =20 typedef struct _virNodeDevCapCCW virNodeDevCapCCW; struct _virNodeDevCapCCW { - unsigned int cssid; - unsigned int ssid; - unsigned int devno; + virCCWDeviceAddress *dev_addr; unsigned int flags; /* enum virNodeDevCCWCapFlags */ virMediatedDeviceType **mdev_types; size_t nmdev_types; diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_de= vice_driver.c index fa5db0d5d5..9898b1914a 100644 --- a/src/node_device/node_device_driver.c +++ b/src/node_device/node_device_driver.c @@ -683,16 +683,9 @@ nodeDeviceObjFormatAddress(virNodeDeviceObj *obj) break; } =20 - case VIR_NODE_DEV_CAP_CSS_DEV: { - virCCWDeviceAddress ccw_addr =3D { - .cssid =3D caps->data.ccw_dev.cssid, - .ssid =3D caps->data.ccw_dev.ssid, - .devno =3D caps->data.ccw_dev.devno - }; - - addr =3D virCCWDeviceAddressAsString(&ccw_addr); + case VIR_NODE_DEV_CAP_CSS_DEV: + addr =3D virCCWDeviceAddressAsString(caps->data.ccw_dev.dev_ad= dr); break; - } =20 case VIR_NODE_DEV_CAP_AP_MATRIX: addr =3D g_strdup(caps->data.ap_matrix.addr); diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 1d8486f623..97fbe95ac7 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1184,18 +1184,21 @@ udevGetCCWAddress(const char *sysfs_path, virNodeDevCapData *data) { char *p; + g_autofree virCCWDeviceAddress *ccw_addr =3D g_new0(virCCWDeviceAddres= s, 1); =20 if ((p =3D strrchr(sysfs_path, '/')) =3D=3D NULL || virCCWDeviceAddressParseFromString(p + 1, - &data->ccw_dev.cssid, - &data->ccw_dev.ssid, - &data->ccw_dev.devno) < 0) { + &ccw_addr->cssid, + &ccw_addr->ssid, + &ccw_addr->devno) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to parse the CCW address from sysfs path:= '%1$s'"), sysfs_path); return -1; } =20 + data->ccw_dev.dev_addr =3D g_steal_pointer(&ccw_addr); + return 0; } =20 diff --git a/tests/nodedevmdevctltest.c b/tests/nodedevmdevctltest.c index 93b0efcb1c..c7e6836edb 100644 --- a/tests/nodedevmdevctltest.c +++ b/tests/nodedevmdevctltest.c @@ -435,9 +435,10 @@ fakeCSSDevice(void) =20 def->caps->data.type =3D VIR_NODE_DEV_CAP_CSS_DEV; css_dev =3D &def->caps->data.ccw_dev; - css_dev->cssid =3D 0; - css_dev->ssid =3D 0; - css_dev->devno =3D 82; + css_dev->dev_addr =3D g_new0(virCCWDeviceAddress, 1); + css_dev->dev_addr->cssid =3D 0; + css_dev->dev_addr->ssid =3D 0; + css_dev->dev_addr->devno =3D 82; =20 return def; } --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689286178508.72214570792846; Tue, 4 Feb 2025 09:14:46 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 86E041BE8; Tue, 4 Feb 2025 12:13:01 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 001751DD9; Tue, 4 Feb 2025 12:11:56 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 427091B9C; Tue, 4 Feb 2025 12:11:50 -0500 (EST) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 935E91B5C for ; Tue, 4 Feb 2025 12:11:49 -0500 (EST) Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GEmtb023148 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44kn62gpmq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:48 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514E0fTF021483 for ; Tue, 4 Feb 2025 17:11:47 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 44j0n1c77m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:47 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBiPX42598742 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4BB9E200B5; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3A55C200BB; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=zERniW45UUpnAdS4P KtpNlcRE62z3zG52II5bVswYjs=; b=e0gVIezLUoia3biDVhO9qG58CqtXvjRTf /FdBiXtN3PACvpFa/XXxbPXLbo2i36IWFX91jeJxA5U+5cBEPQCgt8z2j9buWN1l L/hKjbAfNEsWatGFGRSEwWDwN4YgspTSF5oK+cpF7J1ZF+TjRW/leuzHMjcZukGn CcaxHz0mCzKGIFUBApNAHFX7EHwkWeAffi1aTQBmvzf1B0zR1k11eT49Mi4dFVqf 16fOzCf4T1Mu259OPVasfWLAxvftnYczk7COTDF/kPKco5MD0RrvjQoePIcQ9tN4 EysRBOJ8oljXC9+/5atI6R3CUBLPoUt6kQqGw4qy6/VACuHYnE2NA== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 3/8] nodedev: remove virNodeDeviceCapCCWDefFormat Date: Tue, 4 Feb 2025 18:11:38 +0100 Message-ID: <20250204171143.93141-4-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: g1vnl6PTGSF46SdFLAknQirBQbgnkXpG X-Proofpoint-ORIG-GUID: g1vnl6PTGSF46SdFLAknQirBQbgnkXpG X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1015 priorityscore=1501 suspectscore=0 impostorscore=0 bulkscore=0 mlxlogscore=893 spamscore=0 lowpriorityscore=0 phishscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: VWS3JAAY2XBTR2TR5LCNKR6JERLYKG4I X-Message-ID-Hash: VWS3JAAY2XBTR2TR5LCNKR6JERLYKG4I X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689297871019100 Content-Type: text/plain; charset="utf-8" Directly use virCCWDeviceAddressFormat. Reviewed-by: Marc Hartmayer Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- src/conf/node_device_conf.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 85effb7d78..433334511f 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -636,21 +636,13 @@ virCCWDeviceAddressFormat(virBuffer *buf, } =20 =20 -static void -virNodeDeviceCapCCWDefFormat(virBuffer *buf, - const virNodeDevCapData *data) -{ - virCCWDeviceAddressFormat(buf, data->ccw_dev.dev_addr); -} - - static void virNodeDeviceCapCSSDefFormat(virBuffer *buf, const virNodeDevCapData *data) { virNodeDevCapCCW ccw_dev =3D data->ccw_dev; =20 - virNodeDeviceCapCCWDefFormat(buf, data); + virCCWDeviceAddressFormat(buf, ccw_dev.dev_addr); =20 if (ccw_dev.channel_dev_addr) { virBufferAddLit(buf, "\n"); @@ -758,7 +750,7 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def, uns= igned int flags) const char *state =3D virNodeDevCCWStateTypeToString(data-= >ccw_dev.state); virBufferEscapeString(&buf, "%s\n", state); } - virNodeDeviceCapCCWDefFormat(&buf, data); + virCCWDeviceAddressFormat(&buf, data->ccw_dev.dev_addr); break; case VIR_NODE_DEV_CAP_CSS_DEV: virNodeDeviceCapCSSDefFormat(&buf, data); --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689137930858.9012808077166; Tue, 4 Feb 2025 09:12:17 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id A555A1DB2; Tue, 4 Feb 2025 12:12:16 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 52F9B1C16; Tue, 4 Feb 2025 12:11:53 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id D73BD1B9C; Tue, 4 Feb 2025 12:11:49 -0500 (EST) Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 337601A8E for ; Tue, 4 Feb 2025 12:11:49 -0500 (EST) Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GFOkk011637 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44k9r0uvc3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:48 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514H9DeL005292 for ; Tue, 4 Feb 2025 17:11:47 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 44j05jvafc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:47 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBiwW50397642 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 56B28200BA; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4FBB6200B8; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Ztl4W+3MI4XDe1ESY 1FqUxvaHJrHJbLV4zddj/3S8ZE=; b=PU9Hx/MpQGcc3zQfPo5C15T6i7x6ssfXF qX0/5ewjeMSTyj/WIecW4Uh41OigYrVFAE+nc+Z+KAQgQf5cwODyTLff5GgebqP6 JcVLvsf91nEM2+dahMQVNJ3TIdwldbhBwPbYyxgRTaxuXJpe3aaB8htmgI96lwRe Go5KbeDgR9XtPtBAbzS+dAmsHAb6RCwl7u3yp0cqB1MMpX8TR5WHieB4IK4of/W0 sewWvgSR9BhWy2ld3cieqAJpGKyXu9Qf6pFlDqTkPQAtjf3iOa7/M1nSKkHcPALr CO0Wqrw8Jq5Sk3ZFo+z306DPa5qMyocCO5wYh8YRRgq6hjILMBHQw== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 4/8] nodedev: refactor CCW state format for use in ccwgroup Date: Tue, 4 Feb 2025 18:11:39 +0100 Message-ID: <20250204171143.93141-5-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: tZtfAx7cFJBIioGY4ZnFicNiPWuQHj34 X-Proofpoint-GUID: tZtfAx7cFJBIioGY4ZnFicNiPWuQHj34 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 suspectscore=0 lowpriorityscore=0 mlxlogscore=892 phishscore=0 clxscore=1015 adultscore=0 spamscore=0 mlxscore=0 malwarescore=0 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: TEVNYC4FGOKZSXX24LJ52LZH67AJ2BDZ X-Message-ID-Hash: TEVNYC4FGOKZSXX24LJ52LZH67AJ2BDZ X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689139099019100 Content-Type: text/plain; charset="utf-8" Refactor to allow reuse in ccwgroup. Reviewed-by: Marc Hartmayer Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- src/conf/node_device_conf.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 433334511f..bfd81b1692 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -659,6 +659,17 @@ virNodeDeviceCapCSSDefFormat(virBuffer *buf, } =20 =20 +static void +virNodeDeviceCapCCWStateTypeFormat(virBuffer *buf, + const virNodeDevCCWStateType state_type) +{ + if (state_type !=3D VIR_NODE_DEV_CCW_STATE_LAST) { + const char *state =3D virNodeDevCCWStateTypeToString(state_type); + virBufferEscapeString(buf, "%s\n", state); + } +} + + char * virNodeDeviceDefFormat(const virNodeDeviceDef *def, unsigned int flags) { @@ -746,10 +757,7 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def, un= signed int flags) virNodeDeviceCapMdevDefFormat(&buf, data, inactive_state); break; case VIR_NODE_DEV_CAP_CCW_DEV: - if (data->ccw_dev.state !=3D VIR_NODE_DEV_CCW_STATE_LAST) { - const char *state =3D virNodeDevCCWStateTypeToString(data-= >ccw_dev.state); - virBufferEscapeString(&buf, "%s\n", state); - } + virNodeDeviceCapCCWStateTypeFormat(&buf, data->ccw_dev.state); virCCWDeviceAddressFormat(&buf, data->ccw_dev.dev_addr); break; case VIR_NODE_DEV_CAP_CSS_DEV: --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689297237890.294279995455; Tue, 4 Feb 2025 09:14:57 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 3433318A5; Tue, 4 Feb 2025 12:14:56 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id B3ABB1D3C; Tue, 4 Feb 2025 12:12:06 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 1EB281A8E; Tue, 4 Feb 2025 12:11:51 -0500 (EST) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 870911B57 for ; Tue, 4 Feb 2025 12:11:50 -0500 (EST) Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GEoHs023089 for ; Tue, 4 Feb 2025 17:11:49 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44kcq7ucv8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:49 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514G2CaF007130 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44hxaymnas-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:48 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBiDI42598744 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6C0AA200BB; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6490E200B9; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=xF6JGHOXPXorHHzcS 1lNTgi5Ft6oUNHQAwubad0PfQg=; b=omYrhrZbFzaXBtjgBjiiEZ8B7VoPFD7lv AXlilQ1q6N0veY1uyzEYflOl52C+AWgRgE1sB6Agl7XcOEDXASGFeSkxm7CCJLOF C2detiKTrJ67DnPKpjX7RmGPnA1BlVnGSMLTxNo8dWrYJrYeT93qhFhK60wrIv++ W7gLjM+BB8zzUXlxqK0AfrFXHlXSXg2WHlCwNcx/BG9GUSxyRpx3Hd9AYZzbAr0u jY39VTxr7TkIh89lRz4pd9N8fhw7xN6E353S9td2QypxwjWJhEqRpdzg3RL8f9DR YV8rQXXh+H+7cUQi6nzIMT3H0y4axTH4EXK/eEwhjkcFM9t/leeew== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 5/8] nodedev: refactor udevCCWGetState Date: Tue, 4 Feb 2025 18:11:40 +0100 Message-ID: <20250204171143.93141-6-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 236VvlMQO3RnUVf1xzDhHZmgX9th9QoY X-Proofpoint-ORIG-GUID: 236VvlMQO3RnUVf1xzDhHZmgX9th9QoY X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 phishscore=0 suspectscore=0 mlxlogscore=950 spamscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 bulkscore=0 adultscore=0 clxscore=1015 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 4LLTNUNRJW7RC42EOS6XCPBUBOVMWV5R X-Message-ID-Hash: 4LLTNUNRJW7RC42EOS6XCPBUBOVMWV5R X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689301003019100 Content-Type: text/plain; charset="utf-8" Refactor method to be only ccw state type depended to allow reuse in a later patch. Reviewed-by: Marc Hartmayer Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- src/node_device/node_device_udev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 97fbe95ac7..6b362625f7 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1205,7 +1205,7 @@ udevGetCCWAddress(const char *sysfs_path, =20 static int udevCCWGetState(struct udev_device *device, - virNodeDevCapData *data) + virNodeDevCCWStateType *state) { int online =3D 0; =20 @@ -1215,10 +1215,10 @@ udevCCWGetState(struct udev_device *device, switch (online) { case VIR_NODE_DEV_CCW_STATE_OFFLINE: case VIR_NODE_DEV_CCW_STATE_ONLINE: - data->ccw_dev.state =3D online; + *state =3D online; break; default: - data->ccw_dev.state =3D VIR_NODE_DEV_CCW_STATE_LAST; + *state =3D VIR_NODE_DEV_CCW_STATE_LAST; break; } =20 @@ -1231,7 +1231,7 @@ udevProcessCCW(struct udev_device *device, virNodeDeviceDef *def) { /* process only online devices to keep the list sane */ - if (udevCCWGetState(device, &def->caps->data) < 0) + if (udevCCWGetState(device, &def->caps->data.ccw_dev.state) < 0) return -1; =20 if (udevGetCCWAddress(def->sysfs_path, &def->caps->data) < 0) --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689385742569.6245289019688; Tue, 4 Feb 2025 09:16:25 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 8DA7E17CE; Tue, 4 Feb 2025 12:16:24 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 358FD1DFF; Tue, 4 Feb 2025 12:12:12 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id ED5FC1B66; Tue, 4 Feb 2025 12:11:52 -0500 (EST) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 32AF51B57 for ; Tue, 4 Feb 2025 12:11:51 -0500 (EST) Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GF5gk023629 for ; Tue, 4 Feb 2025 17:11:50 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44kcq7ucva-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:49 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514GhbSj006578 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44hyekcf5g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:48 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBigT42598746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A0808200B8; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7ACED200B5; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=W/W7kzErUfPlY1+s6 ZVKnEmgL0cVCkXaUIZKYQBQMNo=; b=WnptlCj4dMsbJ20mtrk1xqWDCA/3qxjt8 PJybXrcMUSl8KTrXbY4iiG85TcEs54nMoH3ZchrVdw8nC3a0EjX3D1x2ja/21zGU 7fLB9IzDnpNPG1HC6PTQCPwafjD+efnpnnoxe3fEbf8u82s7xy6DmZiW8q5iVye9 umX0gamIhgrtC8ObIZIsgjeBxnBDCB4ejtpb00s29JrXY2gzOmHv72/bgSuSZ+6p CpP569qGX09afdr6f65z9TFlJW7YFGtpiGRDlle4UiPOZChn3KeXX/fMZxff2yyi +O71bdpPtI/C1YrJEtau61mr1XUlFcdzidp2M8t4gXc5mQf70tzHA== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 6/8] nodedev: add ccwgroup node device support Date: Tue, 4 Feb 2025 18:11:41 +0100 Message-ID: <20250204171143.93141-7-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: JiNlHekUGhVNJ3LCfKkklASOe0s8iTck X-Proofpoint-ORIG-GUID: JiNlHekUGhVNJ3LCfKkklASOe0s8iTck X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 phishscore=0 suspectscore=0 mlxlogscore=999 spamscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 bulkscore=0 adultscore=0 clxscore=1015 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 75M2WLPJ7SKAQFZ4KSJAS6U3UONE2H3V X-Message-ID-Hash: 75M2WLPJ7SKAQFZ4KSJAS6U3UONE2H3V X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689388682019100 Content-Type: text/plain; charset="utf-8" Add ccwgroup node device type supporting qeth generic driver. Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- docs/manpages/virsh.rst | 6 +- include/libvirt/libvirt-nodedev.h | 1 + src/conf/node_device_conf.c | 212 ++++++++++++++++++ src/conf/node_device_conf.h | 29 ++- src/conf/schemas/nodedev.rng | 43 ++++ src/conf/virnodedeviceobj.c | 4 +- src/libvirt_private.syms | 2 + src/node_device/node_device_driver.c | 5 + src/node_device/node_device_udev.c | 41 ++++ src/util/virccw.c | 102 +++++++++ src/util/virccw.h | 22 ++ tests/nodedevschemadata/ccwgroup_0_0_bd00.xml | 20 ++ tests/nodedevxml2xmlout/ccwgroup_0_0_bd00.xml | 1 + tests/nodedevxml2xmltest.c | 1 + tools/virsh-nodedev.c | 3 + 15 files changed, 487 insertions(+), 5 deletions(-) create mode 100644 tests/nodedevschemadata/ccwgroup_0_0_bd00.xml create mode 120000 tests/nodedevxml2xmlout/ccwgroup_0_0_bd00.xml diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 868b354b2f..5e5734dff1 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5532,9 +5532,9 @@ List all of the devices available on the node that ar= e known by libvirt. separated by comma, e.g. --cap pci,scsi. Valid capability types include 'system', 'pci', 'usb_device', 'usb', 'net', 'scsi_host', 'scsi_target', 'scsi', 'storage', 'fc_host', 'vports', 'scsi_generic', 'drm', 'mdev', -'mdev_types', 'ccw', 'css', 'ap_card', 'ap_queue', 'ap_matrix'. By default, -only active devices are listed. *--inactive* is used to list only inactive -devices, and *--all* is used to list both active and inactive devices. +'mdev_types', 'ccw', 'ccwgroup', 'css', 'ap_card', 'ap_queue', 'ap_matrix'. +By default, only active devices are listed. *--inactive* is used to list o= nly +inactive devices, and *--all* is used to list both active and inactive dev= ices. *--persistent* is used to list only persistent devices, and *--transient* = is used to list only transient devices. Not providing *--persistent* or *--transient* will list all devices unless filtered otherwise. *--transien= t* diff --git a/include/libvirt/libvirt-nodedev.h b/include/libvirt/libvirt-no= dedev.h index ec26c7a5e1..79bee4fb04 100644 --- a/include/libvirt/libvirt-nodedev.h +++ b/include/libvirt/libvirt-nodedev.h @@ -90,6 +90,7 @@ typedef enum { VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_QUEUE =3D 1 << 19, /* s390 A= P Queue (Since: 7.0.0) */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_MATRIX =3D 1 << 20, /* s390 A= P Matrix (Since: 7.0.0) */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPD =3D 1 << 21, /* Device= with VPD (Since: 7.9.0) */ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV =3D 1 << 22, /* s390 C= CWGROUP device (Since: 11.1.0) */ =20 VIR_CONNECT_LIST_NODE_DEVICES_PERSISTENT =3D 1 << 28, /* Persis= ted devices (Since: 10.1.0) */ VIR_CONNECT_LIST_NODE_DEVICES_TRANSIENT =3D 1 << 29, /* Transi= ent devices (Since: 10.1.0) */ diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index bfd81b1692..1649df09a1 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -71,6 +71,12 @@ VIR_ENUM_IMPL(virNodeDevCap, "ap_queue", "ap_matrix", "vpd", + "ccwgroup", +); + +VIR_ENUM_IMPL(virNodeDevCCWGroupCap, + VIR_NODE_DEV_CAP_CCWGROUP_LAST, + "qeth_generic", ); =20 VIR_ENUM_IMPL(virNodeDevNetCap, @@ -670,6 +676,53 @@ virNodeDeviceCapCCWStateTypeFormat(virBuffer *buf, } =20 =20 +static void +virNodeDeviceCapCCWGroupQethFormat(virBuffer *buf, + const virCCWGroupTypeQeth *qeth) +{ + virBufferAsprintf(buf, "%s\n", qeth->card_type); + virBufferAsprintf(buf, "%s\n", qeth->chpid); +} + + +static void +virNodeDeviceCapCCWGroupDefFormat(virBuffer *buf, + const virNodeDevCapData *data) +{ + virNodeDevCapCCWGroup ccwgroup_dev =3D data->ccwgroup_dev; + size_t i; + + virNodeDeviceCapCCWStateTypeFormat(buf, ccwgroup_dev.state); + virCCWDeviceAddressFormat(buf, ccwgroup_dev.address); + + if (ccwgroup_dev.members) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + for (i =3D 0; i < ccwgroup_dev.nmembers; i++) { + virBufferEscapeString(buf, "", + ccwgroup_dev.members[i]->ref); + virBufferEscapeString(buf, "%s\n", + ccwgroup_dev.members[i]->device); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + virBufferAsprintf(buf, "\n", + virNodeDevCCWGroupCapTypeToString(ccwgroup_dev.type)= ); + virBufferAdjustIndent(buf, 2); + switch (ccwgroup_dev.type) { + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + virNodeDeviceCapCCWGroupQethFormat(buf, &ccwgroup_dev.qeth); + break; + case VIR_NODE_DEV_CAP_CCWGROUP_LAST: + break; + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); +} + + char * virNodeDeviceDefFormat(const virNodeDeviceDef *def, unsigned int flags) { @@ -787,6 +840,9 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def, uns= igned int flags) data->mdev_parent.mdev_types, data->mdev_parent.nmdev_types); break; + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + virNodeDeviceCapCCWGroupDefFormat(&buf, data); + break; case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_VPD: @@ -1303,6 +1359,107 @@ virNodeDevCapCSSParseXML(xmlXPathContextPtr ctxt, } =20 =20 +static int +virNodeDevCapCCWGroupQethParseXML(xmlXPathContextPtr ctxt, + xmlNodePtr node, + virCCWGroupTypeQeth *qeth) +{ + VIR_XPATH_NODE_AUTORESTORE(ctxt) + ctxt->node =3D node; + + qeth->card_type =3D virXPathString("string(./card_type[1])", ctxt); + qeth->chpid =3D virXPathString("string(./chpid[1])", ctxt); + + return 0; +} + + +static int +virNodeDevCapCCWGroupParseXML(xmlXPathContextPtr ctxt, + virNodeDeviceDef *def, + xmlNodePtr node, + virNodeDevCapCCWGroup *ccwgroup_dev) +{ + VIR_XPATH_NODE_AUTORESTORE(ctxt) + g_autofree virCCWGroupMemberType **members =3D NULL; + g_autofree virCCWDeviceAddress *address =3D NULL; + g_autofree xmlNodePtr *ccw_device_nodes =3D NULL; + xmlNodePtr cap_node =3D NULL; + g_autofree char *state =3D NULL; + size_t i =3D 0; + int n =3D 0; + + ctxt->node =3D node; + + /* state is optional */ + ccwgroup_dev->state =3D VIR_NODE_DEV_CCW_STATE_LAST; + if ((state =3D virXPathString("string(./state[1])", ctxt))) { + int val; + if ((val =3D virNodeDevCCWStateTypeFromString(state)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown state '%1$s' for '%2$s'"), state, de= f->name); + return -1; + } + ccwgroup_dev->state =3D val; + } + + address =3D g_new0(virCCWDeviceAddress, 1); + + if (virNodeDevCCWDeviceAddressParseXML(ctxt, + node, + def->name, + address) < 0) + return -1; + + ccwgroup_dev->address =3D g_steal_pointer(&address); + + /* Parse ccw_devices in members */ + if ((n =3D virXPathNodeSet("./members/ccw_device", ctxt, &ccw_device_n= odes)) < 0) + return -1; + + ccwgroup_dev->members =3D g_new0(virCCWGroupMemberType *, n); + + for (i =3D 0; i < n; i++) { + g_autoptr(virCCWGroupMemberType) ccwMember =3D g_new0(virCCWGroupM= emberType, 1); + + if (!(ccwMember->ref =3D virXMLPropString(ccw_device_nodes[i], "re= f"))) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing ref property on ccw_device in member= s for '%1$s'"), + def->name); + return -1; + } + if (!(ccwMember->device =3D virXMLNodeContentString(ccw_device_nod= es[i]))) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing data in ccw_device with ref '%1$s' i= n members for '%2$s'"), + ccwMember->ref, def->name); + return -1; + } + + VIR_APPEND_ELEMENT(ccwgroup_dev->members, + ccwgroup_dev->nmembers, + ccwMember); + } + + /* Parse capability */ + cap_node =3D virXPathNode("./capability", ctxt); + if (cap_node && virXMLPropEnum(cap_node, "type", + virNodeDevCCWGroupCapTypeFromString, + VIR_XML_PROP_REQUIRED, &ccwgroup_dev->t= ype) < 0) + return -1; + + switch (ccwgroup_dev->type) { + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + if (virNodeDevCapCCWGroupQethParseXML(ctxt, cap_node, &ccwgroup_de= v->qeth) < 0) + return -1; + break; + case VIR_NODE_DEV_CAP_CCWGROUP_LAST: + break; + } + + return 0; +} + + static int virNodeDevCapAPAdapterParseXML(xmlXPathContextPtr ctxt, virNodeDeviceDef *def, @@ -2343,6 +2500,10 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt, ret =3D virNodeDevCapAPMatrixParseXML(ctxt, def, node, &caps->data.ap_matrix); break; + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + ret =3D virNodeDevCapCCWGroupParseXML(ctxt, def, node, + &caps->data.ccwgroup_dev); + break; case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: @@ -2635,6 +2796,19 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) case VIR_NODE_DEV_CAP_CCW_DEV: g_free(data->ccw_dev.dev_addr); break; + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + g_free(data->ccwgroup_dev.address); + for (i =3D 0; i < data->ccwgroup_dev.nmembers; i++) + virCCWGroupMemberTypeFree(data->ccwgroup_dev.members[i]); + g_free(data->ccwgroup_dev.members); + switch (data->ccwgroup_dev.type) { + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + virCCWGroupTypeQethFree(&data->ccwgroup_dev.qeth); + break; + case VIR_NODE_DEV_CAP_CCWGROUP_LAST: + break; + } + break; case VIR_NODE_DEV_CAP_DRM: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: @@ -2694,6 +2868,11 @@ virNodeDeviceUpdateCaps(virNodeDeviceDef *def) &cap->data.mdev_pare= nt) < 0) return -1; break; + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + if (virNodeDeviceGetCCWGroupDynamicCaps(def->sysfs_path, + &cap->data.ccwgroup_de= v) < 0) + return -1; + break; =20 /* all types that (supposedly) don't require any updates * relative to what's in the cache. @@ -3194,6 +3373,31 @@ virNodeDeviceGetMdevParentDynamicCaps(const char *sy= sfsPath, return 0; } =20 +/* virNodeDeviceGetCCWGroupDynamicCaps() get info that is stored in sysfs + * about devices related to this device, i.e. things that can change + * without this device itself changing. These must be refreshed + * anytime full XML of the device is requested, because they can + * change with no corresponding notification from the kernel/udev. + */ +int +virNodeDeviceGetCCWGroupDynamicCaps(const char *sysfsPath, + virNodeDevCapCCWGroup *ccwgroup) +{ + size_t i; + + for (i =3D 0; i < ccwgroup->nmembers; i++) + virCCWGroupMemberTypeFree(ccwgroup->members[i]); + VIR_FREE(ccwgroup->members); + ccwgroup->nmembers =3D 0; + + if (virCCWGroupDeviceGetMembers(sysfsPath, + &ccwgroup->members, + &ccwgroup->nmembers) < 0) + return -1; + + return 0; +} + =20 #else =20 @@ -3239,4 +3443,12 @@ virNodeDeviceGetMdevParentDynamicCaps(const char *sy= sfsPath G_GNUC_UNUSED, } =20 =20 +int +virNodeDeviceGetCCWGroupDynamicCaps(const char *sysfsPath G_GNUC_UNUSED, + virNodeDevCapCCWGroup *ccwgroup G_GNUC= _UNUSED) +{ + return -1; +} + + #endif /* __linux__ */ diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index ad2258e90d..d94670e074 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -71,10 +71,17 @@ typedef enum { VIR_NODE_DEV_CAP_AP_QUEUE, /* s390 AP Queue */ VIR_NODE_DEV_CAP_AP_MATRIX, /* s390 AP Matrix device */ VIR_NODE_DEV_CAP_VPD, /* Device provides VPD */ + VIR_NODE_DEV_CAP_CCWGROUP_DEV, /* s390 CCWGROUP device */ =20 VIR_NODE_DEV_CAP_LAST } virNodeDevCapType; =20 +typedef enum { + /* Keep in sync with VIR_ENUM_IMPL in node_device_conf.c */ + VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC, /* s390 CCWGROUP QETH gene= ric device */ + VIR_NODE_DEV_CAP_CCWGROUP_LAST +} virNodeDevCCWGroupCapType; + typedef enum { /* Keep in sync with VIR_ENUM_IMPL in node_device_conf.c */ VIR_NODE_DEV_CAP_NET_80203, /* 802.03 network device */ @@ -83,6 +90,7 @@ typedef enum { } virNodeDevNetCapType; =20 VIR_ENUM_DECL(virNodeDevCap); +VIR_ENUM_DECL(virNodeDevCCWGroupCap); VIR_ENUM_DECL(virNodeDevNetCap); =20 typedef enum { @@ -321,6 +329,19 @@ struct _virNodeDevCapMdevParent { char *address; }; =20 +typedef struct _virNodeDevCapCCWGroup virNodeDevCapCCWGroup; +struct _virNodeDevCapCCWGroup { + virNodeDevCCWStateType state; // online attribute + virCCWDeviceAddress *address; + virCCWGroupMemberType **members; + size_t nmembers; + + virNodeDevCCWGroupCapType type; + union { + virCCWGroupTypeQeth qeth; + }; +}; + typedef struct _virNodeDevCapData virNodeDevCapData; struct _virNodeDevCapData { virNodeDevCapType type; @@ -343,6 +364,7 @@ struct _virNodeDevCapData { virNodeDevCapAPQueue ap_queue; virNodeDevCapAPMatrix ap_matrix; virNodeDevCapMdevParent mdev_parent; + virNodeDevCapCCWGroup ccwgroup_dev; }; }; =20 @@ -434,7 +456,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNodeDevCapsDef, virNod= eDevCapsDefFree); VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_CARD | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_QUEUE | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_MATRIX | \ - VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPD) + VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPD | \ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV) =20 #define VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_ACTIVE \ VIR_CONNECT_LIST_NODE_DEVICES_ACTIVE | \ @@ -472,6 +495,10 @@ int virNodeDeviceGetMdevParentDynamicCaps(const char *sysfsPath, virNodeDevCapMdevParent *mdev_parent= ); =20 +int +virNodeDeviceGetCCWGroupDynamicCaps(const char *sysfsPath, + virNodeDevCapCCWGroup *ccwgroup); + int virNodeDeviceUpdateCaps(virNodeDeviceDef *def); =20 diff --git a/src/conf/schemas/nodedev.rng b/src/conf/schemas/nodedev.rng index 42a0cdcfd9..ebcda30f1f 100644 --- a/src/conf/schemas/nodedev.rng +++ b/src/conf/schemas/nodedev.rng @@ -83,6 +83,7 @@ + @@ -669,6 +670,48 @@ =20 + + + qeth_generic + + + + + + + + + + ccwgroup + + + + + online + offline + + + + + + + + + + + + + + + + + + + + + + + ccw diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c index d0a6eab42b..23984995c8 100644 --- a/src/conf/virnodedeviceobj.c +++ b/src/conf/virnodedeviceobj.c @@ -741,6 +741,7 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj, case VIR_NODE_DEV_CAP_AP_CARD: case VIR_NODE_DEV_CAP_AP_QUEUE: case VIR_NODE_DEV_CAP_VPD: + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: case VIR_NODE_DEV_CAP_LAST: break; } @@ -899,7 +900,8 @@ virNodeDeviceObjMatch(virNodeDeviceObj *obj, MATCH_CAP(AP_CARD) || MATCH_CAP(AP_QUEUE) || MATCH_CAP(AP_MATRIX) || - MATCH_CAP(VPD))) + MATCH_CAP(VPD) || + MATCH_CAP(CCWGROUP_DEV))) return false; } =20 diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 406e6583a3..07e1e673f0 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -892,12 +892,14 @@ virNetDevIPRouteParseXML; virNodeDevCapsDefFree; virNodeDevCapTypeFromString; virNodeDevCapTypeToString; +virNodeDevCCWGroupCapTypeFromString; virNodeDeviceCapsListExport; virNodeDeviceDefFormat; virNodeDeviceDefFree; virNodeDeviceDefParse; virNodeDeviceDefParseXML; virNodeDeviceGetAPMatrixDynamicCaps; +virNodeDeviceGetCCWGroupDynamicCaps; virNodeDeviceGetCSSDynamicCaps; virNodeDeviceGetMdevParentDynamicCaps; virNodeDeviceGetPCIDynamicCaps; diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_de= vice_driver.c index 9898b1914a..d716561361 100644 --- a/src/node_device/node_device_driver.c +++ b/src/node_device/node_device_driver.c @@ -695,6 +695,10 @@ nodeDeviceObjFormatAddress(virNodeDeviceObj *obj) addr =3D g_strdup(caps->data.mdev_parent.address); break; =20 + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + addr =3D virCCWDeviceAddressAsString(caps->data.ccwgroup_dev.a= ddress); + break; + case VIR_NODE_DEV_CAP_SYSTEM: case VIR_NODE_DEV_CAP_USB_DEV: case VIR_NODE_DEV_CAP_USB_INTERFACE: @@ -2189,6 +2193,7 @@ int nodeDeviceDefValidate(virNodeDeviceDef *def, case VIR_NODE_DEV_CAP_AP_QUEUE: case VIR_NODE_DEV_CAP_AP_MATRIX: case VIR_NODE_DEV_CAP_VPD: + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: case VIR_NODE_DEV_CAP_LAST: break; } diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 6b362625f7..a78f47b65a 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1389,6 +1389,43 @@ udevProcessAPMatrix(struct udev_device *device, } =20 =20 +static int +udevProcessCCWGroup(struct udev_device *device, + virNodeDeviceDef *def) +{ + const char *devtype =3D udev_device_get_devtype(device); + virNodeDevCapData *data =3D &def->caps->data; + + data->ccwgroup_dev.address =3D virCCWDeviceAddressFromString(udev_devi= ce_get_sysname(device)); + + udevCCWGetState(device, &data->ccwgroup_dev.state); + + udevGenerateDeviceName(device, def, NULL); + + if ((data->ccwgroup_dev.type =3D virNodeDevCCWGroupCapTypeFromString(d= evtype)) < 0) + return -1; + + switch (data->ccwgroup_dev.type) { + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + { + virCCWGroupTypeQeth *qeth =3D &data->ccwgroup_dev.qeth; + /* process qeth device information */ + udevGetStringSysfsAttr(device, "card_type", &qeth->card_type); + udevGetStringSysfsAttr(device, "chpid", &qeth->chpid); + } + break; + case VIR_NODE_DEV_CAP_CCWGROUP_LAST: + return -1; + } + + if (virNodeDeviceGetCCWGroupDynamicCaps(def->sysfs_path, + &data->ccwgroup_dev) < 0) + return -1; + + return 0; +} + + static int udevGetDeviceNodes(struct udev_device *device, virNodeDeviceDef *def) @@ -1447,6 +1484,8 @@ udevGetDeviceType(struct udev_device *device, *type =3D VIR_NODE_DEV_CAP_AP_CARD; else if (STREQ(devtype, "ap_queue")) *type =3D VIR_NODE_DEV_CAP_AP_QUEUE; + else if (STREQ(devtype, "qeth_generic")) + *type =3D VIR_NODE_DEV_CAP_CCWGROUP_DEV; } else { /* PCI devices don't set the DEVTYPE property. */ if (udevHasDeviceProperty(device, "PCI_CLASS")) @@ -1534,6 +1573,8 @@ udevGetDeviceDetails(virNodeDeviceDriverState *driver= _state, return udevProcessAPMatrix(device, def); case VIR_NODE_DEV_CAP_MDEV_TYPES: return udevProcessMdevParent(device, def); + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + return udevProcessCCWGroup(device, def); case VIR_NODE_DEV_CAP_VPD: case VIR_NODE_DEV_CAP_SYSTEM: case VIR_NODE_DEV_CAP_FC_HOST: diff --git a/src/util/virccw.c b/src/util/virccw.c index c6be013e16..0873c61889 100644 --- a/src/util/virccw.c +++ b/src/util/virccw.c @@ -19,9 +19,15 @@ */ =20 #include + #include "virccw.h" + +#include + #include "virerror.h" +#include "virfile.h" #include "virstring.h" +#include "viralloc.h" =20 #define VIR_FROM_THIS VIR_FROM_NONE =20 @@ -101,3 +107,99 @@ virCCWDeviceAddressParseFromString(const char *address, =20 return 0; } + +void +virCCWGroupMemberTypeFree(virCCWGroupMemberType *member) +{ + if (!member) + return; + + VIR_FREE(member->ref); + VIR_FREE(member->device); + VIR_FREE(member); +} + +static char * +virCCWGroupDeviceDevNodeName(const char *nodedev_prefix, + const char *sysfs_path) +{ + g_autofree char *node_name =3D NULL; + size_t i; + + node_name =3D g_path_get_basename(sysfs_path); + + for (i =3D 0; i < strlen(node_name); i++) { + if (!(g_ascii_isalnum(*(node_name + i)))) + *(node_name + i) =3D '_'; + } + + return g_strdup_printf("%s_%s", nodedev_prefix, node_name); +} + +/** + * virCCWGroupDeviceGetMembers: + * @sysfs_path: sysfs path to a group device + * @members: Where to add the found group members + * @nmembers: Number of found group members + * + * The sysfs path is searched for links with a name prefix "cdev". + * These links point the ccw device sysfs entry which is a member + * of the ccw group. + * + * Returns: -1 on error (invalid sysfs_path or group has no members) + * 0 on success + */ +int +virCCWGroupDeviceGetMembers(const char *sysfs_path, + virCCWGroupMemberType ***members, + size_t *nmembers) +{ + virCCWGroupMemberType *member =3D NULL; + g_autofree char *ccwdevpath =3D NULL; + g_autoptr(DIR) dir =3D NULL; + struct dirent *entry; + int direrr; + + if (virDirOpenIfExists(&dir, sysfs_path) <=3D 0) + return -1; + + while ((direrr =3D virDirRead(dir, &entry, NULL)) > 0) { + if (g_str_has_prefix(entry->d_name, "cdev")) { + // found a cdev reference + g_autofree char *cdevpath =3D NULL; + cdevpath =3D g_build_filename(sysfs_path, entry->d_name, NULL); + + if (virFileIsLink(cdevpath) !=3D 1) + continue; + + if (virFileResolveLink(cdevpath, &ccwdevpath) < 0) + continue; + + if (!virFileExists(ccwdevpath)) + continue; + + member =3D g_new0(virCCWGroupMemberType, 1); + + member->ref =3D g_strdup(entry->d_name); + member->device =3D virCCWGroupDeviceDevNodeName("ccw", ccwdevp= ath); + + VIR_APPEND_ELEMENT(*members, *nmembers, member); + } + } + + /* Groups without a member must not exist */ + if (*nmembers =3D=3D 0) + return -1; + + return 0; +} + +void +virCCWGroupTypeQethFree(virCCWGroupTypeQeth *qeth) +{ + if (!qeth) + return; + + VIR_FREE(qeth->card_type); + VIR_FREE(qeth->chpid); +} diff --git a/src/util/virccw.h b/src/util/virccw.h index 80cc716811..a8c9fa83ef 100644 --- a/src/util/virccw.h +++ b/src/util/virccw.h @@ -35,6 +35,18 @@ struct _virCCWDeviceAddress { bool assigned; }; =20 +typedef struct _virCCWGroupMemberType virCCWGroupMemberType; +struct _virCCWGroupMemberType { + char *ref; /* cdev reference */ + char *device; +}; + +typedef struct _virCCWGroupTypeQeth virCCWGroupTypeQeth; +struct _virCCWGroupTypeQeth { + char *card_type; + char *chpid; +}; + bool virCCWDeviceAddressIsValid(virCCWDeviceAddress *addr); bool virCCWDeviceAddressEqual(virCCWDeviceAddress *addr1, virCCWDeviceAddress *addr2); @@ -50,3 +62,13 @@ int virCCWDeviceAddressParseFromString(const char *addre= ss, unsigned int *cssid, unsigned int *ssid, unsigned int *devno); + +void virCCWGroupMemberTypeFree(virCCWGroupMemberType *member); + +int virCCWGroupDeviceGetMembers(const char *sysfs_path, + virCCWGroupMemberType ***members, + size_t *nmembers); + +void virCCWGroupTypeQethFree(virCCWGroupTypeQeth *qeth); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCCWGroupMemberType, virCCWGroupMemberType= Free); diff --git a/tests/nodedevschemadata/ccwgroup_0_0_bd00.xml b/tests/nodedevs= chemadata/ccwgroup_0_0_bd00.xml new file mode 100644 index 0000000000..4e6e540cfc --- /dev/null +++ b/tests/nodedevschemadata/ccwgroup_0_0_bd00.xml @@ -0,0 +1,20 @@ + + ccwgroup_0_0_bd00 + /sys/devices/qeth/0.0.bd00 + computer + + online + 0x0 + 0x0 + 0xbd00 + + ccw_0_0_bd01 + ccw_0_0_bd02 + ccw_0_0_bd00 + + + OSD_10GIG + BD + + + diff --git a/tests/nodedevxml2xmlout/ccwgroup_0_0_bd00.xml b/tests/nodedevx= ml2xmlout/ccwgroup_0_0_bd00.xml new file mode 120000 index 0000000000..a2749e6685 --- /dev/null +++ b/tests/nodedevxml2xmlout/ccwgroup_0_0_bd00.xml @@ -0,0 +1 @@ +../nodedevschemadata/ccwgroup_0_0_bd00.xml \ No newline at end of file diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c index 814a817725..d4d87b3bdc 100644 --- a/tests/nodedevxml2xmltest.c +++ b/tests/nodedevxml2xmltest.c @@ -146,6 +146,7 @@ mymain(void) DO_TEST("mdev_3627463d_b7f0_4fea_b468_f1da537d301b"); DO_TEST_INACTIVE("mdev_3627463d_b7f0_4fea_b468_f1da537d301b"); DO_TEST("ccw_0_0_ffff"); + DO_TEST("ccwgroup_0_0_bd00"); DO_TEST("css_0_0_ffff"); DO_TEST("css_0_0_ffff_channel_dev_addr"); DO_TEST("css_0_0_fffe_mdev_types"); diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index 145faff3e7..3aae7285a9 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -501,6 +501,9 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd G= _GNUC_UNUSED) case VIR_NODE_DEV_CAP_AP_MATRIX: flags |=3D VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_MATRIX; break; + case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + flags |=3D VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV; + break; case VIR_NODE_DEV_CAP_LAST: break; } --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689303358892.9923613270028; Tue, 4 Feb 2025 09:15:03 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id CF0C91D87; Tue, 4 Feb 2025 12:14:36 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id B21AE1D65; Tue, 4 Feb 2025 12:12:03 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 06A101B66; Tue, 4 Feb 2025 12:11:51 -0500 (EST) Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id C38EE1BD9 for ; Tue, 4 Feb 2025 12:11:49 -0500 (EST) Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GEmJc030533 for ; Tue, 4 Feb 2025 17:11:49 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44kekp2rgq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:49 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514FsYkG007136 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44hxaymnau-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:48 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBimM42598748 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C006C200B5; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A4D9A200B9; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=/sGQwU9Vm4PWFlUDB wqgOAIqJZF1BG3MgWARMTg1Xow=; b=YR42MDAQOxuVn6oH6ueVm7scjZ16w2QNF zbDoDmmFMIvo6PJf/S6uhXmx58HWp3tdX2uq0NVDGTa0YQWx13/wUCc5jcf1PZIo PbBBR+kJsq1SBSahwlBcEfI48G5VTIRy7FkXBCqwZCyd3JJ1FvBF6p4Rgzxg8r8N LHzUs6LJAKxjftTcsOldTgDGbI28NJzVqqpcJG/+FokkwXObCgFyxDyJ4SFTVQpU Y5x0UKIEHBqsqGHcsryAk4tlB0VD4XFnGzI9AmjFKExB649zc+it+nUPHC5fITeH ByK1eEN191/HRExuc55gFqyW9iecveiUPPNd6McVl3Sq6fQ9dQNbg== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 7/8] nodedev: add ccwgroup capability support to ccw devices Date: Tue, 4 Feb 2025 18:11:42 +0100 Message-ID: <20250204171143.93141-8-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 6yyvu0htmRRHyEFiY_p19bEe63jRaV4s X-Proofpoint-GUID: 6yyvu0htmRRHyEFiY_p19bEe63jRaV4s X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 mlxscore=0 malwarescore=0 spamscore=0 priorityscore=1501 phishscore=0 mlxlogscore=999 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 52BEFUGADAXJXJYCJANMJDO62XVCYIKW X-Message-ID-Hash: 52BEFUGADAXJXJYCJANMJDO62XVCYIKW X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689304234019100 Content-Type: text/plain; charset="utf-8" Add the group membership information to a CCW device. Allow to filter CCW devices based on a group membership. Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- docs/manpages/virsh.rst | 19 ++-- include/libvirt/libvirt-nodedev.h | 1 + src/conf/node_device_conf.c | 105 +++++++++++++++++- src/conf/node_device_conf.h | 10 +- src/conf/schemas/nodedev.rng | 12 ++ src/conf/virnodedeviceobj.c | 11 +- src/libvirt_private.syms | 1 + src/node_device/node_device_driver.c | 2 + src/node_device/node_device_udev.c | 4 + src/util/virccw.c | 23 ++++ src/util/virccw.h | 3 + .../ccw_0_0_ff02_ccwgroup.xml | 13 +++ .../ccw_0_0_ff02_ccwgroup.xml | 1 + tests/nodedevxml2xmltest.c | 1 + tools/virsh-nodedev.c | 3 + 15 files changed, 196 insertions(+), 13 deletions(-) create mode 100644 tests/nodedevschemadata/ccw_0_0_ff02_ccwgroup.xml create mode 120000 tests/nodedevxml2xmlout/ccw_0_0_ff02_ccwgroup.xml diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 5e5734dff1..9e549f25a6 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -5532,15 +5532,16 @@ List all of the devices available on the node that = are known by libvirt. separated by comma, e.g. --cap pci,scsi. Valid capability types include 'system', 'pci', 'usb_device', 'usb', 'net', 'scsi_host', 'scsi_target', 'scsi', 'storage', 'fc_host', 'vports', 'scsi_generic', 'drm', 'mdev', -'mdev_types', 'ccw', 'ccwgroup', 'css', 'ap_card', 'ap_queue', 'ap_matrix'. -By default, only active devices are listed. *--inactive* is used to list o= nly -inactive devices, and *--all* is used to list both active and inactive dev= ices. -*--persistent* is used to list only persistent devices, and *--transient* = is -used to list only transient devices. Not providing *--persistent* or -*--transient* will list all devices unless filtered otherwise. *--transien= t* -is mutually exclusive with *--persistent* and *--inactive*. -If *--tree* is used, the output is formatted in a tree representing parent= s of -each node. *--tree* is mutually exclusive with all other options but *--al= l*. +'mdev_types', 'ccw', 'ccwgroup', 'ccwgroup_member', 'css', 'ap_card', +'ap_queue', 'ap_matrix'. By default, only active devices are listed. +*--inactive* is used to list only inactive devices, and *--all* is used to +list both active and inactive devices. *--persistent* is used to list only +persistent devices, and *--transient* is used to list only transient devic= es. +Not providing *--persistent* or *--transient* will list all devices unless +filtered otherwise. *--transient* is mutually exclusive with *--persistent* +and *--inactive*. If *--tree* is used, the output is formatted in a tree +representing parents of each node. *--tree* is mutually exclusive with all +other options but *--all*. =20 =20 nodedev-reattach diff --git a/include/libvirt/libvirt-nodedev.h b/include/libvirt/libvirt-no= dedev.h index 79bee4fb04..9fccbeefeb 100644 --- a/include/libvirt/libvirt-nodedev.h +++ b/include/libvirt/libvirt-nodedev.h @@ -91,6 +91,7 @@ typedef enum { VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_MATRIX =3D 1 << 20, /* s390 A= P Matrix (Since: 7.0.0) */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPD =3D 1 << 21, /* Device= with VPD (Since: 7.9.0) */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV =3D 1 << 22, /* s390 C= CWGROUP device (Since: 11.1.0) */ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_MEMBER =3D 1 << 23, /* s390= CCW device member of CCWGROUP device (Since: 11.1.0) */ =20 VIR_CONNECT_LIST_NODE_DEVICES_PERSISTENT =3D 1 << 28, /* Persis= ted devices (Since: 10.1.0) */ VIR_CONNECT_LIST_NODE_DEVICES_TRANSIENT =3D 1 << 29, /* Transi= ent devices (Since: 10.1.0) */ diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 1649df09a1..3e88f5da87 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -72,6 +72,7 @@ VIR_ENUM_IMPL(virNodeDevCap, "ap_matrix", "vpd", "ccwgroup", + "ccwgroup_member", ); =20 VIR_ENUM_IMPL(virNodeDevCCWGroupCap, @@ -642,6 +643,23 @@ virCCWDeviceAddressFormat(virBuffer *buf, } =20 =20 +static void +virNodeDeviceCapCCWGroupMemberDefFormat(virBuffer *buf, + const virNodeDevCapData *data) +{ + virNodeDevCapCCW ccw_dev =3D data->ccw_dev; + + if (ccw_dev.group_dev) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + virBufferEscapeString(buf, "%s\n", + ccw_dev.group_dev); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } +} + + static void virNodeDeviceCapCSSDefFormat(virBuffer *buf, const virNodeDevCapData *data) @@ -812,6 +830,8 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def, uns= igned int flags) case VIR_NODE_DEV_CAP_CCW_DEV: virNodeDeviceCapCCWStateTypeFormat(&buf, data->ccw_dev.state); virCCWDeviceAddressFormat(&buf, data->ccw_dev.dev_addr); + if (data->ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CCW_CCWGROUP_M= EMBER) + virNodeDeviceCapCCWGroupMemberDefFormat(&buf, data); break; case VIR_NODE_DEV_CAP_CSS_DEV: virNodeDeviceCapCSSDefFormat(&buf, data); @@ -843,6 +863,7 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def, uns= igned int flags) case VIR_NODE_DEV_CAP_CCWGROUP_DEV: virNodeDeviceCapCCWGroupDefFormat(&buf, data); break; + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_VPD: @@ -1252,6 +1273,33 @@ virNodeDevCCWDeviceAddressParseXML(xmlXPathContextPt= r ctxt, } =20 =20 +static int +virNodeDevCCWCapabilityParseXML(xmlXPathContextPtr ctxt, + xmlNodePtr node, + const char *dev_name, + virNodeDevCapCCW *ccw_dev) +{ + g_autofree char *type =3D virXMLPropString(node, "type"); + VIR_XPATH_NODE_AUTORESTORE(ctxt) + + ctxt->node =3D node; + + if (!type) + return 0; /* optional */ + + if (STREQ(type, "ccwgroup_member")) { + if (!(ccw_dev->group_dev =3D virXPathString("string(./group_device= [1])", ctxt))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("missing group_device value for '%1$s'"), dev= _name); + return -1; + } + ccw_dev->flags |=3D VIR_NODE_DEV_CAP_FLAG_CCW_CCWGROUP_MEMBER; + } + + return 0; +} + + static int virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt, virNodeDeviceDef *def, @@ -1260,7 +1308,10 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt, { VIR_XPATH_NODE_AUTORESTORE(ctxt) g_autofree virCCWDeviceAddress *ccw_addr =3D NULL; + g_autofree xmlNodePtr *nodes =3D NULL; g_autofree char *state =3D NULL; + int n =3D 0; + size_t i =3D 0; int val; =20 ctxt->node =3D node; @@ -1284,6 +1335,15 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt, =20 ccw_dev->dev_addr =3D g_steal_pointer(&ccw_addr); =20 + /* capabilities are optional */ + if ((n =3D virXPathNodeSet("./capability", ctxt, &nodes)) < 0) + return -1; + + for (i =3D 0; i < n; i++) { + if (virNodeDevCCWCapabilityParseXML(ctxt, nodes[i], def->name, ccw= _dev) < 0) + return -1; + } + return 0; } =20 @@ -2504,6 +2564,7 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt, ret =3D virNodeDevCapCCWGroupParseXML(ctxt, def, node, &caps->data.ccwgroup_dev); break; + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: @@ -2795,6 +2856,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) break; case VIR_NODE_DEV_CAP_CCW_DEV: g_free(data->ccw_dev.dev_addr); + g_free(data->ccw_dev.group_dev); break; case VIR_NODE_DEV_CAP_CCWGROUP_DEV: g_free(data->ccwgroup_dev.address); @@ -2809,6 +2871,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) break; } break; + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_DRM: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: @@ -2868,6 +2931,12 @@ virNodeDeviceUpdateCaps(virNodeDeviceDef *def) &cap->data.mdev_pare= nt) < 0) return -1; break; + case VIR_NODE_DEV_CAP_CCW_DEV: + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: + if (virNodeDeviceGetCCWDynamicCaps(def->sysfs_path, + &cap->data.ccw_dev) < 0) + return -1; + break; case VIR_NODE_DEV_CAP_CCWGROUP_DEV: if (virNodeDeviceGetCCWGroupDynamicCaps(def->sysfs_path, &cap->data.ccwgroup_de= v) < 0) @@ -2887,7 +2956,6 @@ virNodeDeviceUpdateCaps(virNodeDeviceDef *def) case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_SCSI_GENERIC: case VIR_NODE_DEV_CAP_MDEV: - case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_AP_CARD: case VIR_NODE_DEV_CAP_AP_QUEUE: @@ -2986,6 +3054,15 @@ virNodeDeviceCapsListExport(virNodeDeviceDef *def, ncaps++; } } + + if (caps->data.type =3D=3D VIR_NODE_DEV_CAP_CCW_DEV) { + flags =3D caps->data.ccw_dev.flags; + + if (flags & VIR_NODE_DEV_CAP_FLAG_CCW_CCWGROUP_MEMBER) { + MAYBE_ADD_CAP(VIR_NODE_DEV_CAP_CCWGROUP_MEMBER); + ncaps++; + } + } } =20 #undef MAYBE_ADD_CAP @@ -3335,6 +3412,25 @@ virNodeDeviceGetCSSDynamicCaps(const char *sysfsPath, return 0; } =20 +/* virNodeDeviceGetCCWDynamicCaps() get info that is stored in sysfs + * about devices related to this device, i.e. things that can change + * without this device itself changing. These must be refreshed + * anytime full XML of the device is requested, because they can + * change with no corresponding notification from the kernel/udev. + */ +int +virNodeDeviceGetCCWDynamicCaps(const char *sysfsPath, + virNodeDevCapCCW *ccw_dev) +{ + g_free(ccw_dev->group_dev); + ccw_dev->flags &=3D ~VIR_NODE_DEV_CAP_FLAG_CCW_CCWGROUP_MEMBER; + + if ((ccw_dev->group_dev =3D virCCWDeviceGetGroupDev(sysfsPath))) + ccw_dev->flags |=3D VIR_NODE_DEV_CAP_FLAG_CCW_CCWGROUP_MEMBER; + + return 0; +} + /* virNodeDeviceGetAPMatrixDynamicCaps() get info that is stored in sysfs * about devices related to this device, i.e. things that can change * without this device itself changing. These must be refreshed @@ -3428,6 +3524,13 @@ virNodeDeviceGetCSSDynamicCaps(const char *sysfsPath= G_GNUC_UNUSED, return -1; } =20 +int +virNodeDeviceGetCCWDynamicCaps(const char *sysfsPath G_GNUC_UNUSED, + virNodeDevCapCCW *ccw_dev G_GNUC_UNUSED) +{ + return -1; +} + int virNodeDeviceGetAPMatrixDynamicCaps(const char *sysfsPath G_GNUC_UNUSED, virNodeDevCapAPMatrix *ap_matrix G_GNU= C_UNUSED) diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index d94670e074..a6cef57b95 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -72,6 +72,7 @@ typedef enum { VIR_NODE_DEV_CAP_AP_MATRIX, /* s390 AP Matrix device */ VIR_NODE_DEV_CAP_VPD, /* Device provides VPD */ VIR_NODE_DEV_CAP_CCWGROUP_DEV, /* s390 CCWGROUP device */ + VIR_NODE_DEV_CAP_CCWGROUP_MEMBER, /* s390 CCW device is member of CC= WGROUP */ =20 VIR_NODE_DEV_CAP_LAST } virNodeDevCapType; @@ -118,6 +119,7 @@ typedef enum { =20 typedef enum { VIR_NODE_DEV_CAP_FLAG_CSS_MDEV =3D (1 << 0), + VIR_NODE_DEV_CAP_FLAG_CCW_CCWGROUP_MEMBER =3D (2 << 0), } virNodeDevCCWCapFlags; =20 typedef enum { @@ -295,6 +297,7 @@ struct _virNodeDevCapCCW { size_t nmdev_types; virCCWDeviceAddress *channel_dev_addr; virNodeDevCCWStateType state; + char *group_dev; }; =20 typedef struct _virNodeDevCapVDPA virNodeDevCapVDPA; @@ -457,7 +460,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNodeDevCapsDef, virNod= eDevCapsDefFree); VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_QUEUE | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_AP_MATRIX | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPD | \ - VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV) + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV | \ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_MEMBER) =20 #define VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_ACTIVE \ VIR_CONNECT_LIST_NODE_DEVICES_ACTIVE | \ @@ -495,6 +499,10 @@ int virNodeDeviceGetMdevParentDynamicCaps(const char *sysfsPath, virNodeDevCapMdevParent *mdev_parent= ); =20 +int +virNodeDeviceGetCCWDynamicCaps(const char *sysfsPath, + virNodeDevCapCCW *ccw_dev); + int virNodeDeviceGetCCWGroupDynamicCaps(const char *sysfsPath, virNodeDevCapCCWGroup *ccwgroup); diff --git a/src/conf/schemas/nodedev.rng b/src/conf/schemas/nodedev.rng index ebcda30f1f..f52c6ab752 100644 --- a/src/conf/schemas/nodedev.rng +++ b/src/conf/schemas/nodedev.rng @@ -712,6 +712,17 @@ =20 + + + + + ccwgroup_member + + + + + + ccw @@ -725,6 +736,7 @@ + =20 diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c index 23984995c8..c5ddf0b4fb 100644 --- a/src/conf/virnodedeviceobj.c +++ b/src/conf/virnodedeviceobj.c @@ -723,6 +723,12 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj, return true; break; =20 + case VIR_NODE_DEV_CAP_CCW_DEV: + if (type =3D=3D VIR_NODE_DEV_CAP_CCWGROUP_MEMBER && + (cap->data.ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CCW_CCWGR= OUP_MEMBER)) + return true; + break; + case VIR_NODE_DEV_CAP_SYSTEM: case VIR_NODE_DEV_CAP_USB_DEV: case VIR_NODE_DEV_CAP_USB_INTERFACE: @@ -736,12 +742,12 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj, case VIR_NODE_DEV_CAP_DRM: case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_MDEV: - case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_AP_CARD: case VIR_NODE_DEV_CAP_AP_QUEUE: case VIR_NODE_DEV_CAP_VPD: case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_LAST: break; } @@ -901,7 +907,8 @@ virNodeDeviceObjMatch(virNodeDeviceObj *obj, MATCH_CAP(AP_QUEUE) || MATCH_CAP(AP_MATRIX) || MATCH_CAP(VPD) || - MATCH_CAP(CCWGROUP_DEV))) + MATCH_CAP(CCWGROUP_DEV) || + MATCH_CAP(CCWGROUP_MEMBER))) return false; } =20 diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 07e1e673f0..8abda5fa7e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -899,6 +899,7 @@ virNodeDeviceDefFree; virNodeDeviceDefParse; virNodeDeviceDefParseXML; virNodeDeviceGetAPMatrixDynamicCaps; +virNodeDeviceGetCCWDynamicCaps; virNodeDeviceGetCCWGroupDynamicCaps; virNodeDeviceGetCSSDynamicCaps; virNodeDeviceGetMdevParentDynamicCaps; diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_de= vice_driver.c index d716561361..123b16a292 100644 --- a/src/node_device/node_device_driver.c +++ b/src/node_device/node_device_driver.c @@ -717,6 +717,7 @@ nodeDeviceObjFormatAddress(virNodeDeviceObj *obj) case VIR_NODE_DEV_CAP_AP_CARD: case VIR_NODE_DEV_CAP_AP_QUEUE: case VIR_NODE_DEV_CAP_VPD: + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_LAST: break; } @@ -2194,6 +2195,7 @@ int nodeDeviceDefValidate(virNodeDeviceDef *def, case VIR_NODE_DEV_CAP_AP_MATRIX: case VIR_NODE_DEV_CAP_VPD: case VIR_NODE_DEV_CAP_CCWGROUP_DEV: + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_LAST: break; } diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index a78f47b65a..ba5727ed8f 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1239,6 +1239,9 @@ udevProcessCCW(struct udev_device *device, =20 udevGenerateDeviceName(device, def, NULL); =20 + if (virNodeDeviceGetCCWDynamicCaps(def->sysfs_path, &def->caps->data.c= cw_dev) < 0) + return -1; + return 0; } =20 @@ -1575,6 +1578,7 @@ udevGetDeviceDetails(virNodeDeviceDriverState *driver= _state, return udevProcessMdevParent(device, def); case VIR_NODE_DEV_CAP_CCWGROUP_DEV: return udevProcessCCWGroup(device, def); + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: case VIR_NODE_DEV_CAP_VPD: case VIR_NODE_DEV_CAP_SYSTEM: case VIR_NODE_DEV_CAP_FC_HOST: diff --git a/src/util/virccw.c b/src/util/virccw.c index 0873c61889..762ef671a2 100644 --- a/src/util/virccw.c +++ b/src/util/virccw.c @@ -203,3 +203,26 @@ virCCWGroupTypeQethFree(virCCWGroupTypeQeth *qeth) VIR_FREE(qeth->card_type); VIR_FREE(qeth->chpid); } + +char * +virCCWDeviceGetGroupDev(const char *sysfs_path) +{ + g_autofree char *ccwgroup_path =3D NULL; + g_autofree char *group_dev_path =3D NULL; + + group_dev_path =3D g_build_filename(sysfs_path, "group_device", NULL); + + if (!virFileExists(group_dev_path)) + return NULL; + + if (virFileIsLink(group_dev_path) !=3D 1) + return NULL; + + if (virFileResolveLink(group_dev_path, &ccwgroup_path) < 0) + return NULL; + + if (!virFileExists(ccwgroup_path)) + return NULL; + + return virCCWGroupDeviceDevNodeName("ccwgroup", ccwgroup_path); +} diff --git a/src/util/virccw.h b/src/util/virccw.h index a8c9fa83ef..67faf878a8 100644 --- a/src/util/virccw.h +++ b/src/util/virccw.h @@ -71,4 +71,7 @@ int virCCWGroupDeviceGetMembers(const char *sysfs_path, =20 void virCCWGroupTypeQethFree(virCCWGroupTypeQeth *qeth); =20 +char* virCCWDeviceGetGroupDev(const char *sysfs_path) + ATTRIBUTE_NONNULL(1); + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCCWGroupMemberType, virCCWGroupMemberType= Free); diff --git a/tests/nodedevschemadata/ccw_0_0_ff02_ccwgroup.xml b/tests/node= devschemadata/ccw_0_0_ff02_ccwgroup.xml new file mode 100644 index 0000000000..11767facd3 --- /dev/null +++ b/tests/nodedevschemadata/ccw_0_0_ff02_ccwgroup.xml @@ -0,0 +1,13 @@ + + ccw_0_0_ff02 + /sys/devices/css0/0.0.0070/0.0.ff02 + css_0_0_0070 + + 0x0 + 0x0 + 0xff02 + + ccwgroup_0_0_ff00 + + + diff --git a/tests/nodedevxml2xmlout/ccw_0_0_ff02_ccwgroup.xml b/tests/node= devxml2xmlout/ccw_0_0_ff02_ccwgroup.xml new file mode 120000 index 0000000000..4d2b000b11 --- /dev/null +++ b/tests/nodedevxml2xmlout/ccw_0_0_ff02_ccwgroup.xml @@ -0,0 +1 @@ +../nodedevschemadata/ccw_0_0_ff02_ccwgroup.xml \ No newline at end of file diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c index d4d87b3bdc..265b37b218 100644 --- a/tests/nodedevxml2xmltest.c +++ b/tests/nodedevxml2xmltest.c @@ -146,6 +146,7 @@ mymain(void) DO_TEST("mdev_3627463d_b7f0_4fea_b468_f1da537d301b"); DO_TEST_INACTIVE("mdev_3627463d_b7f0_4fea_b468_f1da537d301b"); DO_TEST("ccw_0_0_ffff"); + DO_TEST("ccw_0_0_ff02_ccwgroup"); DO_TEST("ccwgroup_0_0_bd00"); DO_TEST("css_0_0_ffff"); DO_TEST("css_0_0_ffff_channel_dev_addr"); diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index 3aae7285a9..e759b9f629 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -504,6 +504,9 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd G= _GNUC_UNUSED) case VIR_NODE_DEV_CAP_CCWGROUP_DEV: flags |=3D VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_DEV; break; + case VIR_NODE_DEV_CAP_CCWGROUP_MEMBER: + flags |=3D VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCWGROUP_MEMBER; + break; case VIR_NODE_DEV_CAP_LAST: break; } --=20 2.47.0 From nobody Fri Dec 19 04:01:21 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=reject dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738689206260120.3466811139624; Tue, 4 Feb 2025 09:13:26 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 2531E1D9F; Tue, 4 Feb 2025 12:13:25 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id BAA7D1C90; Tue, 4 Feb 2025 12:11:58 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 758A71B5C; Tue, 4 Feb 2025 12:11:50 -0500 (EST) Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E82551A8E for ; Tue, 4 Feb 2025 12:11:49 -0500 (EST) Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 514GElm0028527 for ; Tue, 4 Feb 2025 17:11:49 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44knqtrf7n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:49 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 514GRL4C024492 for ; Tue, 4 Feb 2025 17:11:48 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44hxxn4jb4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 04 Feb 2025 17:11:48 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 514HBid640829430 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 4 Feb 2025 17:11:45 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D5F0D200B8; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD96C200BA; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) Received: from fiuczyvm.. (unknown [9.152.222.247]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 4 Feb 2025 17:11:44 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=t2yC+gFYvigaWLUgG 7Y8VBPH0LSSTho2hkrNvEaew2Q=; b=r+gtPmjvYhny7uDzPxh3Z4VOen8cgp5c8 JCqX0cYhKRxPHEqhbUAOyOxJz2Eadlv2xERkrDdOoR6TC8ZCdmYNZwkeEq+IGibj u1ANc/hrGNpX0PZd3J/LcM7kI2zr7w6646Muv8ZsLd3ObU7CPTc3AKZJYfKG8sYg 3yvFJApla3mMXMR7UZyl06Nt9JA21E3BV/QI686u+kH1kIDEg6+swA1pwnvoIAcg XEqhCasBUix2NfSHAR1sTtKyVi7JXTHYqLDvtduQjs5x0D6wjxelk0rsQjNPonLc 8LP6Dlo83ApM0liXrcvtyRFS7d4bo4+qIgSapD5FiwozHm7QU/ZHw== From: Boris Fiuczynski To: devel@lists.libvirt.org Subject: [PATCH 8/8] nodedev: add qeth layer2 and layer3 device types Date: Tue, 4 Feb 2025 18:11:43 +0100 Message-ID: <20250204171143.93141-9-fiuczy@linux.ibm.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: <20250204171143.93141-1-fiuczy@linux.ibm.com> References: <20250204171143.93141-1-fiuczy@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ybeNb7ZNBXi1ynbGwILbRUkqvCoQyF4o X-Proofpoint-ORIG-GUID: ybeNb7ZNBXi1ynbGwILbRUkqvCoQyF4o X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-04_08,2025-02-04_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 spamscore=0 lowpriorityscore=0 impostorscore=0 suspectscore=0 clxscore=1015 mlxlogscore=898 phishscore=0 malwarescore=0 mlxscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2501170000 definitions=main-2502040131 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: P4RA3I2XUFH3MDPRJ3XQV4SUI63LVJYT X-Message-ID-Hash: P4RA3I2XUFH3MDPRJ3XQV4SUI63LVJYT X-MailFrom: fiuczy@linux.ibm.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Boris Fiuczynski X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738689248368019100 Content-Type: text/plain; charset="utf-8" Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik --- src/conf/node_device_conf.c | 8 ++++++++ src/conf/node_device_conf.h | 2 ++ src/conf/schemas/nodedev.rng | 6 +++++- src/node_device/node_device_udev.c | 6 +++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 3e88f5da87..30c2b4440e 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -78,6 +78,8 @@ VIR_ENUM_IMPL(virNodeDevCap, VIR_ENUM_IMPL(virNodeDevCCWGroupCap, VIR_NODE_DEV_CAP_CCWGROUP_LAST, "qeth_generic", + "qeth_layer2", + "qeth_layer3", ); =20 VIR_ENUM_IMPL(virNodeDevNetCap, @@ -731,6 +733,8 @@ virNodeDeviceCapCCWGroupDefFormat(virBuffer *buf, virBufferAdjustIndent(buf, 2); switch (ccwgroup_dev.type) { case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER2: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER3: virNodeDeviceCapCCWGroupQethFormat(buf, &ccwgroup_dev.qeth); break; case VIR_NODE_DEV_CAP_CCWGROUP_LAST: @@ -1509,6 +1513,8 @@ virNodeDevCapCCWGroupParseXML(xmlXPathContextPtr ctxt, =20 switch (ccwgroup_dev->type) { case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER2: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER3: if (virNodeDevCapCCWGroupQethParseXML(ctxt, cap_node, &ccwgroup_de= v->qeth) < 0) return -1; break; @@ -2865,6 +2871,8 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps) g_free(data->ccwgroup_dev.members); switch (data->ccwgroup_dev.type) { case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER2: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER3: virCCWGroupTypeQethFree(&data->ccwgroup_dev.qeth); break; case VIR_NODE_DEV_CAP_CCWGROUP_LAST: diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index a6cef57b95..c66660342f 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -80,6 +80,8 @@ typedef enum { typedef enum { /* Keep in sync with VIR_ENUM_IMPL in node_device_conf.c */ VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC, /* s390 CCWGROUP QETH gene= ric device */ + VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER2, /* s390 CCWGROUP QETH laye= r 2 device */ + VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER3, /* s390 CCWGROUP QETH laye= r 3 device */ VIR_NODE_DEV_CAP_CCWGROUP_LAST } virNodeDevCCWGroupCapType; =20 diff --git a/src/conf/schemas/nodedev.rng b/src/conf/schemas/nodedev.rng index f52c6ab752..31ce517e4d 100644 --- a/src/conf/schemas/nodedev.rng +++ b/src/conf/schemas/nodedev.rng @@ -672,7 +672,11 @@ =20 - qeth_generic + + qeth_generic + qeth_layer2 + qeth_layer3 + diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index ba5727ed8f..082f9d5cf0 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1410,6 +1410,8 @@ udevProcessCCWGroup(struct udev_device *device, =20 switch (data->ccwgroup_dev.type) { case VIR_NODE_DEV_CAP_CCWGROUP_QETH_GENERIC: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER2: + case VIR_NODE_DEV_CAP_CCWGROUP_QETH_LAYER3: { virCCWGroupTypeQeth *qeth =3D &data->ccwgroup_dev.qeth; /* process qeth device information */ @@ -1487,7 +1489,9 @@ udevGetDeviceType(struct udev_device *device, *type =3D VIR_NODE_DEV_CAP_AP_CARD; else if (STREQ(devtype, "ap_queue")) *type =3D VIR_NODE_DEV_CAP_AP_QUEUE; - else if (STREQ(devtype, "qeth_generic")) + else if (STREQ(devtype, "qeth_generic") || + STREQ(devtype, "qeth_layer2") || + STREQ(devtype, "qeth_layer3")) *type =3D VIR_NODE_DEV_CAP_CCWGROUP_DEV; } else { /* PCI devices don't set the DEVTYPE property. */ --=20 2.47.0