From: Julien Grall <julien.grall@linaro.org>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
xen-devel@lists.xensource.com
Cc: julien.grall@citrix.com, Ian.Campbell@citrix.com
Subject: Re: [PATCH-4.5 3/4] xen/arm: do not request maintenance_interrupts
Date: Fri, 07 Feb 2014 22:45:28 +0000 [thread overview]
Message-ID: <52F56208.3090504@linaro.org> (raw)
In-Reply-To: <1391799378-31664-3-git-send-email-stefano.stabellini@eu.citrix.com>
Hi Stefano,
On 07/02/14 18:56, Stefano Stabellini wrote:
> Do not set GICH_LR_MAINTENANCE_IRQ for every interrupt with set in the
> GICH_LR registers.
>
> Introduce a new function, gic_clear_lrs, that goes over the GICH_LR
> registers, clear the invalid ones and free the corresponding interrupts
> from the inflight queue if appropriate. Add the interrupt to lr_pending
> if the GIC_IRQ_GUEST_PENDING is still set.
>
> Call gic_clear_lrs from gic_restore_state and on return to guest
> (gic_inject).
>
> Remove the now unused code in maintenance_interrupts and gic_irq_eoi.
>
> In vgic_vcpu_inject_irq, if the target is a vcpu running on another cpu,
> send and SGI to it to interrupt it and force it to clear the old LRs.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
> xen/arch/arm/gic.c | 126 ++++++++++++++++++++++-----------------------------
> xen/arch/arm/vgic.c | 3 +-
> 2 files changed, 56 insertions(+), 73 deletions(-)
>
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 215b679..87bd5d3 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> +static void gic_clear_lrs(struct vcpu *v)
> +{
> + struct pending_irq *p;
> + int i = 0, irq;
> + uint32_t lr;
> + bool_t inflight;
> +
> + ASSERT(!local_irq_is_enabled());
> +
> + while ((i = find_next_bit((const long unsigned int *) &this_cpu(lr_mask),
> + nr_lrs, i)) < nr_lrs) {
> + lr = GICH[GICH_LR + i];
> + if ( !(lr & (GICH_LR_PENDING|GICH_LR_ACTIVE)) )
> + {
> + if ( lr & GICH_LR_HW )
> + irq = (lr >> GICH_LR_PHYSICAL_SHIFT) & GICH_LR_PHYSICAL_MASK;
> + else
> + irq = (lr >> GICH_LR_VIRTUAL_SHIFT) & GICH_LR_VIRTUAL_MASK;
> +
The if sentence can be simply by:
irq = (lr >> GICH_LR_VIRTUAL_SHIFT) & GICH_LR_VIRTUAL_MASK;
> + inflight = 0;
> + GICH[GICH_LR + i] = 0;
> + clear_bit(i, &this_cpu(lr_mask));
> +
> + spin_lock(&gic.lock);
> + p = irq_to_pending(v, irq);
> + if ( p->desc != NULL )
> + p->desc->status &= ~IRQ_INPROGRESS;
> + clear_bit(GIC_IRQ_GUEST_VISIBLE, &p->status);
> + if ( test_bit(GIC_IRQ_GUEST_PENDING, &p->status) &&
> + test_bit(GIC_IRQ_GUEST_ENABLED, &p->status))
> + {
I would add a WARN_ON(p->desc != NULL) here. AFAIK, this code path
shouldn't be used for physical IRQ.
--
Julien Grall
next prev parent reply other threads:[~2014-02-07 22:45 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-07 18:56 [PATCH-4.5 0/4] remove maintenance interrupts Stefano Stabellini
2014-02-07 18:56 ` [PATCH-4.5 1/4] xen/arm: remove unused virtual parameter from vgic_vcpu_inject_irq Stefano Stabellini
2014-02-07 22:06 ` Julien Grall
2014-02-07 18:56 ` [PATCH-4.5 2/4] xen/arm: support HW interrupts in gic_set_lr Stefano Stabellini
2014-02-07 22:31 ` Julien Grall
2014-02-10 16:50 ` Stefano Stabellini
2014-02-07 18:56 ` [PATCH-4.5 3/4] xen/arm: do not request maintenance_interrupts Stefano Stabellini
2014-02-07 22:45 ` Julien Grall [this message]
2014-02-10 17:03 ` Stefano Stabellini
2014-02-10 17:21 ` Julien Grall
2014-02-07 23:10 ` Julien Grall
2014-02-10 17:06 ` Stefano Stabellini
2014-02-10 17:09 ` Ian Campbell
2014-02-10 17:16 ` Stefano Stabellini
2014-02-10 17:18 ` Ian Campbell
2014-02-10 17:24 ` Stefano Stabellini
2014-02-10 17:33 ` Ian Campbell
2014-02-10 17:11 ` Julien Grall
2014-02-07 18:56 ` [PATCH-4.5 4/4] xen/arm: set GICH_HCR_NPIE if all the LRs are in use Stefano Stabellini
2014-02-07 23:39 ` Julien Grall
2014-02-10 16:59 ` Stefano Stabellini
2014-02-10 17:14 ` Julien Grall
2014-02-10 17:16 ` Stefano Stabellini
2014-02-07 23:22 ` [PATCH-4.5 0/4] remove maintenance interrupts Julien Grall
2014-02-10 17:08 ` 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=52F56208.3090504@linaro.org \
--to=julien.grall@linaro.org \
--cc=Ian.Campbell@citrix.com \
--cc=julien.grall@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.