---
docs/formatnode.html.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index 3fad842c53..cff249fb2b 100644
--- a/docs/formatnode.html.in
+++ b/docs/formatnode.html.in
@@ -157,7 +157,7 @@
means such device cannot be used for PCI passthrough.
Since 1.3.3
- mdev_types
+ mdev_types
This device is capable of creating mediated devices.
The sub-elements are summarized in
@@ -423,7 +423,7 @@
=20
- PCI devices can be capable of
+ PCI devices can be capable of
creating mediated devices. If they indeed are capable,
then the parent capability
element for
mdev_types
type will contain a list of
--=20
2.26.2
From nobody Fri May 3 19:34:48 2024
Delivered-To: importer@patchew.org
Received-SPF: pass (zohomail.com: domain of redhat.com designates
216.205.24.124 as permitted sender) client-ip=216.205.24.124;
envelope-from=libvir-list-bounces@redhat.com;
helo=us-smtp-delivery-124.mimecast.com;
Authentication-Results: mx.zohomail.com;
spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
dmarc=fail(p=none dis=none) header.from=linux.ibm.com
ARC-Seal: i=1; a=rsa-sha256; t=1605099179; cv=none;
d=zohomail.com; s=zohoarc;
b=Rf7OUF5l8G9mpNsdxjIILwNjzLntArS9FE7jl8Gqd04oYR4ks6ZDM+7k4PCu9bJTkcjJQ89/q/RNl5wEBu1oxXh1Zdq3awcmy0z4XTcPeW+efzrj7vc0SlZU2Td75SEhdDaEwtjhKy7Cr5oTDFTSiQwy4Tdmu0JyoSDEhZK3CTo=
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;
s=zohoarc;
t=1605099179;
h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To;
bh=fUyWo1tlw7b9NRBZGRx29stu6ZaLxamkx6XPmwvVJYs=;
b=k4M3LmCFV0J4zOnoSLx9UH1Iekh21qvAq/D8TV8P0qahgFGG/V/wvlYJ31Q8EwlriETY+wWLf8GbvQMGxuy6kkhcIvW+MrD7fR7i7J/Un9d+mti6ug+7zXWAaVj+XrDW4EUxdYmyMU2/PbH/KylqbY94NFXRpWVLFUIJyWTQ64o=
ARC-Authentication-Results: i=1; mx.zohomail.com;
spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as
permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com;
dmarc=fail header.from= (p=none dis=none)
header.from=
Return-Path:
Received: from us-smtp-delivery-124.mimecast.com
(us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com
with SMTPS id 1605099179272573.7446841252009;
Wed, 11 Nov 2020 04:52:59 -0800 (PST)
Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com
[209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id
us-mta-223-5V7gjBTAO26lMWc4MzmXlA-1; Wed, 11 Nov 2020 07:52:55 -0500
Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com
[10.5.11.12])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 51864802B7E;
Wed, 11 Nov 2020 12:52:48 +0000 (UTC)
Received: from colo-mx.corp.redhat.com
(colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21])
by smtp.corp.redhat.com (Postfix) with ESMTPS id C3FED6198C;
Wed, 11 Nov 2020 12:52:46 +0000 (UTC)
Received: from lists01.pubmisc.prod.ext.phx2.redhat.com
(lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33])
by colo-mx.corp.redhat.com (Postfix) with ESMTP id 918129983;
Wed, 11 Nov 2020 12:52:44 +0000 (UTC)
Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com
[10.11.54.3])
by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
id 0ABCjlcT031029 for ;
Wed, 11 Nov 2020 07:45:47 -0500
Received: by smtp.corp.redhat.com (Postfix)
id 47298100404F; Wed, 11 Nov 2020 12:45:47 +0000 (UTC)
Received: from mimecast-mx02.redhat.com
(mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18])
by smtp.corp.redhat.com (Postfix) with ESMTPS id 4023B10F1BE5
for ; Wed, 11 Nov 2020 12:45:44 +0000 (UTC)
Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))
(No client certificate requested)
by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DA3AF865462
for ; Wed, 11 Nov 2020 12:45:44 +0000 (UTC)
Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com
[148.163.158.5]) (Using TLS) by relay.mimecast.com with ESMTP id
us-mta-561-3SxxC5UgMFqZecHLn5fADQ-1; Wed, 11 Nov 2020 07:45:40 -0500
Received: from pps.filterd (m0098420.ppops.net [127.0.0.1])
by mx0b-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id
0ABCWfQp081006; Wed, 11 Nov 2020 07:45:40 -0500
Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com
[149.81.74.107])
by mx0b-001b2d01.pphosted.com with ESMTP id 34qw4qsh3w-1
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256
verify=NOT); Wed, 11 Nov 2020 07:45:39 -0500
Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1])
by ppma03fra.de.ibm.com (8.16.0.42/8.16.0.42) with SMTP id
0ABCigMp011887; Wed, 11 Nov 2020 12:45:38 GMT
Received: from b06cxnps4075.portsmouth.uk.ibm.com
(d06relay12.portsmouth.uk.ibm.com [9.149.109.197])
by ppma03fra.de.ibm.com with ESMTP id 34q0841b2x-1
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256
verify=NOT); Wed, 11 Nov 2020 12:45:37 +0000
Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com
[9.149.105.232])
by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with
ESMTP id 0ABCjZfj8389234
(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256
verify=OK); Wed, 11 Nov 2020 12:45:35 GMT
Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1])
by IMSVA (Postfix) with ESMTP id 9A5EC5204E;
Wed, 11 Nov 2020 12:45:35 +0000 (GMT)
Received: from localhost.localdomain (unknown [9.145.46.190])
by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 7A6FD52067;
Wed, 11 Nov 2020 12:45:35 +0000 (GMT)
X-MC-Unique: 5V7gjBTAO26lMWc4MzmXlA-1
X-MC-Unique: 3SxxC5UgMFqZecHLn5fADQ-1
From: Boris Fiuczynski
To: libvir-list@redhat.com, eskultet@redhat.com
Subject: [PATCH v3 3/3] node_device: detecting mdev_types capability on CSS
devices
Date: Wed, 11 Nov 2020 13:45:22 +0100
Message-Id: <20201111124522.41263-4-fiuczy@linux.ibm.com>
In-Reply-To: <20201111124522.41263-1-fiuczy@linux.ibm.com>
References: <20201111124522.41263-1-fiuczy@linux.ibm.com>
MIME-Version: 1.0
X-TM-AS-GCONF: 00
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.312, 18.0.737
definitions=2020-11-11_02:2020-11-10,
2020-11-11 signatures=0
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
suspectscore=29 clxscore=1015
priorityscore=1501 lowpriorityscore=0 adultscore=0 impostorscore=0
mlxlogscore=999 spamscore=0 mlxscore=0 bulkscore=0 malwarescore=0
phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1
engine=8.12.0-2009150000 definitions=main-2011110071
X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection
Definition; Similar Internal Domain=false;
Similar Monitored External Domain=false;
Custom External Domain=false; Mimecast External Domain=false;
Newly Observed Domain=false; Internal User Name=false;
Custom Display Name List=false; Reply-to Address Mismatch=false;
Targeted Threat Dictionary=false;
Mimecast Threat Dictionary=false; Custom Threat Dictionary=false
X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3
X-loop: libvir-list@redhat.com
Cc: jtomko@redhat.com
X-BeenThere: libvir-list@redhat.com
X-Mailman-Version: 2.1.12
Precedence: junk
List-Id: Development discussions about the libvirt library & tools
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Sender: libvir-list-bounces@redhat.com
Errors-To: libvir-list-bounces@redhat.com
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12
Authentication-Results: relay.mimecast.com;
auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com
X-Mimecast-Spam-Score: 0
X-Mimecast-Originator: redhat.com
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"
Add detection of mdev_types capability to channel subsystem devices.
Signed-off-by: Boris Fiuczynski
Reviewed-by: Bjoern Walk
Reviewed-by: Erik Skultety
---
docs/drvnodedev.html.in | 2 +-
docs/formatnode.html.in | 23 ++++-
docs/schemas/nodedev.rng | 4 +
src/conf/node_device_conf.c | 92 ++++++++++++++++++-
src/conf/node_device_conf.h | 11 +++
src/conf/virnodedeviceobj.c | 7 +-
src/libvirt_private.syms | 1 +
src/node_device/node_device_udev.c | 3 +
.../css_0_0_fffe_mdev_types.xml | 17 ++++
tests/nodedevxml2xmltest.c | 1 +
10 files changed, 153 insertions(+), 8 deletions(-)
create mode 100644 tests/nodedevschemadata/css_0_0_fffe_mdev_types.xml
diff --git a/docs/drvnodedev.html.in b/docs/drvnodedev.html.in
index 639f58d8ce..84c3bd3ef9 100644
--- a/docs/drvnodedev.html.in
+++ b/docs/drvnodedev.html.in
@@ -139,7 +139,7 @@
=20
- A PCI device capable of creating mediated devices will include a nes=
ted
+ A device capable of creating mediated devices will include a nested
capability mdev_types
which enumerates all supported md=
ev
types on the physical device, along with the type attributes availab=
le
through sysfs. A detailed description of the XML format for the
diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index cff249fb2b..c7df69c901 100644
--- a/docs/formatnode.html.in
+++ b/docs/formatnode.html.in
@@ -405,6 +405,21 @@
The subchannel-set identifier.
devno
The device number.
+ capability
+
+ This optional element can occur multiple times. If it
+ exists, it has a mandatory type
attribute
+ which will be set to:
+
+ mdev_types
+ -
+ Since 6.10.0
+ This device is capable of creating mediated devices.
+ The sub-elements are summarized in
+ mdev_types capability.
+
+
+
vdpa
@@ -423,10 +438,10 @@
=20
- PCI devices can be capable of
- creating mediated devices. If they indeed are capable,
- then the parent capability
element for
- mdev_types
type will contain a list of
+ PCI and CSS
+ devices can be capable of creating mediated devices.
+ If they indeed are capable, then the parent capability
+ element for mdev_types
type will contain a list of
type
elements, which list all mdev types supported
on the physical device. Since 3.4.0
Each type
element has a single id
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
index 231afa0218..b3e986659e 100644
--- a/docs/schemas/nodedev.rng
+++ b/docs/schemas/nodedev.rng
@@ -654,6 +654,9 @@
[
]
+
+ [
+ ]
=20
@@ -702,6 +705,7 @@
vfio-pci
+ vfio-ccw
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index a57505a27e..4e2837c1cd 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -552,6 +552,10 @@ virNodeDeviceCapCCWDefFormat(virBufferPtr buf,
data->ccw_dev.ssid);
virBufferAsprintf(buf, "0x%04x\n",
data->ccw_dev.devno);
+ if (data->ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CSS_MDEV)
+ virNodeDeviceCapMdevTypesFormat(buf,
+ data->ccw_dev.mdev_types,
+ data->ccw_dev.nmdev_types);
}
=20
=20
@@ -843,6 +847,33 @@ virNodeDevCapMdevTypesParseXML(xmlXPathContextPtr ctxt,
}
=20
=20
+static int
+virNodeDevCSSCapabilityParseXML(xmlXPathContextPtr ctxt,
+ xmlNodePtr node,
+ virNodeDevCapCCWPtr ccw_dev)
+{
+ g_autofree char *type =3D virXMLPropString(node, "type");
+ VIR_XPATH_NODE_AUTORESTORE(ctxt)
+
+ ctxt->node =3D node;
+
+ if (!type) {
+ virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing capability type=
"));
+ return -1;
+ }
+
+ if (STREQ(type, "mdev_types")) {
+ if (virNodeDevCapMdevTypesParseXML(ctxt,
+ &ccw_dev->mdev_types,
+ &ccw_dev->nmdev_types) < 0)
+ return -1;
+ ccw_dev->flags |=3D VIR_NODE_DEV_CAP_FLAG_CSS_MDEV;
+ }
+
+ return 0;
+}
+
+
static int
virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
virNodeDeviceDefPtr def,
@@ -850,6 +881,9 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
virNodeDevCapCCWPtr ccw_dev)
{
VIR_XPATH_NODE_AUTORESTORE(ctxt)
+ g_autofree xmlNodePtr *nodes =3D NULL;
+ int n =3D 0;
+ size_t i =3D 0;
g_autofree char *cssid =3D NULL;
g_autofree char *ssid =3D NULL;
g_autofree char *devno =3D NULL;
@@ -895,6 +929,14 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
return -1;
}
=20
+ if ((n =3D virXPathNodeSet("./capability", ctxt, &nodes)) < 0)
+ return -1;
+
+ for (i =3D 0; i < n; i++) {
+ if (virNodeDevCSSCapabilityParseXML(ctxt, nodes[i], ccw_dev) < 0)
+ return -1;
+ }
+
return 0;
}
=20
@@ -2253,12 +2295,16 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
virMediatedDeviceAttrFree(data->mdev.attributes[i]);
VIR_FREE(data->mdev.attributes);
break;
+ case VIR_NODE_DEV_CAP_CSS_DEV:
+ for (i =3D 0; i < data->ccw_dev.nmdev_types; i++)
+ virMediatedDeviceTypeFree(data->ccw_dev.mdev_types[i]);
+ VIR_FREE(data->ccw_dev.mdev_types);
+ break;
case VIR_NODE_DEV_CAP_MDEV_TYPES:
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_CSS_DEV:
case VIR_NODE_DEV_CAP_VDPA:
case VIR_NODE_DEV_CAP_LAST:
/* This case is here to shutup the compiler */
@@ -2297,6 +2343,11 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def)
&cap->data.pci_dev) < 0)
return -1;
break;
+ case VIR_NODE_DEV_CAP_CSS_DEV:
+ if (virNodeDeviceGetCSSDynamicCaps(def->sysfs_path,
+ &cap->data.ccw_dev) < 0)
+ return -1;
+ break;
=20
/* all types that (supposedly) don't require any updates
* relative to what's in the cache.
@@ -2313,7 +2364,6 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def)
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_CSS_DEV:
case VIR_NODE_DEV_CAP_VDPA:
case VIR_NODE_DEV_CAP_LAST:
break;
@@ -2388,6 +2438,15 @@ virNodeDeviceCapsListExport(virNodeDeviceDefPtr def,
ncaps++;
}
}
+
+ if (caps->data.type =3D=3D VIR_NODE_DEV_CAP_CSS_DEV) {
+ flags =3D caps->data.ccw_dev.flags;
+
+ if (flags & VIR_NODE_DEV_CAP_FLAG_CSS_MDEV) {
+ MAYBE_ADD_CAP(VIR_NODE_DEV_CAP_MDEV_TYPES);
+ ncaps++;
+ }
+ }
}
=20
#undef MAYBE_ADD_CAP
@@ -2653,6 +2712,28 @@ virNodeDeviceGetPCIDynamicCaps(const char *sysfsPath,
return 0;
}
=20
+
+/* virNodeDeviceGetCSSDynamicCaps() 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
+virNodeDeviceGetCSSDynamicCaps(const char *sysfsPath,
+ virNodeDevCapCCWPtr ccw_dev)
+{
+ ccw_dev->flags &=3D ~VIR_NODE_DEV_CAP_FLAG_CSS_MDEV;
+ if (virNodeDeviceGetMdevTypesCaps(sysfsPath,
+ &ccw_dev->mdev_types,
+ &ccw_dev->nmdev_types) < 0)
+ return -1;
+ if (ccw_dev->nmdev_types > 0)
+ ccw_dev->flags |=3D VIR_NODE_DEV_CAP_FLAG_CSS_MDEV;
+
+ return 0;
+}
+
#else
=20
int
@@ -2675,4 +2756,11 @@ int virNodeDeviceGetSCSITargetCaps(const char *sysfs=
Path G_GNUC_UNUSED,
return -1;
}
=20
+int
+virNodeDeviceGetCSSDynamicCaps(const char *sysfsPath G_GNUC_UNUSED,
+ virNodeDevCapCCWPtr ccw_dev G_GNUC_UNUSED)
+{
+ return -1;
+}
+
#endif /* __linux__ */
diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
index 3057c728a0..262524fc87 100644
--- a/src/conf/node_device_conf.h
+++ b/src/conf/node_device_conf.h
@@ -102,6 +102,10 @@ typedef enum {
VIR_NODE_DEV_CAP_FLAG_PCI_MDEV =3D (1 << 3),
} virNodeDevPCICapFlags;
=20
+typedef enum {
+ VIR_NODE_DEV_CAP_FLAG_CSS_MDEV =3D (1 << 0),
+} virNodeDevCCWCapFlags;
+
typedef enum {
/* Keep in sync with VIR_ENUM_IMPL in node_device_conf.c */
VIR_NODE_DEV_DRM_PRIMARY,
@@ -274,6 +278,9 @@ struct _virNodeDevCapCCW {
unsigned int cssid;
unsigned int ssid;
unsigned int devno;
+ unsigned int flags; /* enum virNodeDevCCWCapFlags */
+ virMediatedDeviceTypePtr *mdev_types;
+ size_t nmdev_types;
};
=20
typedef struct _virNodeDevCapVDPA virNodeDevCapVDPA;
@@ -391,6 +398,10 @@ int
virNodeDeviceGetPCIDynamicCaps(const char *sysfsPath,
virNodeDevCapPCIDevPtr pci_dev);
=20
+int
+virNodeDeviceGetCSSDynamicCaps(const char *sysfsPath,
+ virNodeDevCapCCWPtr ccw_dev);
+
int
virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def);
=20
diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
index 037a938e88..9e46d22a2f 100644
--- a/src/conf/virnodedeviceobj.c
+++ b/src/conf/virnodedeviceobj.c
@@ -696,6 +696,12 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj,
return true;
break;
=20
+ case VIR_NODE_DEV_CAP_CSS_DEV:
+ if (type =3D=3D VIR_NODE_DEV_CAP_MDEV_TYPES &&
+ (cap->data.ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CSS_MDEV))
+ return true;
+ break;
+
case VIR_NODE_DEV_CAP_SYSTEM:
case VIR_NODE_DEV_CAP_USB_DEV:
case VIR_NODE_DEV_CAP_USB_INTERFACE:
@@ -710,7 +716,6 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj,
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_CSS_DEV:
case VIR_NODE_DEV_CAP_VDPA:
case VIR_NODE_DEV_CAP_LAST:
break;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ddddc8f2d1..491bd5bd87 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -824,6 +824,7 @@ virNodeDeviceDefFree;
virNodeDeviceDefParseFile;
virNodeDeviceDefParseNode;
virNodeDeviceDefParseString;
+virNodeDeviceGetCSSDynamicCaps;
virNodeDeviceGetPCIDynamicCaps;
virNodeDeviceGetSCSIHostCaps;
virNodeDeviceGetSCSITargetCaps;
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi=
ce_udev.c
index b315894965..65f312d8f4 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1139,6 +1139,9 @@ udevProcessCSS(struct udev_device *device,
if (udevGenerateDeviceName(device, def, NULL) !=3D 0)
return -1;
=20
+ if (virNodeDeviceGetCSSDynamicCaps(def->sysfs_path, &def->caps->data.c=
cw_dev) < 0)
+ return -1;
+
return 0;
}
=20
diff --git a/tests/nodedevschemadata/css_0_0_fffe_mdev_types.xml b/tests/no=
dedevschemadata/css_0_0_fffe_mdev_types.xml
new file mode 100644
index 0000000000..5058b6434e
--- /dev/null
+++ b/tests/nodedevschemadata/css_0_0_fffe_mdev_types.xml
@@ -0,0 +1,17 @@
+
+ css_0_0_fffe
+ /sys/devices/css0/0.0.fffe
+ computer
+
+ 0x0
+ 0x0
+ 0xfffe
+
+
+ I/O subchannel (Non-QDIO)
+ vfio-ccw
+ 1
+
+
+
+
diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c
index 3cb23b1df4..a009ecb343 100644
--- a/tests/nodedevxml2xmltest.c
+++ b/tests/nodedevxml2xmltest.c
@@ -124,6 +124,7 @@ mymain(void)
DO_TEST("mdev_3627463d_b7f0_4fea_b468_f1da537d301b");
DO_TEST("ccw_0_0_ffff");
DO_TEST("css_0_0_ffff");
+ DO_TEST("css_0_0_fffe_mdev_types");
=20
return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
--=20
2.26.2