[libvirt] [PATCH 21/25] conf: Introduce sgio for hostdev
Osier Yang
jyang at redhat.com
Thu May 16 16:47:54 UTC 2013
On 08/05/13 03:17, John Ferlan wrote:
> On 05/03/2013 02:07 PM, Osier Yang wrote:
>> "sgio" is only valid for scsi host device.
>> ---
>> docs/formatdomain.html.in | 7 ++++-
>> docs/schemas/domaincommon.rng | 8 +++++
>> src/conf/domain_conf.c | 34 ++++++++++++++++++---
>> src/conf/domain_conf.h | 1 +
>> .../qemuxml2argv-hostdev-scsi-sgio.xml | 35 ++++++++++++++++++++++
>> tests/qemuxml2xmltest.c | 1 +
>> 6 files changed, 81 insertions(+), 5 deletions(-)
>> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-sgio.xml
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 6437d6d..89d11e7 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -2319,7 +2319,12 @@
>> and <code>virNodeDeviceReAttach</code> (or <code>virsh
>> nodedev-reattach</code>) after hot-unplug or stopping the
>> guest. For SCSI device, user is responsible to make sure the device
>> - is not used by host.</dd>
>> + is not used by host.
>> + The optional <code>sgio</code> (<span class="since">since 1.0.6</span>)
>> + attribute indicates whether the kernel will filter unprivileged
>> + SG_IO commands for the disk, valid settings are "filtered" or
>> + "unfiltered". Defaults to "filtered".
>> + </dd>
>> <dt><code>source</code></dt>
>> <dd>The source element describes the device as seen from the host.
>> The USB device can either be addressed by vendor / product id using the
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index ca79e67..0a59c7a 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -3179,6 +3179,14 @@
>> <attribute name="type">
>> <value>scsi</value>
>> </attribute>
>> + <optional>
>> + <attribute name="sgio">
>> + <choice>
>> + <value>filtered</value>
>> + <value>unfiltered</value>
>> + </choice>
>> + </attribute>
>> + </optional>
>> <element name="source">
>> <interleave>
>> <ref name="sourceinfoadapter"/>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 9823b9c..d604e5b 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -3784,6 +3784,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
>> {
>> xmlNodePtr sourcenode;
>> char *managed = NULL;
>> + char *sgio = NULL;
>> char *backendStr = NULL;
>> int backend;
>> int ret = -1;
>> @@ -3798,6 +3799,8 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
>> def->managed = true;
>> }
>>
>> + sgio = virXMLPropString(node, "sgio");
>> +
>> /* @type is passed in from the caller rather than read from the
>> * xml document, because it is specified in different places for
>> * different kinds of defs - it is an attribute of
>> @@ -3834,6 +3837,22 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
>> goto error;
>> }
>>
>> + if (sgio) {
>> + if (def->source.subsys.type !=
>> + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("sgio is only supported for scsi host device"));
>> + goto error;
>> + }
>> +
>> + if ((def->source.subsys.u.scsi.sgio =
>> + virDomainDeviceSGIOTypeFromString(sgio)) <= 0) {
>> + virReportError(VIR_ERR_XML_ERROR,
>> + _("unknown sgio mode '%s'"), sgio);
>> + goto error;
>> + }
>> + }
>> +
>> switch (def->source.subsys.type) {
>> case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
>> if (virDomainHostdevSubsysPciDefParseXML(sourcenode, def, flags) < 0)
>> @@ -3872,6 +3891,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
>> ret = 0;
>> error:
>> VIR_FREE(managed);
>> + VIR_FREE(sgio);
>> VIR_FREE(backendStr);
>> return ret;
>> }
>> @@ -15464,11 +15484,17 @@ virDomainHostdevDefFormat(virBufferPtr buf,
>>
>> virBufferAsprintf(buf, " <hostdev mode='%s' type='%s'",
>> mode, type);
>> - if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
>> - virBufferAsprintf(buf, " managed='%s'>\n",
>> + if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
>> + virBufferAsprintf(buf, " managed='%s'",
>> def->managed ? "yes" : "no");
>> - else
>> - virBufferAddLit(buf, ">\n");
>> +
>> + if (def->source.subsys.type ==
>> + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
>> + def->source.subsys.u.scsi.sgio)
>> + virBufferAsprintf(buf, " sgio='%s'",
>> + virDomainDeviceSGIOTypeToString(def->source.subsys.u.scsi.sgio));
>> + }
>> + virBufferAddLit(buf, ">\n");
>>
>> virBufferAdjustIndent(buf, 6);
>> switch (def->mode) {
>> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>> index 59cf6a7..8d67e67 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>> @@ -423,6 +423,7 @@ struct _virDomainHostdevSubsys {
>> unsigned bus;
>> unsigned target;
>> unsigned unit;
>> + int sgio; /* enum virDomainDeviceSGIO */
>> } scsi;
>> } u;
>> };
>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-sgio.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-sgio.xml
>> new file mode 100644
>> index 0000000..21404ee
>> --- /dev/null
>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-sgio.xml
>> @@ -0,0 +1,35 @@
>> +<domain type='qemu'>
>> + <name>QEMUGuest2</name>
>> + <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
>> + <memory unit='KiB'>219100</memory>
>> + <currentMemory unit='KiB'>219100</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/QEMUGuest2'/>
>> + <target dev='hda' bus='ide'/>
>> + <address type='drive' controller='0' bus='0' target='0' unit='0'/>
>> + </disk>
>> + <controller type='scsi' index='0' model='virtio-scsi'/>
>> + <controller type='usb' index='0'/>
>> + <controller type='ide' index='0'/>
>> + <controller type='pci' index='0' model='pci-root'/>
>> + <hostdev mode='subsystem' type='scsi' managed='yes' sgio='unfiltered'>
>> + <source>
>> + <adapter name='scsi_host0'/>
>> + <address bus='0' target='0' unit='0'/>
>> + </source>
>> + <address type='drive' controller='0' bus='0' target='4' unit='8'/>
>> + </hostdev>
>> + <memballoon model='virtio'/>
>> + </devices>
>> +</domain>
>> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
>> index d37a657..04be8dd 100644
>> --- a/tests/qemuxml2xmltest.c
>> +++ b/tests/qemuxml2xmltest.c
>> @@ -289,6 +289,7 @@ mymain(void)
>> DO_TEST("hostdev-scsi-virtio-scsi");
>> DO_TEST("hostdev-scsi-readonly");
>> DO_TEST("hostdev-scsi-shareable");
>> + DO_TEST("hostdev-scsi-sgio");
> NIT: should this be "scsi-unfiltered-sgio" since the default is filtered
> and you're testing the unfiltered mode... Probably changes the xml file
> name too.
>
> It's not a deal breaker... ACK otherwise.
>
>
I'd like keep it, one can also define "filtered" mode in the same XML
for a different device.
Pushed.
More information about the libvir-list
mailing list