conf, qemu: Add support for shmem model

Just the default one now, new ones will be added in following commits.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Martin Kletzander 2016-08-19 14:57:07 +02:00
parent fe1dd39087
commit 64530a9c66
8 changed files with 80 additions and 12 deletions

View File

@ -6829,6 +6829,7 @@ qemu-kvm -net nic,model=? /dev/null
&lt;size unit='M'&gt;4&lt;/size&gt; &lt;size unit='M'&gt;4&lt;/size&gt;
&lt;/shmem&gt; &lt;/shmem&gt;
&lt;shmem name='shmem_server'&gt; &lt;shmem name='shmem_server'&gt;
&lt;model type='ivshmem'/&gt;
&lt;size unit='M'&gt;2&lt;/size&gt; &lt;size unit='M'&gt;2&lt;/size&gt;
&lt;server path='/tmp/socket-shmem'/&gt; &lt;server path='/tmp/socket-shmem'/&gt;
&lt;msi vectors='32' ioeventfd='on'/&gt; &lt;msi vectors='32' ioeventfd='on'/&gt;
@ -6843,6 +6844,13 @@ qemu-kvm -net nic,model=? /dev/null
The <code>shmem</code> element has one mandatory attribute, The <code>shmem</code> element has one mandatory attribute,
<code>name</code> to identify the shared memory. <code>name</code> to identify the shared memory.
</dd> </dd>
<dt><code>model</code></dt>
<dd>
Attribute <code>type</code> of the optional element <code>model</code>
specifies the model of the underlying device providing the
<code>shmem</code> device. Currently the only supported model is
<code>ivshmem</code>.
</dd>
<dt><code>size</code></dt> <dt><code>size</code></dt>
<dd> <dd>
The optional <code>size</code> element specifies the size of the shared The optional <code>size</code> element specifies the size of the shared

View File

@ -3591,6 +3591,15 @@
<element name="shmem"> <element name="shmem">
<attribute name="name"/> <attribute name="name"/>
<interleave> <interleave>
<optional>
<element name="model">
<attribute name="type">
<choice>
<value>ivshmem</value>
</choice>
</attribute>
</element>
</optional>
<optional> <optional>
<element name="size"> <element name="size">
<ref name="scaledInteger"/> <ref name="scaledInteger"/>

View File

