提交 32bd699f 编写于 作者: P Peter Krempa

virtio-rng: Add rate limiting options for virtio-RNG

Qemu's implementation of virtio RNG supports rate limiting of the
entropy used. This patch exposes the option to tune this functionality.

This patch is based on qemu commit 904d6f588063fb5ad2b61998acdf1e73fb4

The rate limiting is exported in the XML as:
<devices>
  ...
  <rng model='virtio'>
    <rate bytes='123' period='1234'/>
    <backend model='random'/>
  </rng>
  ...
上级 eb086eb5
...@@ -4294,6 +4294,7 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -4294,6 +4294,7 @@ qemu-kvm -net nic,model=? /dev/null
... ...
&lt;devices&gt; &lt;devices&gt;
&lt;rng model='virtio'&gt; &lt;rng model='virtio'&gt;
&lt;rate period="2000" bytes="1234"/&gt;
&lt;backend model='random'&gt;/dev/random&lt;/backend&gt; &lt;backend model='random'&gt;/dev/random&lt;/backend&gt;
&lt;!-- OR --&gt; &lt;!-- OR --&gt;
&lt;backend model='egd' type='udp'&gt; &lt;backend model='egd' type='udp'&gt;
...@@ -4316,6 +4317,18 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -4316,6 +4317,18 @@ qemu-kvm -net nic,model=? /dev/null
<li>'virtio' &mdash; supported by qemu and virtio-rng kernel module</li> <li>'virtio' &mdash; supported by qemu and virtio-rng kernel module</li>
</ul> </ul>
</dd> </dd>
<dt><code>rate</code></dt>
<dd>
<p>
The optional <code>rate</code> element allows limiting the rate at
which entropy can be consumed from the source. The mandatory
attribute <code>bytes</code> specifies how many bytes are permitted
to be consumed per period. An optional <code>period</code> attribute
specifies the duration of a period in milliseconds; if omitted, the
period is taken as 1000 milliseconds (1 second).
<span class='since'>Since 1.0.4</span>
</p>
</dd>
<dt><code>backend</code></dt> <dt><code>backend</code></dt>
<dd> <dd>
<p> <p>
......
...@@ -3522,7 +3522,12 @@ ...@@ -3522,7 +3522,12 @@
<value>virtio</value> <value>virtio</value>
</choice> </choice>
</attribute> </attribute>
<ref name="rng-backend"/> <interleave>
<ref name="rng-backend"/>
<optional>
<ref name="rng-rate"/>
</optional>
</interleave>
</element> </element>
</define> </define>
...@@ -3550,6 +3555,20 @@ ...@@ -3550,6 +3555,20 @@
</element> </element>
</define> </define>
<define name="rng-rate">
<element name="rate">
<attribute name="bytes">
<ref name="positiveInteger"/>
</attribute>
<optional>
<attribute name="period">
<ref name="positiveInteger"/>
</attribute>
</optional>
<empty/>
</element>
</define>
<define name="usbmaster"> <define name="usbmaster">
<element name="master"> <element name="master">
<attribute name="startport"> <attribute name="startport">
......
...@@ -7570,6 +7570,19 @@ virDomainRNGDefParseXML(const xmlNodePtr node, ...@@ -7570,6 +7570,19 @@ virDomainRNGDefParseXML(const xmlNodePtr node,
ctxt->node = node; ctxt->node = node;
if (virXPathUInt("string(./rate/@bytes)", ctxt, &def->rate) < -1) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("invalid RNG rate bytes value"));
goto error;
}
if (def->rate > 0 &&
virXPathUInt("string(./rate/@period)", ctxt, &def->period) < -1) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("invalid RNG rate period value"));
goto error;
}
if ((nbackends = virXPathNodeSet("./backend", ctxt, &backends)) < 0) if ((nbackends = virXPathNodeSet("./backend", ctxt, &backends)) < 0)
goto error; goto error;
...@@ -13897,6 +13910,12 @@ virDomainRNGDefFormat(virBufferPtr buf, ...@@ -13897,6 +13910,12 @@ virDomainRNGDefFormat(virBufferPtr buf,
const char *backend = virDomainRNGBackendTypeToString(def->backend); const char *backend = virDomainRNGBackendTypeToString(def->backend);
virBufferAsprintf(buf, " <rng model='%s'>\n", model); virBufferAsprintf(buf, " <rng model='%s'>\n", model);
if (def->rate) {
virBufferAsprintf(buf, " <rate bytes='%u'", def->rate);
if (def->period)
virBufferAsprintf(buf, " period='%u'", def->period);
virBufferAddLit(buf, "/>\n");
}
virBufferAsprintf(buf, " <backend model='%s'", backend); virBufferAsprintf(buf, " <backend model='%s'", backend);
switch ((enum virDomainRNGBackend) def->backend) { switch ((enum virDomainRNGBackend) def->backend) {
......
...@@ -1736,6 +1736,8 @@ enum virDomainRNGBackend { ...@@ -1736,6 +1736,8 @@ enum virDomainRNGBackend {
struct _virDomainRNGDef { struct _virDomainRNGDef {
int model; int model;
int backend; int backend;
unsigned int rate; /* bytes per period */
unsigned int period; /* milliseconds */
union { union {
char *file; /* file name for 'random' source */ char *file; /* file name for 'random' source */
......
...@@ -4492,6 +4492,14 @@ qemuBuildRNGDeviceArgs(virCommandPtr cmd, ...@@ -4492,6 +4492,14 @@ qemuBuildRNGDeviceArgs(virCommandPtr cmd,
virBufferAsprintf(&buf, "virtio-rng-pci,rng=%s", dev->info.alias); virBufferAsprintf(&buf, "virtio-rng-pci,rng=%s", dev->info.alias);
if (dev->rate > 0) {
virBufferAsprintf(&buf, ",max-bytes=%u", dev->rate);
if (dev->period)
virBufferAsprintf(&buf, ",period=%u", dev->period);
else
virBufferAddLit(&buf, ",period=1000");
}
if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0) if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
goto cleanup; goto cleanup;
......
...@@ -3,4 +3,4 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu \ ...@@ -3,4 +3,4 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu \
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \ -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \
-object rng-random,id=rng0,filename=/dev/hwrng \ -object rng-random,id=rng0,filename=/dev/hwrng \
-device virtio-rng-pci,rng=rng0,bus=pci.0,addr=0x4 -device virtio-rng-pci,rng=rng0,max-bytes=123,period=1234,bus=pci.0,addr=0x4
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
<controller type='usb' index='0'/> <controller type='usb' index='0'/>
<memballoon model='virtio'/> <memballoon model='virtio'/>
<rng model='virtio'> <rng model='virtio'>
<rate bytes='123' period='1234'/>
<backend model='random'>/dev/hwrng</backend> <backend model='random'>/dev/hwrng</backend>
</rng> </rng>
</devices> </devices>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册