WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: xen: fix hvm_domain_use_pirq's behavior

On Wed, 31 Aug 2011, stefano.stabellini@xxxxxxxxxxxxx wrote:
> hvm_domain_use_pirq should return true when the guest is using a certain
> pirq, no matter if the corresponding event channel is currently enabled
> or disabled.  As an additional complication, qemu is going to request
> pirqs for passthrough devices even for Xen unaware HVM guests, so we
> need to wait for an event channel to be connected before considering the
> pirq of a passthrough device as "in use".
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> 

this patch should also be backported to 4.1, I am attaching the
backport to this email.


> diff -r 1515138fbd7b xen/arch/x86/irq.c
> --- a/xen/arch/x86/irq.c      Wed Aug 24 09:33:10 2011 +0100
> +++ b/xen/arch/x86/irq.c      Tue Aug 30 11:56:21 2011 +0000
> @@ -2024,6 +2024,5 @@ int unmap_domain_pirq_emuirq(struct doma
>  bool_t hvm_domain_use_pirq(const struct domain *d, const struct pirq *pirq)
>  {
>      return is_hvm_domain(d) && pirq &&
> -           pirq->arch.hvm.emuirq != IRQ_UNBOUND &&
> -           pirq->evtchn != 0;
> +           pirq->arch.hvm.emuirq != IRQ_UNBOUND; 
>  }
> diff -r 1515138fbd7b xen/arch/x86/physdev.c
> --- a/xen/arch/x86/physdev.c  Wed Aug 24 09:33:10 2011 +0100
> +++ b/xen/arch/x86/physdev.c  Tue Aug 30 11:56:21 2011 +0000
> @@ -196,9 +196,6 @@ int physdev_map_pirq(domid_t domid, int 
>      if ( ret == 0 )
>          *pirq_p = pirq;
>  
> -    if ( !ret && is_hvm_domain(d) )
> -        map_domain_emuirq_pirq(d, pirq, IRQ_PT);
> -
>   done:
>      spin_unlock(&d->event_lock);
>      spin_unlock(&pcidevs_lock);
> @@ -271,7 +268,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>               v->domain->arch.pv_domain.pirq_eoi_map )
>              evtchn_unmask(pirq->evtchn);
>          if ( !is_hvm_domain(v->domain) ||
> -             pirq->arch.hvm.emuirq == IRQ_PT )
> +             domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
>              pirq_guest_eoi(pirq);
>          spin_unlock(&v->domain->event_lock);
>          ret = 0;
> @@ -331,7 +328,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>              break;
>          irq_status_query.flags = 0;
>          if ( is_hvm_domain(v->domain) &&
> -             domain_pirq_to_emuirq(v->domain, irq) != IRQ_PT )
> +             domain_pirq_to_irq(v->domain, irq) <= 0 )
>          {
>              ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
>              break;
> diff -r 1515138fbd7b xen/common/event_channel.c
> --- a/xen/common/event_channel.c      Wed Aug 24 09:33:10 2011 +0100
> +++ b/xen/common/event_channel.c      Tue Aug 30 11:56:21 2011 +0000
> @@ -366,6 +366,9 @@ static long evtchn_bind_pirq(evtchn_bind
>  
>      bind->port = port;
>  
> +    if ( is_hvm_domain(d) && domain_pirq_to_irq(d, pirq) > 0 )
> +        map_domain_emuirq_pirq(d, pirq, IRQ_PT);
> +
>   out:
>      spin_unlock(&d->event_lock);
>  
> @@ -419,6 +422,8 @@ static long __evtchn_close(struct domain
>          pirq->evtchn = 0;
>          pirq_cleanup_check(pirq, d1);
>          unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]);
> +        if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, pirq->pirq) > 0 )
> +            unmap_domain_pirq_emuirq(d1, pirq->pirq);
>          break;
>      }
>  
> 

Attachment: assert_irq1
Description: Text document

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel