[libvirt PATCH v3 4/5] conf: introduce support for Fibre Channel VMID

Pavel Hrdina phrdina at redhat.com
Tue Aug 17 09:26:41 UTC 2021


Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 docs/formatdomain.rst                         | 21 +++++++++++++++++++
 docs/schemas/domaincommon.rng                 | 13 ++++++++++++
 src/conf/domain_conf.c                        |  9 +++++++-
 src/conf/domain_conf.h                        |  1 +
 src/conf/domain_validate.c                    | 19 +++++++++++++++++
 .../fibrechannel-appid.xml                    | 21 +++++++++++++++++++
 tests/genericxml2xmltest.c                    |  2 ++
 7 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 tests/genericxml2xmlindata/fibrechannel-appid.xml

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 61ccd8895a..881a75df87 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -1221,6 +1221,27 @@ Resource partitions are currently supported by the QEMU and LXC drivers, which
 map partition paths to cgroups directories, in all mounted controllers.
 :since:`Since 1.0.5`
 
+Fibre Channel VMID
+-------------------
+
+The FC SAN can provide various QOS levels, access control depending on the
+VMID. Also it can collect telemetry data at per-VM level which can be used
+to enhance the IO performance of the VM. This can be configured by using
+the ``appid`` attribute of ``fibrechannel`` element. The attribute contains
+single string (max 128 bytes) and it is used by kernel to create VMID.
+
+::
+
+   ...
+   <resource>
+     <fibrechannel appid='userProvidedID'/>
+   </resource>
+   ...
+
+Using this feature requires Fibre Channel capable HW, kernel compiled with
+option ``CONFIG_BLK_CGROUP_FC_APPID`` and ``nvme_fc`` kernel module loaded.
+:since:`Since 7.7.0`
+
 :anchor:`<a id="elementsCPU"/>`
 
 CPU model and topology
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 9b669d9de5..b32fb8c04c 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -576,6 +576,16 @@
     </element>
   </define>
 
+  <define name="fibrechannel">
+    <element name="fibrechannel">
+      <attribute name="appid">
+        <data type="string">
+          <param name="pattern">.{1,128}</param>
+        </data>
+      </attribute>
+    </element>
+  </define>
+
   <!--
       The Identifiers can be:
       - an optional id attribute with a number on the domain element
@@ -1177,6 +1187,9 @@
           <ref name="absFilePath"/>
         </element>
       </optional>
+      <optional>
+        <ref name="fibrechannel"/>
+      </optional>
     </element>
   </define>
 
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 571650bfd3..926f831073 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3446,6 +3446,7 @@ virDomainResourceDefFree(virDomainResourceDef *resource)
         return;
 
     g_free(resource->partition);
+    g_free(resource->appid);
     g_free(resource);
 }
 
@@ -17285,16 +17286,19 @@ virDomainResourceDefParse(xmlNodePtr node,
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
     virDomainResourceDef *def = NULL;
     char *partition = NULL;
+    char *appid = NULL;
 
     ctxt->node = node;
 
     partition = virXPathString("string(./partition)", ctxt);
+    appid = virXPathString("string(./fibrechannel/@appid)", ctxt);
 
-    if (!partition)
+    if (!partition && !appid)
         return NULL;
 
     def = g_new0(virDomainResourceDef, 1);
     def->partition = partition;
+    def->appid = appid;
 
     return def;
 }
@@ -26769,6 +26773,9 @@ virDomainResourceDefFormat(virBuffer *buf,
     if (def->partition)
         virBufferEscapeString(&childBuf, "<partition>%s</partition>\n", def->partition);
 
+    if (def->appid)
+        virBufferEscapeString(&childBuf, "<fibrechannel appid='%s'/>\n", def->appid);
+
     virXMLFormatElement(buf, "resource", NULL, &childBuf);
 }
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 748b1d5f30..c7e6df7981 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2538,6 +2538,7 @@ void virBlkioDeviceArrayClear(virBlkioDevice *deviceWeights,
 
 struct _virDomainResourceDef {
     char *partition;
+    char *appid;
 };
 
 struct _virDomainHugePage {
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index a9e4519b1a..48f03dfdba 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -55,6 +55,22 @@ virDomainDefBootValidate(const virDomainDef *def)
 }
 
 
+static int
+virDomainDefResourceValidate(const virDomainDef *def)
+{
+    if (!def->resource)
+        return 0;
+
+    if (def->resource->appid && strlen(def->resource->appid) > 128) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("Fibre Channel 'appid' cannot be longer then 128 characters"));
+        return -1;
+    }
+
+    return 0;
+}
+
+
 static int
 virDomainDefVideoValidate(const virDomainDef *def)
 {
@@ -1538,6 +1554,9 @@ static int
 virDomainDefValidateInternal(const virDomainDef *def,
                              virDomainXMLOption *xmlopt)
 {
+    if (virDomainDefResourceValidate(def) < 0)
+        return -1;
+
     if (virDomainDefDuplicateDiskInfoValidate(def) < 0)
         return -1;
 
diff --git a/tests/genericxml2xmlindata/fibrechannel-appid.xml b/tests/genericxml2xmlindata/fibrechannel-appid.xml
new file mode 100644
index 0000000000..ad7df4d4ac
--- /dev/null
+++ b/tests/genericxml2xmlindata/fibrechannel-appid.xml
@@ -0,0 +1,21 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>4</vcpu>
+  <resource>
+    <fibrechannel appid='someapp:c7a5fdbd-edaf-9455-926a-d65c16db1809'/>
+  </resource>
+  <os>
+    <type arch='x86_64' machine='q35'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+  </devices>
+</domain>
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
index 54622ea831..39fd6d403a 100644
--- a/tests/genericxml2xmltest.c
+++ b/tests/genericxml2xmltest.c
@@ -225,6 +225,8 @@ mymain(void)
     DO_TEST_DIFFERENT("cputune");
     DO_TEST("device-backenddomain");
 
+    DO_TEST("fibrechannel-appid");
+
 #define DO_TEST_BACKUP_FULL(name, intrnl) \
     do { \
         const struct testCompareBackupXMLData data = { .testname = name, \
-- 
2.31.1




More information about the libvir-list mailing list