<privnet/>
<hyperv>
<relaxed state='on'/>
+ <vapic state='on'/>
+ <spinlocks state='on' retries='4096'</spinlocks>
</hyperv>
</features>
<th>Feature</th>
<th>Description</th>
<th>Value</th>
+ <th>Since</th>
</tr>
<tr>
<td>relaxed</td>
<td>Relax contstraints on timers</td>
<td> on, off</td>
+ <td><span class="since">1.0.0 (QEMU only)</span></td>
+ </tr>
+ <tr>
+ <td>vapic</td>
+ <td>Enable virtual APIC</td>
+ <td>on, off</td>
+ <td><span class="since">1.1.0 (QEMU only)</span></td>
+ </tr>
+ <tr>
+ <td>spinlocks</td>
+ <td>Enable spinlock support</td>
+ <td>on, off; retries - at least 4095</td>
+ <td><span class="since">1.1.0 (QEMU only)</span></td>
</tr>
</table>
- <span class="since">Since 1.0.0 (QEMU only)</span>
</dd>
</dl>
"off")
VIR_ENUM_IMPL(virDomainHyperv, VIR_DOMAIN_HYPERV_LAST,
- "relaxed")
+ "relaxed",
+ "vapic",
+ "spinlocks")
VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST,
"destroy",
switch ((enum virDomainHyperv) feature) {
case VIR_DOMAIN_HYPERV_RELAXED:
+ case VIR_DOMAIN_HYPERV_VAPIC:
if (!(tmp = virXPathString("string(./@state)", ctxt))) {
virReportError(VIR_ERR_XML_ERROR,
_("missing 'state' attribute for "
def->hyperv_features[feature] = value;
break;
+ case VIR_DOMAIN_HYPERV_SPINLOCKS:
+ if (!(tmp = virXPathString("string(./@state)", ctxt))) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("missing 'state' attribute for "
+ "HyperV Enlightenment feature '%s'"),
+ nodes[i]->name);
+ goto error;
+ }
+
+ if ((value = virDomainFeatureStateTypeFromString(tmp)) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid value of state argument "
+ "for HyperV Enlightenment feature '%s'"),
+ nodes[i]->name);
+ goto error;
+ }
+
+ VIR_FREE(tmp);
+ if (!(tmp = virXPathString("string(./@retries)", ctxt))) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing HyperV spinlock retry count"));
+ goto error;
+ }
+
+ if (virStrToLong_ui(tmp, NULL, 0,
+ &def->hyperv_spinlocks) < 0) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Cannot parse HyperV spinlock retry "
+ "count"));
+ goto error;
+ }
+
+ if (def->hyperv_spinlocks < 0xFFF) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("HyperV spinlock retry count must be "
+ "at least 4095"));
+ goto error;
+ }
+ VIR_FREE(tmp);
+ def->hyperv_features[feature] = value;
+ break;
+
case VIR_DOMAIN_HYPERV_LAST:
break;
}
for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) {
switch ((enum virDomainHyperv) i) {
case VIR_DOMAIN_HYPERV_RELAXED:
+ case VIR_DOMAIN_HYPERV_VAPIC:
if (def->hyperv_features[i])
virBufferAsprintf(buf, " <%s state='%s'/>\n",
virDomainHypervTypeToString(i),
- virDomainFeatureStateTypeToString(def->hyperv_features[i]));
+ virDomainFeatureStateTypeToString(
+ def->hyperv_features[i]));
+ break;
+
+ case VIR_DOMAIN_HYPERV_SPINLOCKS:
+ if (def->hyperv_features[i] == 0)
+ break;
+
+ virBufferAsprintf(buf, " <spinlocks state='%s'",
+ virDomainFeatureStateTypeToString(
+ def->hyperv_features[i]));
+ if (def->hyperv_features[i] == VIR_DOMAIN_FEATURE_STATE_ON)
+ virBufferAsprintf(buf, " retries='%d'",
+ def->hyperv_spinlocks);
+ virBufferAddLit(buf, "/>\n");
break;
case VIR_DOMAIN_HYPERV_LAST: