On 5/12/24 21:45, Andrew Melnychenko wrote:
eBPF objects stored in the hash table during runtime.
eBPF objects cached encoded in base64 in the .xml cache file.
Signed-off-by: Andrew Melnychenko <andrew(a)daynix.com>
---
src/qemu/qemu_capabilities.c | 122 +++++++++++++++++++++++++++++++++++
src/qemu/qemu_capabilities.h | 3 +
2 files changed, 125 insertions(+)
'meson test' fails after this one.
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 45525db803..09bb6ca36e 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -799,6 +799,9 @@ struct _virQEMUCaps {
virQEMUCapsAccel kvm;
virQEMUCapsAccel hvf;
virQEMUCapsAccel tcg;
+
+ /* Hash of ebpf objects encoded in base64 */
+ GHashTable *ebpfObjects;
};
struct virQEMUCapsSearchData {
@@ -846,6 +849,13 @@ const char *virQEMUCapsArchToString(virArch arch)
}
+const char *
+virQEMUCapsGetEbpf(virQEMUCaps *qemuCaps, const char *id)
+{
+ return virHashLookup(qemuCaps->ebpfObjects, id);
+}
+
+
/* Checks whether a domain with @guest arch can run natively on @host.
*/
bool
@@ -1823,6 +1833,8 @@ virQEMUCapsNew(void)
qemuCaps->invalidation = true;
qemuCaps->flags = virBitmapNew(QEMU_CAPS_LAST);
+ qemuCaps->ebpfObjects = virHashNew(g_free);
+
return qemuCaps;
}
@@ -1965,6 +1977,9 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps)
{
g_autoptr(virQEMUCaps) ret = virQEMUCapsNewBinary(qemuCaps->binary);
size_t i;
+ GHashTableIter iter;
+ const char *key;
+ const char *value;
ret->invalidation = qemuCaps->invalidation;
ret->kvmSupportsNesting = qemuCaps->kvmSupportsNesting;
@@ -2003,6 +2018,12 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps)
ret->hypervCapabilities = g_memdup(qemuCaps->hypervCapabilities,
sizeof(virDomainCapsFeatureHyperv));
+ ret->ebpfObjects = virHashNew(g_free);
+ g_hash_table_iter_init(&iter, qemuCaps->ebpfObjects);
+ while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *)
&value)) {
+ g_hash_table_insert(ret->ebpfObjects, g_strdup(key), g_strdup(value));
+ }
+
I'd move this into a separate function for code estetics purpose.
return g_steal_pointer(&ret);
}
Michal