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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 61ccd8895a..512e6abd27 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 and access control depending on the
+VMID. It can also 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..11fa24f398 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -576,6 +576,17 @@
     </element>
   </define>
 
+  <define name="fibrechannel">
+    <element name="fibrechannel">
+      <attribute name="appid">
+        <data type="string">
+          <!-- All printable characters -->
+          <param name="pattern">[&#x20;-&#x7E;]{1,128}</param>
+        </data>
+      </attribute>
+    </element>
+  </define>
+
   <!--
       The Identifiers can be:
       - an optional id attribute with a number on the domain element
@@ -1177,6 +1188,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..d656716ea9 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -55,6 +55,37 @@ virDomainDefBootValidate(const virDomainDef *def)
 }
 
 
+#define APPID_LEN_MIN 1
+#define APPID_LEN_MAX 128
+
+static int
+virDomainDefResourceValidate(const virDomainDef *def)
+{
+    if (!def->resource)
+        return 0;
+
+    if (def->resource->appid) {
+        int len;
+
+        if (!virStringIsPrintable(def->resource->appid)) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("Fibre Channel 'appid' is not printable string"));
+            return -1;
+        }
+
+        len = strlen(def->resource->appid);
+        if (len < APPID_LEN_MIN || len > APPID_LEN_MAX) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("Fibre Channel 'appid' string length must be between [%d, %d]"),
+                           APPID_LEN_MIN, APPID_LEN_MAX);
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
 static int
 virDomainDefVideoValidate(const virDomainDef *def)
 {
@@ -1538,6 +1569,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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux