We are currently parsing only rx_max_coalesced_frames because that's
the only value that makes sense for us. The tun device just added
support for this one and the others are only supported by hardware
devices which we don't need to worry about as the only way we'd pass
those to the domain is using <hostdev/> or <interface type='hostdev'/>.
And in those cases the guest can modify the settings itself.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
---
docs/formatdomain.html.in | 24 ++++
docs/schemas/domaincommon.rng | 131 +++++++++++++++++++++
src/conf/domain_conf.c | 80 +++++++++++++
src/conf/domain_conf.h | 2 +
src/qemu/qemu_domain.c | 31 +++++
.../qemuxml2argvdata/qemuxml2argv-net-coalesce.xml | 68 +++++++++++
.../qemuxml2xmlout-net-coalesce.xml | 71 +++++++++++
tests/qemuxml2xmltest.c | 1 +
8 files changed, 408 insertions(+)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index b1e38f00e423..ea64b7fd1193 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5405,6 +5405,30 @@ qemu-kvm -net nic,model=? /dev/null
<span class="since">Since 3.1.0</span>
</p>
+ <h5><a name="coalesce">Coalesce settings</a></h5>
+<pre>
+...
+<devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <b><coalesce>
+ <rx_max_coalesced_frames>5</rx_max_coalesced_frames>
+ </coalesce></b>
+ </interface>
+</devices>
+...</pre>
+
+ <p>
+ This element provides means of setting coalesce settings for some
+ interface devices (currently only type <code>network</code>
+ and <code>bridge</code>. Currently there is just one sub-element
+ named <code>rx_max_coalesced_frames</code> which accepts a non-negative
+ integer that specifies the maximum number of packets that will be received
+ before an interrupt.
+ <span class="since">Since 3.3.0</span>
+ </p>
+
<h5><a name="ipconfig">IP configuration</a></h5>
<pre>
...
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index edc225fe50c5..eb4b0f7437ba 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2509,6 +2509,9 @@
<ref name="mtu"/>
</optional>
<optional>
+ <ref name="coalesce"/>
+ </optional>
+ <optional>
<element name="target">
<attribute name="dev">
<ref name="deviceName"/>
@@ -5743,4 +5746,132 @@
</choice>
</attribute>
</define>
+
+ <define name="coalesce">
+ <element name="coalesce">
+ <interleave>
+ <optional>
+ <element name="rx">
+ <optional>
+ <element name="frames">
+ <optional>
+ <attribute name="max">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <!--
+ This is how we'd add more Rx-related settings for
+ frames, like irq, high, and low
+
+ <optional>
+ <attribute name="irq">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="high">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="low">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+
+ -->
+ </element>
+ </optional>
+ <!--
+ This is how we'd add more Rx-related settings, like
+ usecs
+
+ <optional>
+ <element name="usecs">
+ <optional>
+ <attribute name="max">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="irq">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="high">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="low">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ </element>
+ </optional>
+ -->
+ </element>
+ </optional>
+ <!--
+ This is how you would add more coalesce settings, like
+ Tx-related ones
+
+ <optional>
+ <element name="tx">
+ <optional>
+ <element name="frames">
+ <optional>
+ <attribute name="max">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="irq">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="high">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="low">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ </element>
+ </optional>
+ <optional>
+ <element name="usecs">
+ <optional>
+ <attribute name="max">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="irq">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="high">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="low">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ </element>
+ </optional>
+ </element>
+ </optional>
+ -->
+ </interleave>
+ </element>
+ </define>
+
</grammar>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 705deb39a1bf..cbeebdc56880 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6772,6 +6772,77 @@ virDomainNetIPInfoParseXML(const char *source,
return ret;
}
+
+static virNetDevCoalescePtr
+virDomainNetDefCoalesceParseXML(xmlNodePtr node,
+ xmlXPathContextPtr ctxt)
+{
+ virNetDevCoalescePtr ret = NULL;
+ xmlNodePtr save = NULL;
+ char *str = NULL;
+ unsigned long long tmp = 0;
+
+ save = ctxt->node;
+ ctxt->node = node;
+
+ str = virXPathString("string(./rx/frames/@max)", ctxt);
+ if (!str)
+ goto cleanup;
+
+ if (!ret && VIR_ALLOC(ret) < 0)
+ goto cleanup;
+
+ if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("cannot parse value '%s' for coalesce parameter"),
+ str);
+ VIR_FREE(str);
+ goto error;
+ }
+ VIR_FREE(str);
+
+ if (tmp > UINT32_MAX) {
+ virReportError(VIR_ERR_OVERFLOW,
+ _("value '%llu' is too big for coalesce "
+ "parameter, maximum is '%lu'"),
+ tmp, (unsigned long) UINT32_MAX);
+ goto error;
+ }
+ ret->rx_max_coalesced_frames = tmp;
+
+ cleanup:
+ ctxt->node = save;
+ return ret;
+
+ error:
+ VIR_FREE(ret);
+ goto cleanup;
+}
+
+static void
+virDomainNetDefCoalesceFormatXML(virBufferPtr buf,
+ virNetDevCoalescePtr coalesce)
+{
+ if (!coalesce || !coalesce->rx_max_coalesced_frames)
+ return;
+
+ virBufferAddLit(buf, "<coalesce>\n");
+ virBufferAdjustIndent(buf, 2);
+
+ virBufferAddLit(buf, "<rx>\n");
+ virBufferAdjustIndent(buf, 2);
+
+ virBufferAsprintf(buf, "<frames max='%u'/>\n",
+ coalesce->rx_max_coalesced_frames);
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</rx>\n");
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</coalesce>\n");
+}
+
+
static int
virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
xmlXPathContextPtr ctxt,
@@ -10255,6 +10326,13 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
goto error;
}
+ node = virXPathNode("./coalesce", ctxt);
+ if (node) {
+ def->coalesce = virDomainNetDefCoalesceParseXML(node, ctxt);
+ if (!def->coalesce)
+ goto error;
+ }
+
cleanup:
ctxt->node = oldnode;
VIR_FREE(macaddr);
@@ -22147,6 +22225,8 @@ virDomainNetDefFormat(virBufferPtr buf,
if (def->mtu)
virBufferAsprintf(buf, "<mtu size='%u'/>\n", def->mtu);
+ virDomainNetDefCoalesceFormatXML(buf, def->coalesce);
+
if (virDomainDeviceInfoFormat(buf, &def->info,
flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT
| VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM) < 0)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 7da554f8ee28..3b6b17451618 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -41,6 +41,7 @@
# include "numa_conf.h"
# include "virnetdevmacvlan.h"
# include "virsysinfo.h"
+# include "virnetdev.h"
# include "virnetdevip.h"
# include "virnetdevvportprofile.h"
# include "virnetdevbandwidth.h"
@@ -1036,6 +1037,7 @@ struct _virDomainNetDef {
int trustGuestRxFilters; /* enum virTristateBool */
int linkstate;
unsigned int mtu;
+ virNetDevCoalescePtr coalesce;
};
/* Used for prefix of ifname of any network name generated dynamically
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index b3e1573c690d..d906fe6fdd4f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2984,6 +2984,30 @@ qemuDomainDefValidate(const virDomainDef *def,
}
+static bool
+qemuDomainNetSupportsCoalesce(virDomainNetType type)
+{
+ switch (type) {
+ case VIR_DOMAIN_NET_TYPE_NETWORK:
+ case VIR_DOMAIN_NET_TYPE_BRIDGE:
+ return true;
+ case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+ case VIR_DOMAIN_NET_TYPE_ETHERNET:
+ case VIR_DOMAIN_NET_TYPE_DIRECT:
+ case VIR_DOMAIN_NET_TYPE_HOSTDEV:
+ case VIR_DOMAIN_NET_TYPE_USER:
+ case VIR_DOMAIN_NET_TYPE_SERVER:
+ case VIR_DOMAIN_NET_TYPE_CLIENT:
+ case VIR_DOMAIN_NET_TYPE_MCAST:
+ case VIR_DOMAIN_NET_TYPE_INTERNAL:
+ case VIR_DOMAIN_NET_TYPE_UDP:
+ case VIR_DOMAIN_NET_TYPE_LAST:
+ break;
+ }
+ return false;
+}
+
+
static int
qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
const virDomainDef *def ATTRIBUTE_UNUSED,
@@ -3018,6 +3042,13 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
virDomainNetTypeToString(net->type));
goto cleanup;
}
+
+ if (net->coalesce && !qemuDomainNetSupportsCoalesce(net->type)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("coalesce settings on interface type %s are not supported"),
+ virDomainNetTypeToString(net->type));
+ goto cleanup;
+ }
}
ret = 0;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
new file mode 100644
index 000000000000..b510324427d3
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
@@ -0,0 +1,68 @@
+<domain type='qemu'>
+ <name>test</name>
+ <uuid>15d091de-0181-456b-9554-e4382dc1f1ab</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <currentMemory unit='KiB'>1048576</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-0.13'>hvm</type>
+ <boot dev='cdrom'/>
+ <boot dev='hd'/>
+ <bootmenu enable='yes'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2' event_idx='on'/>
+ <source file='/var/lib/libvirt/images/f14.img'/>
+ <target dev='vda' bus='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
+ <target dev='hdc' bus='ide'/>
+ <readonly/>
+ <address type='drive' controller='0' bus='1' target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='virtio-serial' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
+ </controller>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <interface type='network'>
+ <source network='default'/>
+ <mac address='52:54:00:e5:48:58'/>
+ <model type='virtio'/>
+ <coalesce>
+ <rx>
+ <frames max='7'/>
+ </rx>
+ </coalesce>
+ </interface>
+ <interface type='network'>
+ <source network='default'/>
+ <mac address='52:54:00:e5:48:59'/>
+ <model type='virtio'/>
+ <coalesce>
+ <rx>
+ <frames max='0'/>
+ </rx>
+ </coalesce>
+ </interface>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0'/>
+ </console>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
new file mode 100644
index 000000000000..fd5fdbece528
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
@@ -0,0 +1,71 @@
+<domain type='qemu'>
+ <name>test</name>
+ <uuid>15d091de-0181-456b-9554-e4382dc1f1ab</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <currentMemory unit='KiB'>1048576</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-0.13'>hvm</type>
+ <boot dev='cdrom'/>
+ <boot dev='hd'/>
+ <bootmenu enable='yes'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2' event_idx='on'/>
+ <source file='/var/lib/libvirt/images/f14.img'/>
+ <target dev='vda' bus='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
+ <target dev='hdc' bus='ide'/>
+ <readonly/>
+ <address type='drive' controller='0' bus='1' target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='virtio-serial' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <interface type='network'>
+ <mac address='52:54:00:e5:48:58'/>
+ <source network='default'/>
+ <model type='virtio'/>
+ <coalesce>
+ <rx>
+ <frames max='7'/>
+ </rx>
+ </coalesce>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </interface>
+ <interface type='network'>
+ <mac address='52:54:00:e5:48:59'/>
+ <source network='default'/>
+ <model type='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
+ </interface>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0'/>
+ </console>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index e4b510fd31ee..2dccde746ef1 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -528,6 +528,7 @@ mymain(void)
DO_TEST("net-bandwidth", NONE);
DO_TEST("net-bandwidth2", NONE);
DO_TEST("net-mtu", NONE);
+ DO_TEST("net-coalesce", NONE);
DO_TEST("serial-vc", NONE);
DO_TEST("serial-pty", NONE);
--
2.12.2
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 04/20/2017 02:21 PM, Martin Kletzander wrote:
> We are currently parsing only rx_max_coalesced_frames because that's
> the only value that makes sense for us. The tun device just added
> support for this one and the others are only supported by hardware
> devices which we don't need to worry about as the only way we'd pass
> those to the domain is using <hostdev/> or <interface type='hostdev'/>.
> And in those cases the guest can modify the settings itself.
>
> Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
> ---
> docs/formatdomain.html.in | 24 ++++
> docs/schemas/domaincommon.rng | 131 +++++++++++++++++++++
> src/conf/domain_conf.c | 80 +++++++++++++
> src/conf/domain_conf.h | 2 +
> src/qemu/qemu_domain.c | 31 +++++
> .../qemuxml2argvdata/qemuxml2argv-net-coalesce.xml | 68 +++++++++++
> .../qemuxml2xmlout-net-coalesce.xml | 71 +++++++++++
> tests/qemuxml2xmltest.c | 1 +
> 8 files changed, 408 insertions(+)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
> create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index b1e38f00e423..ea64b7fd1193 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -5405,6 +5405,30 @@ qemu-kvm -net nic,model=? /dev/null
> <span class="since">Since 3.1.0</span>
> </p>
>
> + <h5><a name="coalesce">Coalesce settings</a></h5>
> +<pre>
> +...
> +<devices>
> + <interface type='network'>
> + <source network='default'/>
> + <target dev='vnet0'/>
> + <b><coalesce>
> + <rx_max_coalesced_frames>5</rx_max_coalesced_frames>
> + </coalesce></b>
> + </interface>
> +</devices>
> +...</pre>
> +
> + <p>
> + This element provides means of setting coalesce settings for some
> + interface devices (currently only type <code>network</code>
> + and <code>bridge</code>. Currently there is just one sub-element
> + named <code>rx_max_coalesced_frames</code> which accepts a non-negative
> + integer that specifies the maximum number of packets that will be received
> + before an interrupt.
> + <span class="since">Since 3.3.0</span>
> + </p>
This does not correspond to the schema or tests introduced later in the
patch.
> +
> <h5><a name="ipconfig">IP configuration</a></h5>
> <pre>
> ...
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index edc225fe50c5..eb4b0f7437ba 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -2509,6 +2509,9 @@
> <ref name="mtu"/>
> </optional>
> <optional>
> + <ref name="coalesce"/>
> + </optional>
> + <optional>
> <element name="target">
> <attribute name="dev">
> <ref name="deviceName"/>
> @@ -5743,4 +5746,132 @@
> </choice>
> </attribute>
> </define>
> +
> + <define name="coalesce">
> + <element name="coalesce">
> + <interleave>
> + <optional>
> + <element name="rx">
> + <optional>
> + <element name="frames">
> + <optional>
> + <attribute name="max">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <!--
> + This is how we'd add more Rx-related settings for
> + frames, like irq, high, and low
> +
> + <optional>
> + <attribute name="irq">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="high">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="low">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> +
> + -->
> + </element>
> + </optional>
> + <!--
> + This is how we'd add more Rx-related settings, like
> + usecs
> +
> + <optional>
> + <element name="usecs">
> + <optional>
> + <attribute name="max">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="irq">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="high">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="low">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + </element>
> + </optional>
> + -->
> + </element>
> + </optional>
> + <!--
> + This is how you would add more coalesce settings, like
> + Tx-related ones
> +
> + <optional>
> + <element name="tx">
> + <optional>
> + <element name="frames">
> + <optional>
> + <attribute name="max">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="irq">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="high">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="low">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + </element>
> + </optional>
> + <optional>
> + <element name="usecs">
> + <optional>
> + <attribute name="max">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="irq">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="high">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="low">
> + <ref name="unsignedInt"/>
> + </attribute>
> + </optional>
> + </element>
> + </optional>
> + </element>
> + </optional>
> + -->
> + </interleave>
> + </element>
> + </define>
> +
> </grammar>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 705deb39a1bf..cbeebdc56880 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -6772,6 +6772,77 @@ virDomainNetIPInfoParseXML(const char *source,
> return ret;
> }
>
> +
> +static virNetDevCoalescePtr
> +virDomainNetDefCoalesceParseXML(xmlNodePtr node,
> + xmlXPathContextPtr ctxt)
> +{
> + virNetDevCoalescePtr ret = NULL;
> + xmlNodePtr save = NULL;
> + char *str = NULL;
> + unsigned long long tmp = 0;
> +
> + save = ctxt->node;
> + ctxt->node = node;
> +
> + str = virXPathString("string(./rx/frames/@max)", ctxt);
> + if (!str)
> + goto cleanup;
> +
> + if (!ret && VIR_ALLOC(ret) < 0)
> + goto cleanup;
> +
> + if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
> + virReportError(VIR_ERR_XML_DETAIL,
> + _("cannot parse value '%s' for coalesce parameter"),
> + str);
> + VIR_FREE(str);
> + goto error;
> + }
> + VIR_FREE(str);
> +
> + if (tmp > UINT32_MAX) {
> + virReportError(VIR_ERR_OVERFLOW,
> + _("value '%llu' is too big for coalesce "
> + "parameter, maximum is '%lu'"),
> + tmp, (unsigned long) UINT32_MAX);
> + goto error;
> + }
> + ret->rx_max_coalesced_frames = tmp;
I wonder if we can turn this into a macro (despite some of us hating
them) because potentially we'll parse all the 32 coalesce attributes (or
how many there are). But for now, this is okay as is.
> +
> + cleanup:
> + ctxt->node = save;
> + return ret;
> +
> + error:
> + VIR_FREE(ret);
> + goto cleanup;
> +}
Michal
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Fri, Apr 21, 2017 at 11:19:36AM +0200, Michal Privoznik wrote:
>On 04/20/2017 02:21 PM, Martin Kletzander wrote:
>> We are currently parsing only rx_max_coalesced_frames because that's
>> the only value that makes sense for us. The tun device just added
>> support for this one and the others are only supported by hardware
>> devices which we don't need to worry about as the only way we'd pass
>> those to the domain is using <hostdev/> or <interface type='hostdev'/>.
>> And in those cases the guest can modify the settings itself.
>>
>> Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
>> ---
>> docs/formatdomain.html.in | 24 ++++
>> docs/schemas/domaincommon.rng | 131 +++++++++++++++++++++
>> src/conf/domain_conf.c | 80 +++++++++++++
>> src/conf/domain_conf.h | 2 +
>> src/qemu/qemu_domain.c | 31 +++++
>> .../qemuxml2argvdata/qemuxml2argv-net-coalesce.xml | 68 +++++++++++
>> .../qemuxml2xmlout-net-coalesce.xml | 71 +++++++++++
>> tests/qemuxml2xmltest.c | 1 +
>> 8 files changed, 408 insertions(+)
>> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
>> create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index b1e38f00e423..ea64b7fd1193 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -5405,6 +5405,30 @@ qemu-kvm -net nic,model=? /dev/null
>> <span class="since">Since 3.1.0</span>
>> </p>
>>
>> + <h5><a name="coalesce">Coalesce settings</a></h5>
>> +<pre>
>> +...
>> +<devices>
>> + <interface type='network'>
>> + <source network='default'/>
>> + <target dev='vnet0'/>
>> + <b><coalesce>
>> + <rx_max_coalesced_frames>5</rx_max_coalesced_frames>
>> + </coalesce></b>
>> + </interface>
>> +</devices>
>> +...</pre>
>> +
>> + <p>
>> + This element provides means of setting coalesce settings for some
>> + interface devices (currently only type <code>network</code>
>> + and <code>bridge</code>. Currently there is just one sub-element
>> + named <code>rx_max_coalesced_frames</code> which accepts a non-negative
>> + integer that specifies the maximum number of packets that will be received
>> + before an interrupt.
>> + <span class="since">Since 3.3.0</span>
>> + </p>
>
>This does not correspond to the schema or tests introduced later in the
>patch.
>
Good catch, thanks for noticing.
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 705deb39a1bf..cbeebdc56880 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -6772,6 +6772,77 @@ virDomainNetIPInfoParseXML(const char *source,
>> return ret;
>> }
>>
>> +
>> +static virNetDevCoalescePtr
>> +virDomainNetDefCoalesceParseXML(xmlNodePtr node,
>> + xmlXPathContextPtr ctxt)
>> +{
>> + virNetDevCoalescePtr ret = NULL;
>> + xmlNodePtr save = NULL;
>> + char *str = NULL;
>> + unsigned long long tmp = 0;
>> +
>> + save = ctxt->node;
>> + ctxt->node = node;
>> +
>> + str = virXPathString("string(./rx/frames/@max)", ctxt);
>> + if (!str)
>> + goto cleanup;
>> +
>> + if (!ret && VIR_ALLOC(ret) < 0)
>> + goto cleanup;
>> +
>> + if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
>> + virReportError(VIR_ERR_XML_DETAIL,
>> + _("cannot parse value '%s' for coalesce parameter"),
>> + str);
>> + VIR_FREE(str);
>> + goto error;
>> + }
>> + VIR_FREE(str);
>> +
>> + if (tmp > UINT32_MAX) {
>> + virReportError(VIR_ERR_OVERFLOW,
>> + _("value '%llu' is too big for coalesce "
>> + "parameter, maximum is '%lu'"),
>> + tmp, (unsigned long) UINT32_MAX);
>> + goto error;
>> + }
>> + ret->rx_max_coalesced_frames = tmp;
>
>I wonder if we can turn this into a macro (despite some of us hating
>them) because potentially we'll parse all the 32 coalesce attributes (or
>how many there are). But for now, this is okay as is.
>
I did that. Multiple times. GET_COAL(rx, frames, max) for example and
I tried various ways how to do that so it's nicely extensible. But
after a while I gave up because it would be used once and whatever.
Maybe nobody will ever want to add any other parameter...
>> +
>> + cleanup:
>> + ctxt->node = save;
>> + return ret;
>> +
>> + error:
>> + VIR_FREE(ret);
>> + goto cleanup;
>> +}
>
>Michal
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 04/20/2017 08:21 AM, Martin Kletzander wrote:
> We are currently parsing only rx_max_coalesced_frames because that's
> the only value that makes sense for us. The tun device just added
> support for this one and the others are only supported by hardware
> devices which we don't need to worry about as the only way we'd pass
> those to the domain is using <hostdev/> or <interface type='hostdev'/>.
> And in those cases the guest can modify the settings itself.
>
> Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
> ---
> docs/formatdomain.html.in | 24 ++++
> docs/schemas/domaincommon.rng | 131 +++++++++++++++++++++
> src/conf/domain_conf.c | 80 +++++++++++++
> src/conf/domain_conf.h | 2 +
> src/qemu/qemu_domain.c | 31 +++++
> .../qemuxml2argvdata/qemuxml2argv-net-coalesce.xml | 68 +++++++++++
> .../qemuxml2xmlout-net-coalesce.xml | 71 +++++++++++
> tests/qemuxml2xmltest.c | 1 +
> 8 files changed, 408 insertions(+)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
> create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
>
Coverity found a resource leak...
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 705deb39a1bf..cbeebdc56880 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -6772,6 +6772,77 @@ virDomainNetIPInfoParseXML(const char *source,
> return ret;
> }
>
> +
> +static virNetDevCoalescePtr
> +virDomainNetDefCoalesceParseXML(xmlNodePtr node,
> + xmlXPathContextPtr ctxt)
> +{
> + virNetDevCoalescePtr ret = NULL;
> + xmlNodePtr save = NULL;
> + char *str = NULL;
> + unsigned long long tmp = 0;
> +
> + save = ctxt->node;
> + ctxt->node = node;
> +
> + str = virXPathString("string(./rx/frames/@max)", ctxt);
> + if (!str)
> + goto cleanup;
> +
> + if (!ret && VIR_ALLOC(ret) < 0)
> + goto cleanup;
Right here - str isn't free'd in cleanup (or error), but could be...
> +
> + if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
> + virReportError(VIR_ERR_XML_DETAIL,
> + _("cannot parse value '%s' for coalesce parameter"),
> + str);
> + VIR_FREE(str);
> + goto error;
> + }
> + VIR_FREE(str);
> +
> + if (tmp > UINT32_MAX) {
> + virReportError(VIR_ERR_OVERFLOW,
> + _("value '%llu' is too big for coalesce "
> + "parameter, maximum is '%lu'"),
> + tmp, (unsigned long) UINT32_MAX);
> + goto error;
> + }
> + ret->rx_max_coalesced_frames = tmp;
> +
> + cleanup:
> + ctxt->node = save;
> + return ret;
> +
> + error:
> + VIR_FREE(ret);
> + goto cleanup;
> +}
> +
...
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Sat, Apr 22, 2017 at 07:30:05AM -0400, John Ferlan wrote:
>
>
>On 04/20/2017 08:21 AM, Martin Kletzander wrote:
>> We are currently parsing only rx_max_coalesced_frames because that's
>> the only value that makes sense for us. The tun device just added
>> support for this one and the others are only supported by hardware
>> devices which we don't need to worry about as the only way we'd pass
>> those to the domain is using <hostdev/> or <interface type='hostdev'/>.
>> And in those cases the guest can modify the settings itself.
>>
>> Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
>> ---
>> docs/formatdomain.html.in | 24 ++++
>> docs/schemas/domaincommon.rng | 131 +++++++++++++++++++++
>> src/conf/domain_conf.c | 80 +++++++++++++
>> src/conf/domain_conf.h | 2 +
>> src/qemu/qemu_domain.c | 31 +++++
>> .../qemuxml2argvdata/qemuxml2argv-net-coalesce.xml | 68 +++++++++++
>> .../qemuxml2xmlout-net-coalesce.xml | 71 +++++++++++
>> tests/qemuxml2xmltest.c | 1 +
>> 8 files changed, 408 insertions(+)
>> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-coalesce.xml
>> create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-coalesce.xml
>>
>
>Coverity found a resource leak...
>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 705deb39a1bf..cbeebdc56880 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -6772,6 +6772,77 @@ virDomainNetIPInfoParseXML(const char *source,
>> return ret;
>> }
>>
>> +
>> +static virNetDevCoalescePtr
>> +virDomainNetDefCoalesceParseXML(xmlNodePtr node,
>> + xmlXPathContextPtr ctxt)
>> +{
>> + virNetDevCoalescePtr ret = NULL;
>> + xmlNodePtr save = NULL;
>> + char *str = NULL;
>> + unsigned long long tmp = 0;
>> +
>> + save = ctxt->node;
>> + ctxt->node = node;
>> +
>> + str = virXPathString("string(./rx/frames/@max)", ctxt);
>> + if (!str)
>> + goto cleanup;
>> +
>> + if (!ret && VIR_ALLOC(ret) < 0)
>> + goto cleanup;
>
>Right here - str isn't free'd in cleanup (or error), but could be...
>
Well, the code is pushed already, but I'll push a trivial patch in a
minute. Thanks for noticing.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2026 Red Hat, Inc.