xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Keir Fraser <keir.fraser@eu.citrix.com>
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [PATCH] xen: implement vector callback for evtchn delivery
Date: Mon, 24 May 2010 19:59:42 +0100	[thread overview]
Message-ID: <C8208B2E.150A1%keir.fraser@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.00.1005181124100.11380@kaball-desktop>

Please add documentation to include/public/hvm/param.h about how to specify
the new callback method, and detect when it is available. Move the new
is_hvm_pv_blah macros out into an appropriate include/asm-x86 header file --
They are not arch independent.

 -- Keir

On 18/05/2010 11:31, "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>
wrote:

> Hi all,
> this patch implements the vector callback mechanism in Xen and it is based
> on Sheng's work so he should be considered the original author.
> 
> This update addresses Jan's comment about the test v->vcpu_id != 0 in
> hvm_assert_evtchn_irq.
> 
> Signed-off-by: Sheng Yang <sheng@linux.intel.com>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> ---
> 
> 
> diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
> --- a/xen/arch/x86/hvm/irq.c
> +++ b/xen/arch/x86/hvm/irq.c
> @@ -185,16 +185,16 @@
>  
>  void hvm_assert_evtchn_irq(struct vcpu *v)
>  {
> -    if ( v->vcpu_id != 0 )
> -        return;
> -
>      if ( unlikely(in_irq() || !local_irq_is_enabled()) )
>      {
>          tasklet_schedule(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet);
>          return;
>      }
>  
> -    hvm_set_callback_irq_level(v);
> +    if ( is_hvm_pv_evtchn_vcpu(v) )
> +        vcpu_kick(v);
> +    else if ( v->vcpu_id == 0 )
> +        hvm_set_callback_irq_level(v);
>  }
>  
>  void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq)
> @@ -251,7 +251,7 @@
>  
>      via_type = (uint8_t)(via >> 56) + 1;
>      if ( ((via_type == HVMIRQ_callback_gsi) && (via == 0)) ||
> -         (via_type > HVMIRQ_callback_pci_intx) )
> +         (via_type > HVMIRQ_callback_vector) )
>          via_type = HVMIRQ_callback_none;
>  
>      spin_lock(&d->arch.hvm_domain.irq_lock);
> @@ -297,6 +297,9 @@
>          if ( hvm_irq->callback_via_asserted )
>               __hvm_pci_intx_assert(d, pdev, pintx);
>          break;
> +    case HVMIRQ_callback_vector:
> +        hvm_irq->callback_via.vector = (uint8_t)via;
> +        break;
>      default:
>          break;
>      }
> @@ -312,6 +315,10 @@
>      case HVMIRQ_callback_pci_intx:
>          printk("PCI INTx Dev 0x%02x Int%c\n", pdev, 'A' + pintx);
>          break;
> +    case HVMIRQ_callback_vector:
> +        printk("Set HVMIRQ_callback_vector to %u\n",
> +               hvm_irq->callback_via.vector);
> +        break;
>      default:
>          printk("None\n");
>          break;
> @@ -323,6 +330,10 @@
>      struct hvm_domain *plat = &v->domain->arch.hvm_domain;
>      int vector;
>  
> +    if (plat->irq.callback_via_type == HVMIRQ_callback_vector &&
> +            vcpu_info(v, evtchn_upcall_pending))
> +        return hvm_intack_vector(plat->irq.callback_via.vector);
> + 
>      if ( unlikely(v->nmi_pending) )
>          return hvm_intack_nmi;
>  
> @@ -363,6 +374,8 @@
>      case hvm_intsrc_lapic:
>          if ( !vlapic_ack_pending_irq(v, intack.vector) )
>              intack = hvm_intack_none;
> +        break;
> +    case hvm_intsrc_vector:
>          break;
>      default:
>          intack = hvm_intack_none;
> diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c
> --- a/xen/arch/x86/hvm/vmx/intr.c
> +++ b/xen/arch/x86/hvm/vmx/intr.c
> @@ -164,7 +164,8 @@
>      {
>          HVMTRACE_2D(INJ_VIRQ, intack.vector, /*fake=*/ 0);
>          vmx_inject_extint(intack.vector);
> -        pt_intr_post(v, intack);
> +        if (intack.source != hvm_intsrc_vector)
> +             pt_intr_post(v, intack);
>      }
>  
>      /* Is there another IRQ to queue up behind this one? */
> diff --git a/xen/common/kernel.c b/xen/common/kernel.c
> --- a/xen/common/kernel.c
> +++ b/xen/common/kernel.c
> @@ -260,7 +260,10 @@
>                               (1U << XENFEAT_highmem_assist) |
>                               (1U << XENFEAT_gnttab_map_avail_bits);
>              else
> +            {
>                  fi.submap |= (1U << XENFEAT_hvm_safe_pvclock);
> +                fi.submap |= (1U << XENFEAT_hvm_callback_vector);
> +            }
>  #endif
>              break;
>          default:
> diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
> --- a/xen/include/asm-x86/hvm/hvm.h
> +++ b/xen/include/asm-x86/hvm/hvm.h
> @@ -33,7 +33,8 @@
>      hvm_intsrc_pic,
>      hvm_intsrc_lapic,
>      hvm_intsrc_nmi,
> -    hvm_intsrc_mce
> +    hvm_intsrc_mce,
> +    hvm_intsrc_vector
>  };
>  struct hvm_intack {
>      uint8_t source; /* enum hvm_intsrc */
> @@ -44,6 +45,7 @@
>  #define hvm_intack_lapic(vec) ( (struct hvm_intack) { hvm_intsrc_lapic, vec }
> )
>  #define hvm_intack_nmi        ( (struct hvm_intack) { hvm_intsrc_nmi,   2 } )
>  #define hvm_intack_mce        ( (struct hvm_intack) { hvm_intsrc_mce,   18 }
> )
> +#define hvm_intack_vector(vec)( (struct hvm_intack) { hvm_intsrc_vector, vec
> } )
>  enum hvm_intblk {
>      hvm_intblk_none,      /* not blocked (deliverable) */
>      hvm_intblk_shadow,    /* MOV-SS or STI shadow */
> diff --git a/xen/include/asm-x86/hvm/irq.h b/xen/include/asm-x86/hvm/irq.h
> --- a/xen/include/asm-x86/hvm/irq.h
> +++ b/xen/include/asm-x86/hvm/irq.h
> @@ -54,12 +54,14 @@
>          enum {
>              HVMIRQ_callback_none,
>              HVMIRQ_callback_gsi,
> -            HVMIRQ_callback_pci_intx
> +            HVMIRQ_callback_pci_intx,
> +            HVMIRQ_callback_vector
>          } callback_via_type;
>      };
>      union {
>          uint32_t gsi;
>          struct { uint8_t dev, intx; } pci;
> +        uint32_t vector;
>      } callback_via;
>  
>      /* Number of INTx wires asserting each PCI-ISA link. */
> diff --git a/xen/include/public/features.h b/xen/include/public/features.h
> --- a/xen/include/public/features.h
> +++ b/xen/include/public/features.h
> @@ -68,6 +68,9 @@
>   */
>  #define XENFEAT_gnttab_map_avail_bits      7
>  
> +/* x86: Does this Xen host support the HVM callback vector type? */
> +#define XENFEAT_hvm_callback_vector        8
> +
>  /* x86: pvclock algorithm is safe to use on HVM */
>  #define XENFEAT_hvm_safe_pvclock           9
>  
> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -606,6 +606,9 @@
>  #define VM_ASSIST(_d,_t) (test_bit((_t), &(_d)->vm_assist))
>  
>  #define is_hvm_domain(d) ((d)->is_hvm)
> +#define is_hvm_pv_evtchn_domain(d) (is_hvm_domain(d) && \
> +     d->arch.hvm_domain.irq.callback_via_type == HVMIRQ_callback_vector)
> +#define is_hvm_pv_evtchn_vcpu(v) (is_hvm_pv_evtchn_domain(v->domain))
>  #define is_hvm_vcpu(v)   (is_hvm_domain(v->domain))
>  #define need_iommu(d)    ((d)->need_iommu)
>  
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

  reply	other threads:[~2010-05-24 18:59 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-18 10:31 [PATCH] xen: implement vector callback for evtchn delivery Stefano Stabellini
2010-05-24 18:59 ` Keir Fraser [this message]
2010-05-25  9:55   ` Stefano Stabellini
2010-05-26  6:51     ` Boris Derzhavets
2010-05-26  7:31       ` Keir Fraser
2010-05-26  9:58         ` Boris Derzhavets
2010-05-26 11:12           ` Stefano Stabellini
2010-05-26 12:02             ` Boris Derzhavets
2010-05-26 12:07             ` Boris Derzhavets
  -- strict thread matches above, loose matches on Subject: below --
2010-05-28 16:46 Boris Derzhavets
2010-05-28 16:55 ` Stefano Stabellini
2010-05-28 17:13   ` Boris Derzhavets
2010-05-28 17:21     ` Stefano Stabellini
2010-05-28 17:19       ` Boris Derzhavets
2010-05-27  8:57 Boris Derzhavets
2010-05-27 12:06 ` Stefano Stabellini
2010-05-27 13:06   ` Boris Derzhavets
2010-05-27 14:58     ` Stefano Stabellini
2010-05-27 15:11       ` Boris Derzhavets
2010-05-27 15:16       ` Boris Derzhavets
2010-05-28 15:59         ` Stefano Stabellini
2010-05-27  6:51 Boris Derzhavets
2010-05-10 14:27 Stefano Stabellini
2010-05-10 15:17 ` Jan Beulich
2010-05-11 11:11   ` Stefano Stabellini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=C8208B2E.150A1%keir.fraser@eu.citrix.com \
    --to=keir.fraser@eu.citrix.com \
    --cc=Stefano.Stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).