[RFC PATCH 1/4] qemu_monitor: Added QEMU's "request-ebpf" support.

2023-10-08 Thread Andrew Melnychenko
Added code for monitor and monitor_json.
The "request-ebpf" return's eBPF binary object encoded in base64.
The function qemuMonitorGetEbpf() returns a decoded blob.

QEMU provides eBPF that can be loaded and passed to it from Libvirt.
QEMU requires exact eBPF program/maps, so it can be retrieved using QAPI.
To load eBPF program - administrative capabilities are required, so Libvirt may 
load it and pass it to the QEMU instance.
For now, there is only "RSS"(Receive Side Scaling) for virtio-net eBPF program 
and maps.

Signed-off-by: Andrew Melnychenko 
---
 src/qemu/qemu_monitor.c  | 23 +++
 src/qemu/qemu_monitor.h  |  3 +++
 src/qemu/qemu_monitor_json.c | 21 +
 src/qemu/qemu_monitor_json.h |  3 +++
 4 files changed, 50 insertions(+)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 320729f067..07596c78ee 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -4512,3 +4512,26 @@ qemuMonitorGetStatsByQOMPath(virJSONValue *arr,
 
 return NULL;
 }
+
+void *
+qemuMonitorGetEbpf(qemuMonitor *mon, const char *ebpfName, size_t *size)
+{
+QEMU_CHECK_MONITOR_NULL(mon);
+g_autoptr(virJSONValue) reply = NULL;
+const char *ebpfBase64 = NULL;
+void *ebpfObject = NULL;
+
+if (ebpfName == NULL || size == NULL)
+return NULL;
+
+reply = qemuMonitorJSONGetEbpf(mon, ebpfName);
+
+if (reply == NULL)
+return NULL;
+
+ebpfBase64 = virJSONValueObjectGetString(reply, "object");
+
+ebpfObject = g_base64_decode(ebpfBase64, size);
+
+return ebpfObject;
+}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 6c590933aa..15f32f105c 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1579,3 +1579,6 @@ qemuMonitorExtractQueryStats(virJSONValue *info);
 virJSONValue *
 qemuMonitorGetStatsByQOMPath(virJSONValue *arr,
  char *qom_path);
+
+void *
+qemuMonitorGetEbpf(qemuMonitor *mon, const char *ebpfName, size_t *size);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 8152eea9a0..a7d0865ddc 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -8851,3 +8851,24 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
 
 return virJSONValueObjectStealArray(reply, "return");
 }
+
+
+virJSONValue *
+qemuMonitorJSONGetEbpf(qemuMonitor *mon, const char *ebpfName)
+{
+g_autoptr(virJSONValue) cmd = NULL;
+g_autoptr(virJSONValue) reply = NULL;
+
+if (!(cmd = qemuMonitorJSONMakeCommand("request-ebpf",
+   "s:id", ebpfName, NULL)))
+return NULL;
+
+if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
+return NULL;
+
+/* return empty hash */
+if (qemuMonitorJSONHasError(reply, "CommandNotFound"))
+return NULL;
+
+return virJSONValueObjectStealObject(reply, "return");
+}
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 06023b98ea..6a2fc963ba 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -825,3 +825,6 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
   qemuMonitorQueryStatsTargetType target,
   char **vcpus,
   GPtrArray *providers);
+
+virJSONValue *
+qemuMonitorJSONGetEbpf(qemuMonitor *mon, const char *ebpfName);
-- 
2.42.0



[RFC PATCH 4/4] qemu_command: Added "ebpf_rss_fds" support for virtio-net.

2023-10-08 Thread Andrew Melnychenko
Added logic for loading the "RSS" eBPF program.
eBPF file descriptors passed to the QEMU.

Signed-off-by: Andrew Melnychenko 
---
 src/qemu/qemu_command.c | 53 +
 src/qemu/qemu_domain.c  |  4 
 src/qemu/qemu_domain.h  |  3 +++
 3 files changed, 60 insertions(+)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 8a7b80719f..ca6cb1bc7a 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3786,6 +3786,23 @@ qemuBuildLegacyNicStr(virDomainNetDef *net)
NULLSTR_EMPTY(net->info.alias));
 }
 
+static char *qemuBuildEbpfRssArg(virDomainNetDef *net) {
+qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
+g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+size_t nfds;
+GSList *n;
+
+if (netpriv->ebpfrssfds) {
+nfds = 0;
+for (n = netpriv->ebpfrssfds; n; n = n->next) {
+virBufferAsprintf(&buf, "%s:", qemuFDPassDirectGetPath(n->data));
+nfds++;
+}
+}
+virBufferTrim(&buf, ":");
+
+return virBufferContentAndReset(&buf);
+}
 
 virJSONValue *
 qemuBuildNicDevProps(virDomainDef *def,
@@ -3871,6 +3888,11 @@ qemuBuildNicDevProps(virDomainDef *def,
   "T:failover", failover,
   NULL) < 0)
 return NULL;
+if (net->driver.virtio.rss == VIR_TRISTATE_SWITCH_ON && 
virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_EBPF_RSS_FDS)){
+g_autofree char *ebpf = qemuBuildEbpfRssArg(net);
+if (virJSONValueObjectAdd(&props, "S:ebpf_rss_fds", ebpf, NULL) < 
0)
+return NULL;
+}
 } else {
 if (virJSONValueObjectAdd(&props,
   "s:driver", virDomainNetGetModelString(net),
@@ -4152,6 +4174,33 @@ qemuBuildWatchdogDevProps(const virDomainDef *def,
 }
 
 
+static void qemuOpenEbpfRssFds(virDomainNetDef *net,
+  virQEMUCaps *qemuCaps) {
+const void *ebpfRSSObject = NULL;
+size_t ebpfRSSObjectSize = 0;
+int fds[16];
+int nfds = 0;
+qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
+
+netpriv->libbpfRSSObject = NULL;
+netpriv->ebpfrssfds = NULL;
+
+/* Add ebpf values */
+if (net->driver.virtio.rss == VIR_TRISTATE_SWITCH_ON && 
virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_EBPF_RSS_FDS)) {
+ebpfRSSObject = virQEMUCapsGetEbpf(qemuCaps, "rss", 
&ebpfRSSObjectSize);
+nfds = qemuInterfaceLoadEbpf(ebpfRSSObject, ebpfRSSObjectSize, 
&netpriv->libbpfRSSObject, fds, 16);
+
+if (nfds > 0) {
+for (int i = 0; i < nfds; ++i) {
+g_autofree char *name = g_strdup_printf("ebpfrssfd-%s-%u", 
net->info.alias, i);
+netpriv->ebpfrssfds = g_slist_prepend(netpriv->ebpfrssfds, 
qemuFDPassDirectNew(name, fds + i));
+}
+netpriv->ebpfrssfds = g_slist_reverse(netpriv->ebpfrssfds);
+}
+}
+}
+
+
 static int
 qemuBuildWatchdogCommandLine(virCommand *cmd,
  const virDomainDef *def,
@@ -8735,6 +8784,10 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
 qemuFDPassDirectTransferCommand(netpriv->slirpfd, cmd);
 qemuFDPassTransferCommand(netpriv->vdpafd, cmd);
 
+qemuOpenEbpfRssFds(net, qemuCaps);
+for (n = netpriv->ebpfrssfds; n; n = n->next)
+qemuFDPassDirectTransferCommand(n->data, cmd);
+
 if (!(hostnetprops = qemuBuildHostNetProps(vm, net)))
 goto cleanup;
 
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index eec7bed28b..c696482f29 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -38,6 +38,7 @@
 #include "qemu_checkpoint.h"
 #include "qemu_validate.h"
 #include "qemu_namespace.h"
+#include "qemu_interface.h"
 #include "viralloc.h"
 #include "virlog.h"
 #include "virerror.h"
@@ -1078,6 +1079,7 @@ qemuDomainNetworkPrivateClearFDs(qemuDomainNetworkPrivate 
*priv)
 g_clear_pointer(&priv->vdpafd, qemuFDPassFree);
 g_slist_free_full(g_steal_pointer(&priv->vhostfds), (GDestroyNotify) 
qemuFDPassDirectFree);
 g_slist_free_full(g_steal_pointer(&priv->tapfds), (GDestroyNotify) 
qemuFDPassDirectFree);
+g_slist_free_full(g_steal_pointer(&priv->ebpfrssfds), (GDestroyNotify) 
qemuFDPassDirectFree);
 }
 
 
@@ -1089,6 +1091,8 @@ qemuDomainNetworkPrivateDispose(void *obj G_GNUC_UNUSED)
 qemuSlirpFree(priv->slirp);
 
 qemuDomainNetworkPrivateClearFDs(priv);
+
+qemuInterfaceCloseEbpf(priv->libbpfRSSObject);
 }
 
 
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index a3fc6acaaa..5e155b77cc 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -431,6 +431,9 @@ struct _qemuDomainNetworkPrivate {
 GSList *tapfds; /* qemuFDPassDirect */
 GSList *vhostfds; /* qemuFDPassDirect */
 qemuFDPass *vdpafd;
+
+void *libbpfRSSObject;
+GSList *ebpfrssfds; /* qemuFDPassDirect eBPF RSS fds f

[RFC PATCH 3/4] qemu_interface: Added routine for loading the eBPF objects.

2023-10-08 Thread Andrew Melnychenko
Also, added dependencies for libbpf with bpf option.

Signed-off-by: Andrew Melnychenko 
---
 meson.build   |  6 ++
 meson_options.txt |  1 +
 src/qemu/meson.build  |  1 +
 src/qemu/qemu_interface.c | 42 +++
 src/qemu/qemu_interface.h |  4 
 5 files changed, 54 insertions(+)

diff --git a/meson.build b/meson.build
index de23fbda1e..b68e916246 100644
--- a/meson.build
+++ b/meson.build
@@ -1381,6 +1381,11 @@ if yajl_dep.found()
   conf.set('WITH_YAJL', 1)
 endif
 
+bpf_version = '1.1.0'
+bpf_dep = dependency('libbpf', version: '>=' + bpf_version, required: 
get_option('bpf'))
+if bpf_dep.found()
+conf.set('WITH_BPF', 1)
+endif
 
 # generic build dependencies checks
 
@@ -2269,6 +2274,7 @@ libs_summary = {
   'udev': udev_dep.found(),
   'xdr': xdr_dep.found(),
   'yajl': yajl_dep.found(),
+  'bpf': bpf_dep.found(),
 }
 summary(libs_summary, section: 'Libraries', bool_yn: true)
 
diff --git a/meson_options.txt b/meson_options.txt
index 7c428a9eb0..092b2efe06 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -44,6 +44,7 @@ option('udev', type: 'feature', value: 'auto', description: 
'udev support')
 option('wireshark_dissector', type: 'feature', value: 'auto', description: 
'wireshark support')
 option('wireshark_plugindir', type: 'string', value: '', description: 
'wireshark plugins directory for use when installing wireshark plugin')
 option('yajl', type: 'feature', value: 'auto', description: 'yajl support')
+option('bpf', type: 'feature', value: 'auto', description: 'qemu libbpf 
support')
 
 
 # build driver options
diff --git a/src/qemu/meson.build b/src/qemu/meson.build
index 64c62e584f..afd9133ae0 100644
--- a/src/qemu/meson.build
+++ b/src/qemu/meson.build
@@ -105,6 +105,7 @@ if conf.has('WITH_QEMU')
   selinux_dep,
   src_dep,
   xdr_dep,
+  bpf_dep,
 ],
 include_directories: [
   conf_inc_dir,
diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
index 8856bb95a8..a3a43a43c5 100644
--- a/src/qemu/qemu_interface.c
+++ b/src/qemu/qemu_interface.c
@@ -36,6 +36,7 @@
 
 #include 
 #include 
+#include 
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -763,3 +764,44 @@ qemuInterfaceOpenVhostNet(virDomainObj *vm,
 virDomainAuditNetDevice(vm->def, net, vhostnet_path, vhostfdSize);
 return 0;
 }
+
+
+int qemuInterfaceLoadEbpf(const void *ebpfObject, size_t ebpfSize, void 
**retLibbpfObj, int *fds, int nfds) {
+int err = 0;
+int i = 0;
+
+struct bpf_object *obj = bpf_object__open_mem(ebpfObject, ebpfSize, NULL);
+err = libbpf_get_error(obj);
+if(err) {
+return -1;
+}
+
+struct bpf_program *prog;
+struct bpf_map *map;
+
+err = bpf_object__load(obj);
+if (err) {
+return -1;
+}
+
+bpf_object__for_each_program(prog, obj) {
+fds[i] = bpf_program__fd(prog);
+++i;
+}
+
+bpf_object__for_each_map(map, obj) {
+fds[i] = bpf_map__fd(map);
+++i;
+}
+
+*retLibbpfObj = obj;
+
+return i;
+}
+
+
+void qemuInterfaceCloseEbpf(void *libbpfObj)
+{
+if(libbpfObj)
+bpf_object__close(libbpfObj);
+}
diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h
index 6eed3e6bd7..dbc1fd625c 100644
--- a/src/qemu/qemu_interface.h
+++ b/src/qemu/qemu_interface.h
@@ -55,3 +55,7 @@ int qemuInterfaceOpenVhostNet(virDomainObj *def,
 
 int qemuInterfacePrepareSlirp(virQEMUDriver *driver,
   virDomainNetDef *net);
+
+int qemuInterfaceLoadEbpf(const void *ebpfObject, size_t ebpfSize, void 
**retLibbpfObj, int *fds, int nfds);
+
+void qemuInterfaceCloseEbpf(void *libbpfObj);
-- 
2.42.0



[RFC PATCH 2/4] qemu_capabilities: Added new capability ebpf_rss_fds for QEMU.

2023-10-08 Thread Andrew Melnychenko
Also, added logic for retrieving eBPF objects from QEMU.
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 
---
 src/qemu/qemu_capabilities.c | 181 +++
 src/qemu/qemu_capabilities.h |   4 +
 2 files changed, 185 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 3a1bfbf74d..d9b5d6fb22 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -698,6 +698,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
   /* 450 */
   "run-with.async-teardown", /* QEMU_CAPS_RUN_WITH_ASYNC_TEARDOWN 
*/
   "virtio-blk-vhost-vdpa", /* 
QEMU_CAPS_DEVICE_VIRTIO_BLK_VHOST_VDPA */
+  "virtio-net.ebpf_rss_fds", /* QEMU_CAPS_VIRTIO_NET_EBPF_RSS_FDS 
*/
 );
 
 
@@ -789,6 +790,9 @@ struct _virQEMUCaps {
 virQEMUCapsAccel kvm;
 virQEMUCapsAccel hvf;
 virQEMUCapsAccel tcg;
+
+/* Hash of ebpf objects virQEMUEbpfOBjectData */
+GHashTable *ebpfObjects;
 };
 
 struct virQEMUCapsSearchData {
@@ -796,6 +800,18 @@ struct virQEMUCapsSearchData {
 const char *binaryFilter;
 };
 
+struct virQEMUEbpfOBjectData {
+void *ebpfData;
+size_t ebpfSize;
+};
+
+void virQEMUEbpfOBjectDataDestroy(gpointer data) {
+if (!data)
+return;
+struct virQEMUEbpfOBjectData *object = data;
+g_free(object->ebpfData);
+g_free(data);
+}
 
 static virClass *virQEMUCapsClass;
 static void virQEMUCapsDispose(void *obj);
@@ -836,6 +852,19 @@ const char *virQEMUCapsArchToString(virArch arch)
 }
 
 
+const void *
+virQEMUCapsGetEbpf(virQEMUCaps *qemuCaps, const char *id, size_t *size)
+{
+struct virQEMUEbpfOBjectData *object = 
virHashLookup(qemuCaps->ebpfObjects, id);
+
+if (!object)
+return NULL;
+
+*size = object->ebpfSize;
+return object->ebpfData;
+}
+
+
 /* Checks whether a domain with @guest arch can run natively on @host.
  */
 bool
@@ -1426,6 +1455,7 @@ static struct virQEMUCapsDevicePropsFlags 
virQEMUCapsDevicePropsVirtioBlk[] = {
 static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsVirtioNet[] = {
 { "acpi-index", QEMU_CAPS_ACPI_INDEX, NULL },
 { "rss", QEMU_CAPS_VIRTIO_NET_RSS, NULL },
+{ "ebpf_rss_fds", QEMU_CAPS_VIRTIO_NET_EBPF_RSS_FDS, NULL },
 };
 
 static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsPCIeRootPort[] 
= {
@@ -1804,6 +1834,8 @@ virQEMUCapsNew(void)
 qemuCaps->invalidation = true;
 qemuCaps->flags = virBitmapNew(QEMU_CAPS_LAST);
 
+qemuCaps->ebpfObjects = virHashNew(virQEMUEbpfOBjectDataDestroy);
+
 return qemuCaps;
 }
 
@@ -1984,6 +2016,8 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps)
 ret->hypervCapabilities = g_memdup(qemuCaps->hypervCapabilities,
sizeof(virDomainCapsFeatureHyperv));
 
+ret->ebpfObjects = g_hash_table_ref(qemuCaps->ebpfObjects);
+
 return g_steal_pointer(&ret);
 }
 
