From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v10 7/8] arm/arm64: vgic: Implement KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO ioctl
Date: Mon, 23 Jan 2017 12:06:39 +0100 [thread overview]
Message-ID: <20170123110639.GA15850@cbox> (raw)
In-Reply-To: <CAFEAcA8bZUPC2YTBYTVY3oB4MJFJcKOgT77PN3vkp5gPjVRPgA@mail.gmail.com>
On Mon, Jan 23, 2017 at 10:16:04AM +0000, Peter Maydell wrote:
> On 20 January 2017 at 19:53, Christoffer Dall
> <christoffer.dall@linaro.org> wrote:
> > So last time we had a discussion about whether or not the API should
> > support any random order of restoring the registers, but I cannot see
> > how we can support that, because how can we tell the difference between
> > the following two scenarios without knowing if an interrupt is
> > edge-triggered or level triggered:
> >
> > (1) Clearing the line_level for an edge-triggered interrupt after
> > having set it to pending, which means it should stay pending.
>
> This is userspace doing:
> * set pending-latch to 1
> * set linelevel to 0
>
> right? The pending state is pending-latch | (linelevel & ~edge_trigger),
> and you can recalculate that when userspace updates either of the
> pending-latch state or linelevel. (It will be temporarily wrong
> before userspace has told the kernel about all the state, but
> that's fine because we won't try to run the VM until we've finished
> loading everything.)
>
> > (2) Clearing the line_level for a level-triggered interrupt when the
> > state is already pending for some reason, but the soft_pending
> > (latch) state is not set, in which case the pending state should
> > be removed.
>
> This is userspace doing
> * set pending-latch to 0
> * set line_level to 0
>
> and thus the pending state goes to 0 (same calculation as above).
>
> pending is always a pure logical function of pending-latch,
> linelevel and edge-trigger bits, so as long as you recalculate
> it at the right time then it shouldn't matter which order userspace
> tells you about the three things in.
>
ok, I think you're right that it can be done this way, but it has the
unfortunate consequence of having to change a lot of the implementation.
The reason is that we store the latch state in two different variables,
depening on whether it's an edge- or level-triggered interrupts.
We use the irq->pending field for the computed result (using above
calculaiton) for level interrupts based on irq->line_level and
irq->soft_pending. soft_pending is the latch state for level interrupts
only.
For edge triggered interrupts the computed result and the latch state
are alway the same (right?) so we we only use the irq->pending field for
that.
But unless I didn't have enough coffee this morning, this only works if
you have a-priori knowledge of which interrupts are level and which are
edge. When this is not the case, as in the case of order-free
save/restore, then I think the only solution is to rework the logic so
that the soft_pending field is used for the latch state for both edge
and level interrupts, and the pending field is just the internal
computed value.
Thoughts?
Andre, Marc, Eric, do you agree with the above?
(I wonder how we could go through an entire redesign of the vgic and
still have issues like this, but I do remember we all felt tired when we
finally got to design the soft_pending stuff.)
Thanks,
-Christoffer
next prev parent reply other threads:[~2017-01-23 11:06 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-01 7:09 [PATCH v10 0/8] arm/arm64: vgic: Implement API for vGICv3 live migration vijay.kilari at gmail.com
2016-12-01 7:09 ` [PATCH v10 1/8] arm/arm64: vgic: Implement support for userspace access vijay.kilari at gmail.com
2016-12-01 7:09 ` [PATCH v10 2/8] arm/arm64: vgic: Add distributor and redistributor access vijay.kilari at gmail.com
2016-12-01 7:09 ` [PATCH v10 3/8] arm/arm64: vgic: Introduce find_reg_by_id() vijay.kilari at gmail.com
2016-12-01 7:09 ` [PATCH v10 4/8] irqchip/gic-v3: Add missing system register definitions vijay.kilari at gmail.com
2016-12-01 7:09 ` [PATCH v10 5/8] arm/arm64: vgic: Introduce VENG0 and VENG1 fields to vmcr struct vijay.kilari at gmail.com
2016-12-01 7:09 ` [PATCH v10 6/8] arm/arm64: vgic: Implement VGICv3 CPU interface access vijay.kilari at gmail.com
2016-12-16 12:25 ` Auger Eric
2016-12-19 9:47 ` Vijay Kilari
2016-12-19 10:20 ` Auger Eric
2017-01-20 19:26 ` Christoffer Dall
2016-12-19 17:05 ` Auger Eric
2017-01-20 19:27 ` Christoffer Dall
2017-01-20 19:27 ` Christoffer Dall
2016-12-01 7:09 ` [PATCH v10 7/8] arm/arm64: vgic: Implement KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO ioctl vijay.kilari at gmail.com
2016-12-16 12:07 ` Auger Eric
2016-12-16 12:44 ` Peter Maydell
2017-01-20 19:54 ` Christoffer Dall
2017-01-20 19:53 ` Christoffer Dall
2017-01-23 10:16 ` Peter Maydell
2017-01-23 11:06 ` Christoffer Dall [this message]
2017-01-23 11:41 ` Peter Maydell
2017-01-23 13:42 ` Christoffer Dall
2016-12-01 7:09 ` [PATCH v10 8/8] arm/arm64: Documentation: Update arm-vgic-v3.txt vijay.kilari at gmail.com
2016-12-16 12:18 ` Auger Eric
2017-01-20 19:57 ` Christoffer Dall
2017-01-23 10:52 ` Vijay Kilari
2017-01-23 11:20 ` Christoffer Dall
2017-01-23 11:33 ` Vijay Kilari
2017-01-23 11:43 ` Christoffer Dall
2017-01-19 2:13 ` [PATCH v10 0/8] arm/arm64: vgic: Implement API for vGICv3 live migration Shannon Zhao
2017-01-20 13:51 ` Christoffer Dall
2017-01-20 19:59 ` Christoffer Dall
2017-01-23 10:24 ` Vijay Kilari
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=20170123110639.GA15850@cbox \
--to=christoffer.dall@linaro.org \
--cc=linux-arm-kernel@lists.infradead.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