xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xen.org
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [PATCH 27/38] arm: split pending SPIs (global) out from pending PPIs and SGIs (per CPU)
Date: Fri, 1 Jun 2012 15:39:56 +0000	[thread overview]
Message-ID: <1338565207-2888-27-git-send-email-ian.campbell@citrix.com> (raw)
In-Reply-To: <1338565207-2888-1-git-send-email-ian.campbell@citrix.com>

This tracks SPIs in struct arch_domain and PPIs+SGIs in struct arch_vcpu which
seems more logical.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
 xen/arch/arm/vgic.c          |   17 ++++++++++-------
 xen/include/asm-arm/domain.h |   10 ++++++++++
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c
index 629a0da..91d6166 100644
--- a/xen/arch/arm/vgic.c
+++ b/xen/arch/arm/vgic.c
@@ -82,9 +82,8 @@ int domain_vgic_init(struct domain *d)
     d->arch.vgic.shared_irqs =
         xmalloc_array(struct vgic_irq_rank, DOMAIN_NR_RANKS(d));
     d->arch.vgic.pending_irqs =
-        xmalloc_array(struct pending_irq,
-                d->arch.vgic.nr_lines + (32 * d->max_vcpus));
-    for (i=0; i<d->arch.vgic.nr_lines + (32 * d->max_vcpus); i++)
+        xzalloc_array(struct pending_irq, d->arch.vgic.nr_lines);
+    for (i=0; i<d->arch.vgic.nr_lines; i++)
         INIT_LIST_HEAD(&d->arch.vgic.pending_irqs[i].inflight);
     for (i=0; i<DOMAIN_NR_RANKS(d); i++)
         spin_lock_init(&d->arch.vgic.shared_irqs[i].lock);
@@ -98,6 +97,10 @@ int vcpu_vgic_init(struct vcpu *v)
 
     spin_lock_init(&v->arch.vgic.private_irqs.lock);
 
+    memset(&v->arch.vgic.pending_irqs, 0, sizeof(v->arch.vgic.pending_irqs));
+    for (i = 0; i < 32; i++)
+        INIT_LIST_HEAD(&v->arch.vgic.pending_irqs[i].inflight);
+
     /* For SGI and PPI the target is always this CPU */
     for ( i = 0 ; i < 8 ; i++ )
         v->arch.vgic.private_irqs.itargets[i] =
@@ -535,8 +538,7 @@ struct pending_irq *irq_to_pending(struct vcpu *v, unsigned int irq)
     /* Pending irqs allocation strategy: the first vgic.nr_lines irqs
      * are used for SPIs; the rests are used for per cpu irqs */
     if ( irq < 32 )
-        n = &v->domain->arch.vgic.pending_irqs[irq + (v->vcpu_id * 32)
-            + v->domain->arch.vgic.nr_lines];
+        n = &v->arch.vgic.pending_irqs[irq];
     else
         n = &v->domain->arch.vgic.pending_irqs[irq - 32];
     return n;
@@ -548,6 +550,7 @@ void vgic_vcpu_inject_irq(struct vcpu *v, unsigned int irq, int virtual)
     uint8_t priority;
     struct vgic_irq_rank *rank = vgic_irq_rank(v, 8, idx);
     struct pending_irq *iter, *n = irq_to_pending(v, irq);
+    unsigned long flags;
 
     /* irq still pending */
     if (!list_empty(&n->inflight))
@@ -564,7 +567,7 @@ void vgic_vcpu_inject_irq(struct vcpu *v, unsigned int irq, int virtual)
 
     gic_set_guest_irq(irq, GICH_LR_PENDING, priority);
 
-    spin_lock(&v->arch.vgic.lock);
+    spin_lock_irqsave(&v->arch.vgic.lock, flags);
     list_for_each_entry ( iter, &v->arch.vgic.inflight_irqs, inflight )
     {
         if ( iter->priority > priority )
@@ -575,7 +578,7 @@ void vgic_vcpu_inject_irq(struct vcpu *v, unsigned int irq, int virtual)
         }
     }
     list_add_tail(&n->inflight, &v->arch.vgic.inflight_irqs);
-    spin_unlock(&v->arch.vgic.lock);
+    spin_unlock_irqrestore(&v->arch.vgic.lock, flags);
     /* we have a new higher priority irq, inject it into the guest */
 }
 
diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
index 620b26e..32deb52 100644
--- a/xen/include/asm-arm/domain.h
+++ b/xen/include/asm-arm/domain.h
@@ -46,6 +46,10 @@ struct arch_domain
         int ctlr;
         int nr_lines;
         struct vgic_irq_rank *shared_irqs;
+        /*
+         * SPIs are domain global, SGIs and PPIs are per-VCPU and stored in
+         * struct arch_vcpu.
+         */
         struct pending_irq *pending_irqs;
     } vgic;
 
@@ -114,7 +118,13 @@ struct arch_vcpu
     uint32_t gic_lr[64];
 
     struct {
+        /*
+         * SGIs and PPIs are per-VCPU, SPIs are domain global and in
+         * struct arch_domain.
+         */
+        struct pending_irq pending_irqs[32];
         struct vgic_irq_rank private_irqs;
+
         /* This list is ordered by IRQ priority and it is used to keep
          * track of the IRQs that the VGIC injected into the guest.
          * Depending on the availability of LR registers, the IRQs might
-- 
1.7.9.1

  parent reply	other threads:[~2012-06-01 15:39 UTC|newest]

Thread overview: 136+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-01 15:38 [PATCH 0/38] arm: boot a dom1 to "Calibrating delay loop" then hang Ian Campbell
2012-06-01 15:39 ` [PATCH 01/38] arm: allocate top level p2m page for all non-idle domains Ian Campbell
2012-06-01 15:39   ` [PATCH 02/38] arm: handy function to print a walk of the hypervisor page tables Ian Campbell
2012-06-07  8:45     ` Tim Deegan
2012-06-07 11:57       ` Ian Campbell
2012-06-07 12:39         ` Tim Deegan
2012-06-01 15:39   ` [PATCH 03/38] arm: handy function to print a walk of a domain's p2m Ian Campbell
2012-06-07  8:49     ` Tim Deegan
2012-06-07 12:26       ` Ian Campbell
2012-06-07 12:40         ` Tim Deegan
2012-06-07 13:54           ` Ian Campbell
2012-06-07 16:34             ` Ian Campbell
2012-06-07 16:39               ` Ian Campbell
2012-06-07 19:10               ` Tim Deegan
2012-06-01 15:39   ` [PATCH 04/38] arm: correct and expand TLB flush CP15 registers Ian Campbell
2012-06-06 12:45     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 05/38] arm: restore stack on return from trap Ian Campbell
2012-06-06 13:03     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 06/38] arm: enable interrupts while handling traps Ian Campbell
2012-06-06 13:38     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 07/38] arm: hook up domctl and memory_op Ian Campbell
2012-06-06 13:39     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 08/38] arm: allocate and setup a guest vcpu Ian Campbell
2012-06-06 13:46     ` Stefano Stabellini
2012-06-06 13:55       ` Ian Campbell
2012-06-07  9:40         ` Ian Campbell
2012-06-07 17:02           ` Ian Campbell
2012-06-08 10:00             ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 09/38] arm: print domid as part of debug trap Ian Campbell
2012-06-06 13:47     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 10/38] arm: remove unnecessarily verbose print from p2m_load_VTTBR Ian Campbell
2012-06-06 13:47     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 11/38] arm: implement p2m lookup Ian Campbell
2012-06-06 14:01     ` Stefano Stabellini
2012-06-06 14:30       ` Ian Campbell
2012-06-13 13:40         ` Ian Campbell
2012-06-07  9:03     ` Tim Deegan
2012-06-13 15:13       ` Ian Campbell
2012-06-14  8:47         ` Tim Deegan
2012-06-19  9:43           ` Ian Campbell
2012-06-01 15:39   ` [PATCH 12/38] arm: remove hard tabs from init_idle_domain Ian Campbell
2012-06-06 15:13     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 13/38] arm: stub out sync_vcpu_execstate Ian Campbell
2012-06-06 15:15     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 14/38] arm: do not set max_vcpus = 8 in arch_domain_create Ian Campbell
2012-06-06 15:26     ` Stefano Stabellini
2012-06-06 15:29       ` Ian Campbell
2012-06-07 16:57       ` Ian Campbell
2012-06-07 16:59         ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 15/38] arm: implement stub version of flush_tlb_mask Ian Campbell
2012-06-06 15:27     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 16/38] arm: Add simple cpu_{sibling,core}_mask Ian Campbell
2012-06-06 16:13     ` [PATCH 16/38] arm: Add simple cpu_{sibling, core}_mask Stefano Stabellini
2012-06-07  9:08     ` Tim Deegan
2012-06-07 11:35       ` Ian Campbell
2012-06-07 11:42         ` Tim Deegan
2012-06-13 15:18         ` Ian Campbell
2012-06-01 15:39   ` [PATCH 17/38] arm: allow p2m to be created with specific MATTR Ian Campbell
2012-06-06 16:27     ` Stefano Stabellini
2012-06-13 15:33       ` Ian Campbell
2012-06-01 15:39   ` [PATCH 18/38] arm: implement vpl011 (UART) emulator Ian Campbell
2012-06-06 16:57     ` Stefano Stabellini
2012-06-07  9:29     ` Tim Deegan
2012-06-07  9:34       ` Ian Campbell
2012-06-07 10:18         ` Tim Deegan
2012-06-20 13:37           ` Ian Campbell
2012-06-01 15:39   ` [PATCH 19/38] arm: context switch a bunch of guest state Ian Campbell
2012-06-05 17:11     ` Stefano Stabellini
2012-06-06 15:19       ` Ian Campbell
2012-06-06 15:20         ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 20/38] arm: dump a page table walk when va_to_par fails Ian Campbell
2012-06-07  9:32     ` Tim Deegan
2012-06-01 15:39   ` [PATCH 21/38] arm: dump guest s1 walk on data abort which is not a stage 2 issue Ian Campbell
2012-06-07  9:41     ` Tim Deegan
2012-06-20 13:48       ` Ian Campbell
2012-06-01 15:39   ` [PATCH 22/38] arm: implement vcpu_show_execution_state Ian Campbell
2012-06-06 17:26     ` Stefano Stabellini
2012-06-20 13:53       ` Ian Campbell
2012-06-20 13:56         ` Ian Campbell
2012-06-01 15:39   ` [PATCH 23/38] arm: use correct attributes for mappings in copy_from_paddr() Ian Campbell
2012-06-01 16:20     ` David Vrabel
2012-06-06 17:38     ` Stefano Stabellini
2012-06-20 15:38       ` Ian Campbell
2012-06-01 15:39   ` [PATCH 24/38] arm: map fixmaps non-executable Ian Campbell
2012-06-06 17:40     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 25/38] arm: remove old identity map of boot paddr when we are done with it Ian Campbell
2012-06-06 18:04     ` Stefano Stabellini
2012-06-06 18:18       ` Tim Deegan
2012-06-21  8:15         ` Ian Campbell
2012-06-21  9:26           ` Ian Campbell
2012-06-01 15:39   ` [PATCH 26/38] arm: fix locking in create_p2m_entries Ian Campbell
2012-06-07  9:48     ` Tim Deegan
2012-06-07 10:26     ` Stefano Stabellini
2012-06-01 15:39   ` Ian Campbell [this message]
2012-06-07 10:35     ` [PATCH 27/38] arm: split pending SPIs (global) out from pending PPIs and SGIs (per CPU) Stefano Stabellini
2012-06-26  9:03       ` Ian Campbell
2012-06-01 15:39   ` [PATCH 28/38] arm: map GICV in all domains, not just dom0 Ian Campbell
2012-06-07  9:51     ` Tim Deegan
2012-06-26  9:25       ` Ian Campbell
2012-06-07 10:39     ` Stefano Stabellini
2012-06-26 10:18     ` Ian Campbell
2012-06-01 15:39   ` [PATCH 29/38] arm: delay enabling data-cache until paging enabled Ian Campbell
2012-06-01 17:05     ` Tim Deegan
2012-06-01 19:04       ` Ian Campbell
2012-06-07 13:59         ` Tim Deegan
2012-06-26  9:30           ` Ian Campbell
2012-06-07 10:41     ` Stefano Stabellini
2012-06-01 15:39   ` [PATCH 30/38] arm: Upgrade guest barriers to Outer-Shareable. Enable Protected Table Walk Ian Campbell
2012-06-07 10:20     ` Tim Deegan
2012-06-01 15:40   ` [PATCH 31/38] arm: gic.lock can be taken in interrupt context, so lock appropriately Ian Campbell
2012-06-07 10:20     ` Tim Deegan
2012-06-07 10:49     ` Stefano Stabellini
2012-06-26  9:35       ` Ian Campbell
2012-06-26 11:41         ` Stefano Stabellini
2012-06-26 12:25           ` Ian Campbell
2012-06-26 13:45             ` Ian Campbell
2012-06-01 15:40   ` [PATCH 32/38] arm: context switch virtual timer registers Ian Campbell
2012-06-07 10:21     ` Tim Deegan
2012-06-01 15:40   ` [PATCH 33/38] arm: the hyp timer seems to work now, default to using it Ian Campbell
2012-06-07 10:22     ` Tim Deegan
2012-06-01 15:40   ` [PATCH 34/38] HACK: arm: initial XENMAPSPACE_gmfn_foreign Ian Campbell
2012-06-07 10:56     ` Stefano Stabellini
2012-06-01 15:40   ` [PATCH 35/38] arm: move PSR flag definitions into interface, for tools use Ian Campbell
2012-06-07 10:23     ` Tim Deegan
2012-06-01 15:40   ` [PATCH 36/38] libxc: add ARM support to xc_dom (PV domain building) Ian Campbell
2012-06-07 11:38     ` Stefano Stabellini
2012-07-23 13:57       ` Ian Campbell
2012-07-23 14:11         ` Ian Campbell
2012-07-23 14:37           ` David Vrabel
2012-07-23 14:47             ` Ian Campbell
2012-06-01 15:40   ` [PATCH 37/38] HACK: add simple xcbuild Ian Campbell
2012-06-07 11:42     ` Stefano Stabellini
2012-06-07 12:06       ` Ian Campbell
2012-06-01 15:40   ` [PATCH 38/38] HACK: arm: disable hypercall continuations Ian Campbell
2012-06-07 11:00     ` Stefano Stabellini
2012-06-01 16:46 ` [PATCH 0/38] arm: boot a dom1 to "Calibrating delay loop" then hang Ian Campbell

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=1338565207-2888-27-git-send-email-ian.campbell@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /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).