mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-08 12:41:29 +00:00
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>
|
<size unit='M'>4</size>
|
||||||
</shmem>
|
</shmem>
|
||||||
<shmem name='shmem_server'>
|
<shmem name='shmem_server'>
|
||||||
|
<model type='ivshmem'/>
|
||||||
<size unit='M'>2</size>
|
<size unit='M'>2</size>
|
||||||
<server path='/tmp/socket-shmem'/>
|
<server path='/tmp/socket-shmem'/>
|
||||||
<msi vectors='32' ioeventfd='on'/>
|
<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,
|
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
|
||||||
|
@ -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"/>
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -474,6 +474,8 @@ virDomainShmemDefFind;
|
|||||||
virDomainShmemDefFree;
|
virDomainShmemDefFree;
|
||||||
virDomainShmemDefInsert;
|
virDomainShmemDefInsert;
|
||||||
virDomainShmemDefRemove;
|
virDomainShmemDefRemove;
|
||||||
|
virDomainShmemModelTypeFromString;
|
||||||
|
virDomainShmemModelTypeToString;
|
||||||
virDomainShutdownReasonTypeFromString;
|
virDomainShutdownReasonTypeFromString;
|
||||||
virDomainShutdownReasonTypeToString;
|
virDomainShutdownReasonTypeToString;
|
||||||
virDomainShutoffReasonTypeFromString;
|
virDomainShutoffReasonTypeFromString;
|
||||||
|
@ -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);
|
||||||
|
@ -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'/>
|
||||||
|
@ -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'/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user