[libvirt] [PATCH 1/2] Add support for EOI with APIC

Martin Kletzander mkletzan at redhat.com
Fri Sep 14 06:45:25 UTC 2012


On 09/13/2012 04:52 PM, Michal Privoznik wrote:
> On 13.09.2012 16:12, Martin Kletzander wrote:
>> New options is added to support EOI (End of Interrupt) exposure for
>> guests. As it makes sense only when APIC is enabled, I added this into
>> the <apic> element in <features> because this should be tri-state
>> option (cannot be handled as standalone feature).
>> ---
>>  docs/formatdomain.html.in     |  7 +++++++
>>  docs/schemas/domaincommon.rng |  9 ++++++++-
>>  src/conf/domain_conf.c        | 35 ++++++++++++++++++++++++++++++++++-
>>  src/conf/domain_conf.h        | 11 +++++++++++
>>  src/libvirt_private.syms      |  2 ++
>>  5 files changed, 62 insertions(+), 2 deletions(-)
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 503685f..66319d0 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -1018,6 +1018,13 @@
>>        <dd>ACPI is useful for power management, for example, with
>>          KVM guests it is required for graceful shutdown to work.
>>        </dd>
>> +      <dt><code>apic</code></dt>
>> +      <dd>APIC allows the use of programmable IRQ
>> +      management. <span class="since">Since 0.10.2 (QEMU only)</span>
>> +      there is an optional attribute <code>eoi</code> with values "on"
>> +      and "off" which toggle the availability of EOI (End of
> 
> s/toggle/toggles/
> 
>> +      Interrupt) for the guest.
>> +      </dd>
>>        <dt><code>hap</code></dt>
>>        <dd>Enable use of Hardware Assisted Paging if available in
>>          the hardware.
> 
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 292cc9a..89c08da 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -110,6 +110,11 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
>>                "viridian",
>>                "privnet")
>>
>> +VIR_ENUM_IMPL(virDomainApicEoi, VIR_DOMAIN_APIC_EOI_LAST,
>> +              "default",
>> +              "on",
>> +              "off")
>> +
>>  VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST,
>>                "destroy",
>>                "restart",
>> @@ -8621,6 +8626,28 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>>                  goto error;
>>              }
>>              def->features |= (1 << val);
>> +            if (val == VIR_DOMAIN_FEATURE_APIC) {
>> +                char *attrstr = NULL;
>> +                if (virAsprintf(&attrstr,
>> +                                "string(./features/%s/@eoi)",
>> +                                nodes[i]->name) < 0)
>> +                    goto no_memory;
>> +
> 
> Why do we want runtime constructed string esp. if it is static one?
> 
>> +                tmp = virXPathString(attrstr, ctxt);
>> +                if (tmp) {
>> +                    int eoi;
>> +                    if ((eoi = virDomainApicEoiTypeFromString(tmp)) < 0) {
>> +                        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                                       _("unknown value for attribute eoi: %s"),
>> +                                       nodes[i]->name);
> 
> s/nodes[i]->name/tmp/
> 
>> +                        VIR_FREE(tmp);
>> +                        goto error;
>> +                    }
>> +                    def->apic_eoi = eoi;
>> +                    VIR_FREE(tmp);
>> +                }
>> +                VIR_FREE(attrstr);
>> +            }
>>          }
>>          VIR_FREE(nodes);
>>      }
> 
> ACK with this squashed in:
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index d13f671..16afb15 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -8846,26 +8846,19 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>              }
>              def->features |= (1 << val);
>              if (val == VIR_DOMAIN_FEATURE_APIC) {
> -                char *attrstr = NULL;
> -                if (virAsprintf(&attrstr,
> -                                "string(./features/%s/@eoi)",
> -                                nodes[i]->name) < 0)
> -                    goto no_memory;
> -
> -                tmp = virXPathString(attrstr, ctxt);
> +                tmp = virXPathString("string(./features/apic/@eoi)", ctxt);
>                  if (tmp) {
>                      int eoi;
> -                    if ((eoi = virDomainApicEoiTypeFromString(tmp)) < 0) {
> +                    if ((eoi = virDomainApicEoiTypeFromString(tmp)) <= 0) {
>                          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                                         _("unknown value for attribute eoi: %s"),
> -                                       nodes[i]->name);
> +                                       tmp);
>                          VIR_FREE(tmp);
>                          goto error;
>                      }
>                      def->apic_eoi = eoi;
>                      VIR_FREE(tmp);
>                  }
> -                VIR_FREE(attrstr);
>              }
>          }
>          VIR_FREE(nodes);
> 
> 
> Michal
> 

Thanks guys, fushed with the fixes,

Martin




More information about the libvir-list mailing list