On 01/05/2017 09:46 AM, Roman Bogorodskiy wrote:
From: Fabian Freyer<fabian.freyer(a)physik.tu-berlin.de>
Introduce a BHYVE_CAP_AHCI32SLOT capability that shows
if 32 devices per SATA controller are supported, and
a bhyveProbeCapsAHCI32Slot function that probes it.
---
src/bhyve/bhyve_capabilities.c | 59 +++++++++++++++++++++++++++++++++++-------
src/bhyve/bhyve_capabilities.h | 3 ++-
2 files changed, 52 insertions(+), 10 deletions(-)
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
index 10c33b9d7..83e3ae1b4 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -168,19 +168,13 @@ virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps)
return ret;
}
-int
-virBhyveProbeCaps(unsigned int *caps)
+static int
+bhyveProbeCapsRTC_UTC(unsigned int *caps, char *binary)
{
- char *binary, *help;
+ char *help;
virCommandPtr cmd = NULL;
int ret = 0, exit;
- binary = virFindFileInPath("bhyve");
- if (binary == NULL)
- goto out;
- if (!virFileIsExecutable(binary))
- goto out;
-
cmd = virCommandNew(binary);
virCommandAddArg(cmd, "-h");
virCommandSetErrorBuffer(cmd, &help);
@@ -195,6 +189,53 @@ virBhyveProbeCaps(unsigned int *caps)
out:
VIR_FREE(help);
virCommandFree(cmd);
+ return ret;
+}
+
+static int
+bhyveProbeCapsAHCI32Slot(unsigned int *caps, char *binary)
+{
+ char *error;
+ virCommandPtr cmd = NULL;
+ int ret = 0, exit;
+
+ cmd = virCommandNew(binary);
+ virCommandAddArgList(cmd, "-s", "0,ahci", NULL);
+ virCommandSetErrorBuffer(cmd, &error);
Too bad there isn't some way you could learn both of these with a single
run of the binary.
+ if (virCommandRun(cmd, &exit) < 0) {
+ ret = -1;
+ goto out;
+ }
+
+ if (strstr(error, "pci slot 0:0: unknown device \"ahci\"") ==
NULL)
+ *caps |= BHYVE_CAP_AHCI32SLOT;
That seems like a fairly fragile check. Are you certain there aren't
older versions where the error string is different?
Anyway, lacking any better check, ACK.
+
+ out:
+ VIR_FREE(error);
+ virCommandFree(cmd);
+ return ret;
+}
+
+
+int
+virBhyveProbeCaps(unsigned int *caps)
+{
+ char *binary;
+ int ret = 0;
+
+ binary = virFindFileInPath("bhyve");
+ if (binary == NULL)
+ goto out;
+ if (!virFileIsExecutable(binary))
+ goto out;
+
+ if ((ret = bhyveProbeCapsRTC_UTC(caps, binary)))
+ goto out;
+
+ if ((ret = bhyveProbeCapsAHCI32Slot(caps, binary)))
+ goto out;
+
+ out:
VIR_FREE(binary);
return ret;
}
diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h
index 8e7646dfa..55581bd68 100644
--- a/src/bhyve/bhyve_capabilities.h
+++ b/src/bhyve/bhyve_capabilities.h
@@ -37,7 +37,8 @@ typedef enum {
} virBhyveGrubCapsFlags;
typedef enum {
- BHYVE_CAP_RTC_UTC = 1,
+ BHYVE_CAP_RTC_UTC = 1 << 0,
+ BHYVE_CAP_AHCI32SLOT = 1 << 1,
} virBhyveCapsFlags;
int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps);