[PATCH 2/2] bhyve: implement domainGetVcpuPinInfo

Roman Bogorodskiy posted 2 patches 1 day, 23 hours ago
[PATCH 2/2] bhyve: implement domainGetVcpuPinInfo
Posted by Roman Bogorodskiy 1 day, 23 hours ago
Implement domainGetVcpuPinInfo for querying vcpu pinning information.
Also, implement a couple of other APIs this one depends on:
domainGetVcpusFlags and domainGetMaxVcpus.

Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
---
 src/bhyve/bhyve_driver.c | 74 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index cbcdc996dc..a7bd16704e 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -1775,6 +1775,77 @@ bhyveDomainBlockStats(virDomainPtr domain,
     return ret;
 }
 
+static int
+bhyveDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
+{
+    virDomainObj *vm;
+    virDomainDef *def;
+    int ret = -1;
+
+    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
+                  VIR_DOMAIN_AFFECT_CONFIG |
+                  VIR_DOMAIN_VCPU_MAXIMUM, -1);
+
+    if (!(vm = bhyveDomObjFromDomain(domain)))
+        return -1;
+
+    if (virDomainGetVcpusFlagsEnsureACL(domain->conn, vm->def, flags) < 0)
+        goto cleanup;
+
+    if (!(def = virDomainObjGetOneDef(vm, flags)))
+        goto cleanup;
+
+    if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
+        ret = virDomainDefGetVcpusMax(def);
+    else
+        ret = virDomainDefGetVcpus(def);
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
+static int
+bhyveDomainGetMaxVcpus(virDomainPtr domain)
+{
+    return bhyveDomainGetVcpusFlags(domain, (VIR_DOMAIN_AFFECT_LIVE |
+                                             VIR_DOMAIN_VCPU_MAXIMUM));
+}
+
+static int
+bhyveDomainGetVcpuPinInfo(virDomainPtr domain,
+                        int ncpumaps,
+                        unsigned char *cpumaps,
+                        int maplen,
+                        unsigned int flags)
+{
+    virDomainObj *vm;
+    virDomainDef *def;
+    g_autoptr(virBitmap) hostcpus = NULL;
+    int ret = -1;
+
+    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1);
+
+    if (!(vm = bhyveDomObjFromDomain(domain)))
+        return -1;
+
+    if (virDomainGetVcpuPinInfoEnsureACL(domain->conn, vm->def) < 0)
+        goto cleanup;
+
+    if (!(def = virDomainObjGetOneDef(vm, flags)))
+        goto cleanup;
+
+    if (!(hostcpus = virHostCPUGetAvailableCPUsBitmap()))
+        goto cleanup;
+
+    ret = virDomainDefGetVcpuPinInfoHelper(def, maplen, ncpumaps, cpumaps,
+                                           hostcpus, NULL);
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
 static virHypervisorDriver bhyveHypervisorDriver = {
     .name = "bhyve",
     .connectURIProbe = bhyveConnectURIProbe,
@@ -1838,6 +1909,9 @@ static virHypervisorDriver bhyveHypervisorDriver = {
     .domainInterfaceStats = bhyveDomainInterfaceStats, /* 11.7.0 */
     .domainMemoryStats = bhyveDomainMemoryStats, /* 11.7.0 */
     .domainBlockStats = bhyveDomainBlockStats, /* 11.7.0 */
+    .domainGetVcpusFlags = bhyveDomainGetVcpusFlags, /* 12.1.0 */
+    .domainGetMaxVcpus = bhyveDomainGetMaxVcpus, /* 12.1.0 */
+    .domainGetVcpuPinInfo = bhyveDomainGetVcpuPinInfo, /* 12.1.0 */
 };
 
 
-- 
2.52.0