mirror of https://gitee.com/openkylin/libvirt.git
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:
parent
fe1dd39087
commit
64530a9c66
|
@ -6829,6 +6829,7 @@ qemu-kvm -net nic,model=? /dev/null
|
|||
<size unit='M'>4</size>
|
||||
</shmem>
|
||||
<shmem name='shmem_server'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>2</size>
|
||||
<server path='/tmp/socket-shmem'/>
|
||||
<msi vectors='32' ioeventfd='on'/>
|
||||
|
@ -6843,6 +6844,13 @@ qemu-kvm -net nic,model=? /dev/null
|
|||
The <code>shmem</code> element has one mandatory attribute,
|
||||
<code>name</code> to identify the shared memory.
|
||||
</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>
|
||||
<dd>
|
||||
The optional <code>size</code> element specifies the size of the shared
|
||||
|
|
|
@ -3591,6 +3591,15 @@
|
|||
<element name="shmem">
|
||||
<attribute name="name"/>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name="model">
|
||||
<attribute name="type">
|
||||
<choice>
|
||||
<value>ivshmem</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="size">
|
||||
<ref name="scaledInteger"/>
|
||||
|
|
|
@ -844,6 +844,9 @@ VIR_ENUM_IMPL(virDomainBlockJob, VIR_DOMAIN_BLOCK_JOB_TYPE_LAST,
|
|||
VIR_ENUM_IMPL(virDomainMemoryModel, VIR_DOMAIN_MEMORY_MODEL_LAST,
|
||||
"", "dimm")
|
||||
|
||||
VIR_ENUM_IMPL(virDomainShmemModel, VIR_DOMAIN_SHMEM_MODEL_LAST,
|
||||
"ivshmem")
|
||||
|
||||
static virClassPtr virDomainObjClass;
|
||||
static virClassPtr virDomainXMLOptionClass;
|
||||
static void virDomainObjDispose(void *obj);
|
||||
|
@ -12351,6 +12354,20 @@ virDomainShmemDefParseXML(xmlNodePtr 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"))) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("shmem element must contain 'name' attribute"));
|
||||
|
@ -14939,6 +14956,9 @@ virDomainShmemDefEquals(virDomainShmemDefPtr src,
|
|||
if (src->size != dst->size)
|
||||
return false;
|
||||
|
||||
if (src->model != dst->model)
|
||||
return false;
|
||||
|
||||
if (src->server.enabled != dst->server.enabled)
|
||||
return false;
|
||||
|
||||
|
@ -18927,6 +18947,15 @@ virDomainShmemDefCheckABIStability(virDomainShmemDefPtr src,
|
|||
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) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Target shared memory size '%llu' does not match "
|
||||
|
@ -21980,20 +22009,13 @@ virDomainShmemDefFormat(virBufferPtr buf,
|
|||
virDomainShmemDefPtr def,
|
||||
unsigned int flags)
|
||||
{
|
||||
virBufferEscapeString(buf, "<shmem name='%s'", def->name);
|
||||
|
||||
if (!def->size &&
|
||||
!def->server.enabled &&
|
||||
!def->msi.enabled &&
|
||||
!virDomainDeviceInfoNeedsFormat(&def->info, flags)) {
|
||||
virBufferAddLit(buf, "/>\n");
|
||||
return 0;
|
||||
} else {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
}
|
||||
virBufferEscapeString(buf, "<shmem name='%s'>\n", def->name);
|
||||
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
|
||||
virBufferAsprintf(buf, "<model type='%s'/>\n",
|
||||
virDomainShmemModelTypeToString(def->model));
|
||||
|
||||
if (def->size)
|
||||
virBufferAsprintf(buf, "<size unit='M'>%llu</size>\n", def->size >> 20);
|
||||
|
||||
|
|
|
@ -1562,9 +1562,16 @@ struct _virDomainNVRAMDef {
|
|||
virDomainDeviceInfo info;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
VIR_DOMAIN_SHMEM_MODEL_IVSHMEM,
|
||||
|
||||
VIR_DOMAIN_SHMEM_MODEL_LAST
|
||||
} virDomainShmemModel;
|
||||
|
||||
struct _virDomainShmemDef {
|
||||
char *name;
|
||||
unsigned long long size;
|
||||
int model; /* enum virDomainShmemModel */
|
||||
struct {
|
||||
bool enabled;
|
||||
virDomainChrSourceDef chr;
|
||||
|
@ -3084,6 +3091,7 @@ VIR_ENUM_DECL(virDomainTPMBackend)
|
|||
VIR_ENUM_DECL(virDomainMemoryModel)
|
||||
VIR_ENUM_DECL(virDomainMemoryBackingModel)
|
||||
VIR_ENUM_DECL(virDomainIOMMUModel)
|
||||
VIR_ENUM_DECL(virDomainShmemModel)
|
||||
/* from libvirt.h */
|
||||
VIR_ENUM_DECL(virDomainState)
|
||||
VIR_ENUM_DECL(virDomainNostateReason)
|
||||
|
|
|
@ -474,6 +474,8 @@ virDomainShmemDefFind;
|
|||
virDomainShmemDefFree;
|
||||
virDomainShmemDefInsert;
|
||||
virDomainShmemDefRemove;
|
||||
virDomainShmemModelTypeFromString;
|
||||
virDomainShmemModelTypeToString;
|
||||
virDomainShutdownReasonTypeFromString;
|
||||
virDomainShutdownReasonTypeToString;
|
||||
virDomainShutoffReasonTypeFromString;
|
||||
|
|
|
@ -8525,7 +8525,16 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager,
|
|||
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;
|
||||
virCommandAddArgList(cmd, "-device", devstr, NULL);
|
||||
VIR_FREE(devstr);
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem3'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>512</size>
|
||||
<server/>
|
||||
</shmem>
|
||||
|
@ -41,6 +42,7 @@
|
|||
<msi ioeventfd='off'/>
|
||||
</shmem>
|
||||
<shmem name='shmem6'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>4096</size>
|
||||
<server path='/tmp/shmem6-sock'/>
|
||||
<msi vectors='16'/>
|
||||
|
|
|
@ -22,39 +22,47 @@
|
|||
<input type='keyboard' bus='ps2'/>
|
||||
<memballoon model='none'/>
|
||||
<shmem name='shmem0'>
|
||||
<model type='ivshmem'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem1'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>128</size>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem2'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>256</size>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem3'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>512</size>
|
||||
<server/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem4'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>1024</size>
|
||||
<server path='/tmp/shmem4-sock'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem5'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>2048</size>
|
||||
<server path='/tmp/shmem5-sock'/>
|
||||
<msi ioeventfd='off'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem6'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>4096</size>
|
||||
<server path='/tmp/shmem6-sock'/>
|
||||
<msi vectors='16'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
|
||||
</shmem>
|
||||
<shmem name='shmem7'>
|
||||
<model type='ivshmem'/>
|
||||
<size unit='M'>8192</size>
|
||||
<server path='/tmp/shmem7-sock'/>
|
||||
<msi vectors='32' ioeventfd='on'/>
|
||||
|
|
Loading…
Reference in New Issue