From: Pavel Hrdina Date: Mon, 2 Aug 2021 18:26:57 +0000 (+0200) Subject: qemu: implement support for Fibre Channel VMID X-Git-Tag: v7.7.0-rc1~176 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6cbb1865d8f009a47775199489aecb0bcead31e2;p=thirdparty%2Flibvirt.git qemu: implement support for Fibre Channel VMID Based on kernel commit messages the interface is /sys/class/fc/fc_udev_device/appid_store where we need to write the following string "$INODE:$APPID". $INODE is the VM root cgroup inode in hexadecimal and $APPID is user provided string that will be attached to each FC frame for the VM within the cgroup identified by inode and has limit 128 bytes. Signed-off-by: Pavel Hrdina Reviewed-by: Martin Kletzander --- diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index f2d99abcfa..42dba1750d 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -904,6 +904,34 @@ qemuSetupCpuCgroup(virDomainObj *vm) } +static int +qemuSetupCgroupAppid(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv = vm->privateData; + int inode = -1; + const char *path = "/sys/class/fc/fc_udev_device/appid_store"; + g_autofree char *appid = NULL; + virDomainResourceDef *resource = vm->def->resource; + + if (!resource || !resource->appid) + return 0; + + inode = virCgroupGetInode(priv->cgroup); + if (inode < 0) + return -1; + + appid = g_strdup_printf("%X:%s", inode, resource->appid); + + if (virFileWriteStr(path, appid, 0) < 0) { + virReportSystemError(errno, + _("Unable to write '%s' to '%s'"), appid, path); + return -1; + } + + return 0; +} + + static int qemuInitCgroup(virDomainObj *vm, size_t nnicindexes, @@ -1096,6 +1124,9 @@ qemuSetupCgroup(virDomainObj *vm, if (qemuSetupCpusetCgroup(vm) < 0) return -1; + if (qemuSetupCgroupAppid(vm) < 0) + return -1; + return 0; }