@ -844,6 +844,9 @@ VIR_ENUM_IMPL(virDomainBlockJob, VIR_DOMAIN_BLOCK_JOB_TYPE_LAST,
VIR_ENUM_IMPL(virDomainMemoryModel, VIR_DOMAIN_MEMORY_MODEL_LAST, VIR_ENUM_IMPL(virDomainMemoryModel, VIR_DOMAIN_MEMORY_MODEL_LAST,
"", "dimm") "", "dimm")
VIR_ENUM_IMPL(virDomainShmemModel, VIR_DOMAIN_SHMEM_MODEL_LAST,
"ivshmem")
static virClassPtr virDomainObjClass; static virClassPtr virDomainObjClass;
static virClassPtr virDomainXMLOptionClass; static virClassPtr virDomainXMLOptionClass;
static void virDomainObjDispose(void *obj); static void virDomainObjDispose(void *obj);
@ -12351,6 +12354,20 @@ virDomainShmemDefParseXML(xmlNodePtr node,
ctxt->node = node; ctxt->node = node;
tmp = virXPathString("string(./model/@type)", ctxt);
if (tmp) {
/* If there's none, we will automatically have the first one
* (as default). Unfortunately this has to be done for
* compatibility reasons. */
if ((def->model = virDomainShmemModelTypeFromString(tmp)) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("Unknown shmem model type '%s'"), tmp);
goto cleanup;
}
VIR_FREE(tmp);
}
if (!(def->name = virXMLPropString(node, "name"))) { if (!(def->name = virXMLPropString(node, "name"))) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("shmem element must contain 'name' attribute")); _("shmem element must contain 'name' attribute"));
@ -14939,6 +14956,9 @@ virDomainShmemDefEquals(virDomainShmemDefPtr src,
if (src->size != dst->size) if (src->size != dst->size)
return false; return false;
if (src->model != dst->model)
return false;
if (src->server.enabled != dst->server.enabled) if (src->server.enabled != dst->server.enabled)
return false; return false;
@ -18927,6 +18947,15 @@ virDomainShmemDefCheckABIStability(virDomainShmemDefPtr src,
return false; return false;
} }
if (src->model != dst->model) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target shared memory model '%s' does not match "
"source model '%s'"),
virDomainShmemModelTypeToString(dst->model),
virDomainShmemModelTypeToString(src->model));
return false;
}
if (src->size != dst->size) { if (src->size != dst->size) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target shared memory size '%llu' does not match " _("Target shared memory size '%llu' does not match "
@ -21980,20 +22009,13 @@ virDomainShmemDefFormat(virBufferPtr buf,
virDomainShmemDefPtr def, virDomainShmemDefPtr def,
unsigned int flags) unsigned int flags)
{ {
virBufferEscapeString(buf, "<shmem name='%s'", def->name); virBufferEscapeString(buf, "<shmem name='%s'>\n", def->name);
if (!def->size &&
!def->server.enabled &&
!def->msi.enabled &&
!virDomainDeviceInfoNeedsFormat(&def->info, flags)) {
virBufferAddLit(buf, "/>\n");
return 0;
} else {
virBufferAddLit(buf, ">\n");
}
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
virBufferAsprintf(buf, "<model type='%s'/>\n",
virDomainShmemModelTypeToString(def->model));
if (def->size) if (def->size)
virBufferAsprintf(buf, "<size unit='M'>%llu</size>\n", def->size >> 20); virBufferAsprintf(buf, "<size unit='M'>%llu</size>\n", def->size >> 20);

View File

@ -1562,9 +1562,16 @@ struct _virDomainNVRAMDef {
virDomainDeviceInfo info; virDomainDeviceInfo info;
}; };
typedef enum {
VIR_DOMAIN_SHMEM_MODEL_IVSHMEM,
VIR_DOMAIN_SHMEM_MODEL_LAST
} virDomainShmemModel;
struct _virDomainShmemDef { struct _virDomainShmemDef {
char *name; char *name;
unsigned long long size; unsigned long long size;
int model; /* enum virDomainShmemModel */
struct { struct {
bool enabled; bool enabled;
virDomainChrSourceDef chr; virDomainChrSourceDef chr;
@ -3084,6 +3091,7 @@ VIR_ENUM_DECL(virDomainTPMBackend)
VIR_ENUM_DECL(virDomainMemoryModel) VIR_ENUM_DECL(virDomainMemoryModel)
VIR_ENUM_DECL(virDomainMemoryBackingModel) VIR_ENUM_DECL(virDomainMemoryBackingModel)
VIR_ENUM_DECL(virDomainIOMMUModel) VIR_ENUM_DECL(virDomainIOMMUModel)
VIR_ENUM_DECL(virDomainShmemModel)
/* from libvirt.h */ /* from libvirt.h */
VIR_ENUM_DECL(virDomainState) VIR_ENUM_DECL(virDomainState)
VIR_ENUM_DECL(virDomainNostateReason) VIR_ENUM_DECL(virDomainNostateReason)

View File

@ -474,6 +474,8 @@ virDomainShmemDefFind;
virDomainShmemDefFree; virDomainShmemDefFree;
virDomainShmemDefInsert; virDomainShmemDefInsert;
virDomainShmemDefRemove; virDomainShmemDefRemove;
virDomainShmemModelTypeFromString;
virDomainShmemModelTypeToString;
virDomainShutdownReasonTypeFromString; virDomainShutdownReasonTypeFromString;
virDomainShutdownReasonTypeToString; virDomainShutdownReasonTypeToString;
virDomainShutoffReasonTypeFromString; virDomainShutoffReasonTypeFromString;

View File

@ -8525,7 +8525,16 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager,
return -1; return -1;
} }
if (!(devstr = qemuBuildShmemDevLegacyStr(def, shmem, qemuCaps))) switch ((virDomainShmemModel)shmem->model) {
case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM:
devstr = qemuBuildShmemDevLegacyStr(def, shmem, qemuCaps);
break;
case VIR_DOMAIN_SHMEM_MODEL_LAST:
break;
}
if (!devstr)
return -1; return -1;
virCommandAddArgList(cmd, "-device", devstr, NULL); virCommandAddArgList(cmd, "-device", devstr, NULL);
VIR_FREE(devstr); VIR_FREE(devstr);

View File

@ -28,6 +28,7 @@
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem3'> <shmem name='shmem3'>
<model type='ivshmem'/>
<size unit='M'>512</size> <size unit='M'>512</size>
<server/> <server/>
</shmem> </shmem>
@ -41,6 +42,7 @@
<msi ioeventfd='off'/> <msi ioeventfd='off'/>
</shmem> </shmem>
<shmem name='shmem6'> <shmem name='shmem6'>
<model type='ivshmem'/>
<size unit='M'>4096</size> <size unit='M'>4096</size>
<server path='/tmp/shmem6-sock'/> <server path='/tmp/shmem6-sock'/>
<msi vectors='16'/> <msi vectors='16'/>

View File

@ -22,39 +22,47 @@
<input type='keyboard' bus='ps2'/> <input type='keyboard' bus='ps2'/>
<memballoon model='none'/> <memballoon model='none'/>
<shmem name='shmem0'> <shmem name='shmem0'>
<model type='ivshmem'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem1'> <shmem name='shmem1'>
<model type='ivshmem'/>
<size unit='M'>128</size> <size unit='M'>128</size>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem2'> <shmem name='shmem2'>
<model type='ivshmem'/>
<size unit='M'>256</size> <size unit='M'>256</size>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem3'> <shmem name='shmem3'>
<model type='ivshmem'/>
<size unit='M'>512</size> <size unit='M'>512</size>
<server/> <server/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem4'> <shmem name='shmem4'>
<model type='ivshmem'/>
<size unit='M'>1024</size> <size unit='M'>1024</size>
<server path='/tmp/shmem4-sock'/> <server path='/tmp/shmem4-sock'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem5'> <shmem name='shmem5'>
<model type='ivshmem'/>
<size unit='M'>2048</size> <size unit='M'>2048</size>
<server path='/tmp/shmem5-sock'/> <server path='/tmp/shmem5-sock'/>
<msi ioeventfd='off'/> <msi ioeventfd='off'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem6'> <shmem name='shmem6'>
<model type='ivshmem'/>
<size unit='M'>4096</size> <size unit='M'>4096</size>
<server path='/tmp/shmem6-sock'/> <server path='/tmp/shmem6-sock'/>
<msi vectors='16'/> <msi vectors='16'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</shmem> </shmem>
<shmem name='shmem7'> <shmem name='shmem7'>
<model type='ivshmem'/>
<size unit='M'>8192</size> <size unit='M'>8192</size>
<server path='/tmp/shmem7-sock'/> <server path='/tmp/shmem7-sock'/>
<msi vectors='32' ioeventfd='on'/> <msi vectors='32' ioeventfd='on'/>