@@ -2026,6 +2060,8 @@ void virQEMUCapsDispose(void *obj)
 
 g_free(qemuCaps->hypervCapabilities);
 
+g_hash_table_unref(qemuCaps->ebpfObjects);
+
 virQEMUCapsAccelClear(&qemuCaps->kvm);
 virQEMUCapsAccelClear(&qemuCaps->hvf);
 virQEMUCapsAccelClear(&qemuCaps->tcg);
@@ -4541,6 +4577,46 @@ virQEMUCapsValidateArch(virQEMUCaps *qemuCaps, 
xmlXPathContextPtr ctxt)
 }
 
 
+static int
+virQEMUCapsParseEbpfObjects(virQEMUCaps *qemuCaps, xmlXPathContextPtr ctxt)
+{
+g_autofree xmlNodePtr *nodes = NULL;
+size_t i;
+int n;
+
+if ((n = virXPathNodeSet("./ebpf", ctxt, &nodes)) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("failed to parse qemu cached eBPF object"));
+return -1;
+}
+
+for (i = 0; i < n; i++) {
+g_autofree char *id = NULL;
+g_autofree char *ebpf = NULL;
+struct virQEMUEbpfOBjectData *ebpfObject = NULL;
+
+if (!(id = virXMLPropString(nodes[i], "id"))) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("missing eBPF object ID in QEMU capabilities 
cache"));
+return -1;
+}
+
+if (!(ebpf = virXMLNodeContentString(nodes[i]))) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s %s",
+   _("can't get eBPF base64 data from cache for ID: 
"), id);
+return -1;
+}
+
+ebpfObject = g_malloc(sizeof(*ebpfObject));
+ebpfObject->ebpfData = g_base64_decode(ebpf, &ebpfObject->ebpfSize);
+
+virHashAddEntry(qemuCaps->ebpfObjects, id, ebpfObject);
+}
+
+return 0;
+}
+
+
 /*
  * Parsing a doc that looks like
  *
@@ -4688,6 +4764,8 @@ virQEMUCapsLoadCache(virArch hostArch,
 if (skipInvalidation)
 qemuCaps->invalidation = false;
 
+virQEMUCapsParseEbpfObjects(qemuCaps, ctxt);
+
 return 0;
 }
 
@@ -4925,6 +5003,32 @@ virQEMUCapsFormatHypervCapabilities(virQEMUCaps 
*qemuCaps,
 }
 

[RFC PATCH 0/4] Added virtio-net RSS with eBPF support.

2023-10-08 Thread Andrew Melnychenko
This series of rfc patches adds support for loading the RSS eBPF program and 
passing it to the QEMU.
Comments and suggestions would be useful.

QEMU with vhost may work with RSS through eBPF. To load eBPF,
the capabilities required that Libvirt may provide.
eBPF program and maps may be unique for particular QEMU and
Libvirt retrieves eBPF through qapi.
For now, there is only "RSS" eBPF object in QEMU, in the future,
there may be another one(g.e. network filters).
That's why in Libvirt added logic to load and store any
eBPF object that QEMU provides using qapi schema.

For virtio-net RSS, the document has not changed.
```
 
  
  
 
```

Simplified routine for RSS:
 * Libvirt retrieves eBPF "RSS" and load it.
 * Libvirt passes file descriptors to virtio-net with property "ebpf_rss_fds" 
("rss" property should be "on" too).
 * if fds was provided - QEMU using eBPF RSS implementation.
 * if fds was not provided - QEMU tries to load eBPF RSS in own context and use 
it.
 * if eBPF RSS was not loaded - QEMU uses "in-qemu" RSS(vhost not supported).

 meson.build  |   6 ++
 meson_options.txt|   1 +
 src/qemu/meson.build |   1 +
 src/qemu/qemu_capabilities.c | 181 +++
 src/qemu/qemu_capabilities.h |   4 +
 src/qemu/qemu_command.c  |  53 ++
 src/qemu/qemu_domain.c   |   4 +
 src/qemu/qemu_domain.h   |   3 +
 src/qemu/qemu_interface.c|  42 
 src/qemu/qemu_interface.h|   4 +
 src/qemu/qemu_monitor.c  |  23 +
 src/qemu/qemu_monitor.h  |   3 +
 src/qemu/qemu_monitor_json.c |  21 
 src/qemu/qemu_monitor_json.h |   3 +
 14 files changed, 349 insertions(+)

-- 
2.42.0



Re: [PATCH] docs: Fix typos

2023-10-08 Thread Ján Tomko

On a Monday in 2023, Han Han wrote:

Signed-off-by: Han Han 
---
docs/formatdomain.rst   | 2 +-
docs/kbase/kvm-realtime.rst | 2 +-
docs/manpages/virsh.rst | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)



Reviewed-by: Ján Tomko 

and pushed.

Jano


signature.asc
Description: PGP signature


[PATCH] docs: Fix typos

2023-10-08 Thread Han Han
Signed-off-by: Han Han 
---
 docs/formatdomain.rst   | 2 +-
 docs/kbase/kvm-realtime.rst | 2 +-
 docs/manpages/virsh.rst | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index af62fcd820..03735e4593 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -2179,7 +2179,7 @@ are:
Enable QEMU vmcoreinfo device to let the guest kernel save debug details.
:since:`Since 4.4.0` (QEMU only)
 ``htm``
-   Configure HTM (Hardware Transational Memory) availability for pSeries 
guests.
+   Configure HTM (Hardware Transactional Memory) availability for pSeries 
guests.
Possible values for the ``state`` attribute are ``on`` and ``off``. If the
attribute is not defined, the hypervisor default will be used. :since:`Since
4.6.0` (QEMU/KVM only)
diff --git a/docs/kbase/kvm-realtime.rst b/docs/kbase/kvm-realtime.rst
index 87ab314bcb..c829eac120 100644
--- a/docs/kbase/kvm-realtime.rst
+++ b/docs/kbase/kvm-realtime.rst
@@ -103,7 +103,7 @@ Be aware that CPU ID numbers are not always allocated 
sequentially as shown
 here. It is not unusual to see IDs interleaved between sockets on the two NUMA
 nodes, such that ``0-3,8-11`` are on the first node and ``4-7,12-15`` are on
 the second node.  Carefully check the ``virsh capabilities`` output to 
determine
-the CPU ID numbers when configiring both ``isolcpus`` and the guest ``cpuset``
+the CPU ID numbers when configuring both ``isolcpus`` and the guest ``cpuset``
 values.
 
 Guest configuration
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index 4ae3bb4d93..c425974912 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -5267,7 +5267,7 @@ dom-fd-associate
 
 Associate one or more fds described via *--pass-fds* argument to *domain* as
 *--name*. The lifetime of the passed fd group is the same as the connection, 
thus
-exitting virsh un-registers them afterwards.
+exiting virsh un-registers them afterwards.
 
 By default security labels are applied if needed but they are not restored 
after
 use to avoid keeping them open unnecessarily. Best-effort security label 
restore
-- 
2.41.0