mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
conf: add options for disabling segment offloading
Add options for tuning segment offloading: <driver> <host csum='off' gso='off' tso4='off' tso6='off' ecn='off' ufo='off'/> <guest csum='off' tso4='off' tso6='off' ecn='off' ufo='off'/> </driver> which control the respective host_ and guest_ properties of the virtio-net device.
This commit is contained in:
parent
8baf0f025f
commit
5b3536ae90
@ -3874,7 +3874,11 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<source network='default'/>
|
||||
<target dev='vnet1'/>
|
||||
<model type='virtio'/>
|
||||
<b><driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='5'/></b>
|
||||
<b><driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='5'>
|
||||
<host csum='off' gso='off' tso4='off' tso6='off' ecn='off' ufo='off'/>
|
||||
<guest csum='off' tso4='off' tso6='off' ecn='off' ufo='off'/>
|
||||
</driver>
|
||||
</b>
|
||||
</interface>
|
||||
</devices>
|
||||
...</pre>
|
||||
@ -3978,6 +3982,24 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
processor, resulting in much higher throughput.
|
||||
<span class="since">Since 1.0.6 (QEMU and KVM only)</span>
|
||||
</dd>
|
||||
<dt><code>host</code> offloading options</dt>
|
||||
<dd>
|
||||
The <code>csum</code>, <code>gso</code>, <code>tso4</code>,
|
||||
<code>tso6</code>, <code>ecn</code> and <code>ufo</code>
|
||||
attributes with possible values <code>on</code>
|
||||
and <code>off</code> can be used to turn off host offloading options.
|
||||
By default, the supported offloads are enabled by QEMU.
|
||||
<span class="since">Since 1.2.9 (QEMU only)</span>
|
||||
</dd>
|
||||
<dt><code>guest</code> offloading options</dt>
|
||||
<dd>
|
||||
The <code>csum</code>, <code>tso4</code>,
|
||||
<code>tso6</code>, <code>ecn</code> and <code>ufo</code>
|
||||
attributes with possible values <code>on</code>
|
||||
and <code>off</code> can be used to turn off guest offloading options.
|
||||
By default, the supported offloads are enabled by QEMU.
|
||||
<span class="since">Since 1.2.9 (QEMU only)</span>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h5><a name="elementsBackendOptions">Setting network backend-specific options</a></h5>
|
||||
|
@ -2366,7 +2366,71 @@
|
||||
</optional>
|
||||
</group>
|
||||
</choice>
|
||||
<empty/>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name='host'>
|
||||
<optional>
|
||||
<attribute name='csum'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='gso'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='tso4'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='tso6'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='ecn'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='ufo'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name='guest'>
|
||||
<optional>
|
||||
<attribute name='csum'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='tso4'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='tso6'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='ecn'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='ufo'>
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
|
@ -6919,6 +6919,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
char *ioeventfd = NULL;
|
||||
char *event_idx = NULL;
|
||||
char *queues = NULL;
|
||||
char *str = NULL;
|
||||
char *filter = NULL;
|
||||
char *internal = NULL;
|
||||
char *devaddr = NULL;
|
||||
@ -7414,6 +7415,115 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
}
|
||||
def->driver.virtio.queues = q;
|
||||
}
|
||||
if ((str = virXPathString("string(./driver/host/@csum)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown host csum mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.host.csum = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/host/@gso)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown host gso mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.host.gso = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/host/@tso4)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown host tso4 mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.host.tso4 = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/host/@tso6)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown host tso6 mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.host.tso6 = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/host/@ecn)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown host ecn mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.host.ecn = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/host/@ufo)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown host ufo mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.host.ufo = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/guest/@csum)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown guest csum mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.guest.csum = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/guest/@tso4)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown guest tso4 mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.guest.tso4 = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/guest/@tso6)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown guest tso6 mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.guest.tso6 = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/guest/@ecn)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown guest ecn mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.guest.ecn = val;
|
||||
}
|
||||
VIR_FREE(str);
|
||||
if ((str = virXPathString("string(./driver/guest/@ufo)", ctxt))) {
|
||||
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unknown guest ufo mode '%s'"),
|
||||
str);
|
||||
goto error;
|
||||
}
|
||||
def->driver.virtio.guest.ufo = val;
|
||||
}
|
||||
}
|
||||
|
||||
def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT;
|
||||
@ -7471,6 +7581,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
VIR_FREE(ioeventfd);
|
||||
VIR_FREE(event_idx);
|
||||
VIR_FREE(queues);
|
||||
VIR_FREE(str);
|
||||
VIR_FREE(filter);
|
||||
VIR_FREE(type);
|
||||
VIR_FREE(internal);
|
||||
@ -16511,6 +16622,80 @@ virDomainActualNetDefFormat(virBufferPtr buf,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virDomainVirtioNetGuestOptsFormat(char **outstr,
|
||||
virDomainNetDefPtr def)
|
||||
{
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
if (def->driver.virtio.guest.csum) {
|
||||
virBufferAsprintf(&buf, "csum='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.guest.csum));
|
||||
}
|
||||
if (def->driver.virtio.guest.tso4) {
|
||||
virBufferAsprintf(&buf, "tso4='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.guest.tso4));
|
||||
}
|
||||
if (def->driver.virtio.guest.tso6) {
|
||||
virBufferAsprintf(&buf, "tso6='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.guest.tso6));
|
||||
}
|
||||
if (def->driver.virtio.guest.ecn) {
|
||||
virBufferAsprintf(&buf, "ecn='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.guest.ecn));
|
||||
}
|
||||
if (def->driver.virtio.guest.ufo) {
|
||||
virBufferAsprintf(&buf, "ufo='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.guest.ufo));
|
||||
}
|
||||
virBufferTrim(&buf, " ", -1);
|
||||
|
||||
if (virBufferCheckError(&buf) < 0)
|
||||
return -1;
|
||||
|
||||
*outstr = virBufferContentAndReset(&buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virDomainVirtioNetHostOptsFormat(char **outstr,
|
||||
virDomainNetDefPtr def)
|
||||
{
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
if (def->driver.virtio.host.csum) {
|
||||
virBufferAsprintf(&buf, "csum='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.host.csum));
|
||||
}
|
||||
if (def->driver.virtio.host.gso) {
|
||||
virBufferAsprintf(&buf, "gso='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.host.gso));
|
||||
}
|
||||
if (def->driver.virtio.host.tso4) {
|
||||
virBufferAsprintf(&buf, "tso4='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.host.tso4));
|
||||
}
|
||||
if (def->driver.virtio.host.tso6) {
|
||||
virBufferAsprintf(&buf, "tso6='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.host.tso6));
|
||||
}
|
||||
if (def->driver.virtio.host.ecn) {
|
||||
virBufferAsprintf(&buf, "ecn='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.host.ecn));
|
||||
}
|
||||
if (def->driver.virtio.host.ufo) {
|
||||
virBufferAsprintf(&buf, "ufo='%s' ",
|
||||
virTristateSwitchTypeToString(def->driver.virtio.host.ufo));
|
||||
}
|
||||
virBufferTrim(&buf, " ", -1);
|
||||
|
||||
if (virBufferCheckError(&buf) < 0)
|
||||
return -1;
|
||||
|
||||
*outstr = virBufferContentAndReset(&buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virDomainVirtioNetDriverFormat(char **outstr,
|
||||
virDomainNetDefPtr def)
|
||||
@ -16562,7 +16747,6 @@ virDomainNetDefFormat(virBufferPtr buf,
|
||||
virDomainHostdevDefPtr hostdef = NULL;
|
||||
char macstr[VIR_MAC_STRING_BUFLEN];
|
||||
|
||||
|
||||
if (publicActual) {
|
||||
if (!(typeStr = virDomainNetTypeToString(actualType))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
@ -16721,14 +16905,36 @@ virDomainNetDefFormat(virBufferPtr buf,
|
||||
virBufferEscapeString(buf, "<model type='%s'/>\n",
|
||||
def->model);
|
||||
if (STREQ(def->model, "virtio")) {
|
||||
char *str;
|
||||
char *str = NULL, *gueststr = NULL, *hoststr = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if (virDomainVirtioNetDriverFormat(&str, def) < 0)
|
||||
return -1;
|
||||
if (virDomainVirtioNetDriverFormat(&str, def) < 0 ||
|
||||
virDomainVirtioNetGuestOptsFormat(&gueststr, def) < 0 ||
|
||||
virDomainVirtioNetHostOptsFormat(&hoststr, def) < 0)
|
||||
rc = -1;
|
||||
|
||||
if (str)
|
||||
virBufferAsprintf(buf, "<driver %s/>\n", str);
|
||||
if (!gueststr && !hoststr) {
|
||||
if (str)
|
||||
virBufferAsprintf(buf, "<driver %s/>\n", str);
|
||||
} else {
|
||||
if (str)
|
||||
virBufferAsprintf(buf, "<driver %s>\n", str);
|
||||
else
|
||||
virBufferAddLit(buf, "<driver>\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
if (hoststr)
|
||||
virBufferAsprintf(buf, "<host %s/>\n", hoststr);
|
||||
if (gueststr)
|
||||
virBufferAsprintf(buf, "<guest %s/>\n", gueststr);
|
||||
virBufferAdjustIndent(buf, -2);
|
||||
virBufferAddLit(buf, "</driver>\n");
|
||||
}
|
||||
VIR_FREE(str);
|
||||
VIR_FREE(hoststr);
|
||||
VIR_FREE(gueststr);
|
||||
|
||||
if (rc < 0)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (def->backend.tap || def->backend.vhost) {
|
||||
|
@ -895,6 +895,21 @@ struct _virDomainNetDef {
|
||||
virTristateSwitch ioeventfd;
|
||||
virTristateSwitch event_idx;
|
||||
unsigned int queues; /* Multiqueue virtio-net */
|
||||
struct {
|
||||
virTristateSwitch csum;
|
||||
virTristateSwitch gso;
|
||||
virTristateSwitch tso4;
|
||||
virTristateSwitch tso6;
|
||||
virTristateSwitch ecn;
|
||||
virTristateSwitch ufo;
|
||||
} host;
|
||||
struct {
|
||||
virTristateSwitch csum;
|
||||
virTristateSwitch tso4;
|
||||
virTristateSwitch tso6;
|
||||
virTristateSwitch ecn;
|
||||
virTristateSwitch ufo;
|
||||
} guest;
|
||||
} virtio;
|
||||
} driver;
|
||||
struct {
|
||||
|
@ -0,0 +1,35 @@
|
||||
<domain type='qemu'>
|
||||
<name>QEMUGuest1</name>
|
||||
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
<memory unit='KiB'>219136</memory>
|
||||
<currentMemory unit='KiB'>219136</currentMemory>
|
||||
<vcpu placement='static'>1</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu</emulator>
|
||||
<disk type='block' device='disk'>
|
||||
<source dev='/dev/HostVG/QEMUGuest7'/>
|
||||
<target dev='hda' bus='ide'/>
|
||||
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
||||
</disk>
|
||||
<controller type='usb' index='0'/>
|
||||
<controller type='ide' index='0'/>
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
<interface type='user'>
|
||||
<mac address='00:22:44:66:88:aa'/>
|
||||
<model type='virtio'/>
|
||||
<driver>
|
||||
<host csum='off' gso='off' tso4='off' tso6='off' ecn='off' ufo='off'/>
|
||||
<guest csum='off' tso4='off' tso6='off' ecn='off' ufo='off'/>
|
||||
</driver>
|
||||
</interface>
|
||||
<memballoon model='virtio'/>
|
||||
</devices>
|
||||
</domain>
|
@ -261,6 +261,7 @@ mymain(void)
|
||||
DO_TEST("net-user");
|
||||
DO_TEST("net-virtio");
|
||||
DO_TEST("net-virtio-device");
|
||||
DO_TEST("net-virtio-disable-offloads");
|
||||
DO_TEST("net-eth");
|
||||
DO_TEST("net-eth-ifname");
|
||||
DO_TEST("net-virtio-network-portgroup");
|
||||
|
Loading…
x
Reference in New Issue
Block a user