From: Dario Faggioli <dario.faggioli@citrix.com>
To: Feng Wu <feng.wu@intel.com>, xen-devel@lists.xen.org
Cc: George Dunlap <george.dunlap@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Kevin Tian <kevin.tian@intel.com>, Keir Fraser <keir@xen.org>,
Jan Beulich <jbeulich@suse.com>
Subject: Re: [PATCH v8 15/17] vmx: VT-d posted-interrupt core logic handling
Date: Mon, 26 Oct 2015 15:39:30 +0100 [thread overview]
Message-ID: <1445870370.2717.103.camel@citrix.com> (raw)
In-Reply-To: <1444640103-4685-16-git-send-email-feng.wu@intel.com>
[-- Attachment #1.1: Type: text/plain, Size: 7406 bytes --]
Hey,
Here I am reviewing this patch, sorry for the delay.
Ok, we have discussed a lot about all this, and in fact I had to go
back in my mail archive and re-read the rather long sub-thread for this
patch in v7. :-)
Also, in that thread, I found (as I was recalling there being) a couple of open questions, one even pointing to the possibility of adopting a different design for this part of the code, which I am not sure could have been considered a closed matter.
In any case, it would have been nice, given the situation, if you'd have put a few words about, e.g., which solution you ended up implementing and why, either in the cover or here (e.g., in the '---' area).
From the design point of view, I said during v7 that I don't dislike having some of the things that this feature requires dpme in (VMX specific part of) the context switch path, and that is still valid.
What I really don't like much is this blocking cancellation hook you have introduced.
I mean...
On Mon, 2015-10-12 at 16:55 +0800, Feng Wu wrote:
> - Add the following hooks, this part was suggested
> by George Dunlap <george.dunlap@eu.citrix.com> and
> Dario Faggioli <dario.faggioli@citrix.com>.
> * arch_vcpu_block()
> Called alled before vcpu is blocking and update the PID
> (posted-interrupt descriptor).
>
> * arch_vcpu_block_cancel()
> Called when interrupts come in during blocking.
>
... This one.
Reason is, hooks are not, IMO, among the nicest things. You have to
remember to call them, you have to put the call to them in the proper
place, etc., when writing the code. OTOH, when reading the code, they
break the flow and force one to go and figure out what happens in
potentially not so related areas. In summary, they're hard to get
right. :-/
That being said, I can live with this, but I wonder whether we really
can't do without. For instance, Jan said in the v7 thread:
"Couldn't this be taken care of by, if necessary, adjusting PI state
in vmx_do_resume()?"
This is actually what started the sub-sub-thread about the alternative
design of doing everything during VMENTERs/VMEXITs. If you are
unconvinced about going that path all the way, would at least do the
fixup in there (i.e., taking care of the case where we called
arch_vcpu_block() but then we did not block) work and make sense?
Actually, I think even another possible implementation variant that was
suggested at some point (by George, in this case, for other reasons and
purposes) could make this adding this hook unnecessary, i.e.:
"vcpu_block()
set(_VPF_blocked)
local_events_need_delivery()
hvm_vcpu_has_pending_irq()
...
context_switch
v->arch.block()
- Add v to pcpu.pi_blocked_vcpu
- NV => pi_wakeup_vector
If we do it [this] way, and an interrupt comes in before the context
switch is finished, it will call posted_intr_vector. We can, at that
point, check to see if the current vcpu is marked as blocked. If it
is, we can call vcpu_unblock() without having to modify NV or worry
about adding / removing the vcpu from the pi_blocked_vcpu list."
At the time, I "voted against" this design, because it seemed we could
manage to handle interrupt ('regular' and posted) happening during
blocking in one and unified way, and with _only_ arch_vcpu_block(). If
that is no longer the case (and it's not, as we're adding more hooks,
and the need to call the second is a special case being introduced by
PI), it may be worth reconsidering things...
So, all in all, I don't know. As said, I don't like this cancellation
hook because it's one more hook and because --while I see why it's
useful in this specific case-- I don't like having it in generic code
(in schedule.c), and even less having it called in two places
(vcpu_block() and do_pool()). However, if others (Jan and George, I
guess) are not equally concerned about it, I can live with it.
Thoughts?
> * vmx_pi_switch_from()
> Called before context switch, we update the PID when the
> vCPU is preempted or going to sleep.
>
> * vmx_pi_switch_to()
> Called after context switch, we update the PID when the vCPU
> is going to run.
>
> * arch_vcpu_wake_prepare()
> It will be called when waking up the vCPU, we update
> the posted interrupt descriptor when the vCPU is
> unblocked.
>
The rest of the patch seems fine to me (at least the scheduling related
implications).
Just a few (pretty minor) comments.
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1608,6 +1608,18 @@ void context_switch(struct vcpu *prev, struct
> vcpu *next)
> if ( (per_cpu(curr_vcpu, cpu) == next) ||
> (is_idle_domain(nextd) && cpu_online(cpu)) )
> {
> + /*
> + * When we handle the lazy context switch for the following
> + * two scenarios:
> + * - Preempted by a tasklet, which uses in an idle context
> + * - the prev vcpu is in offline and no new available vcpus
> in run queue
> + * We don't change the 'SN' bit in posted-interrupt
> descriptor, this
> + * may incur spurious PI notification events, but since PI
> notification
> + * event is only sent when 'ON' is clear, and once the PI
> notificatoin
> + * is sent, ON is set by hardware, so not so many spurious
> events and
> + * it is not a big deal.
> + */
> +
> local_irq_enable();
> }
>
This comment: can't it leave somewhere else, more VMX and/or PI
related?
I know this is arch code already but, still, if I'm here, I am reading
and trying to understand how context switch works, potentially, not
being interested in PI at all... And yet I find this doc comment,
talking about some SN and ON bits, without even defining what they are
and what they mean. :-/
Really, I'm not saying we shouldn't have it. On the contrary, it has
some valuable content in it. Can we just find another place where to
put it?
Also, about the content. The last part, when it talks about spurious
interrupts, it says they're not a problem because we won't get that
many. I think that someone not very familiar with this things could use
being also told that it is ok/safe to get them (i.e., they don't get
lost, etc.). There's an email from George that explain this quite well.
I'd also be ok with this particular thing going in the patch changelog,
rather than in a comment, as far as it is somewhere.
> diff --git a/xen/common/schedule.c b/xen/common/schedule.c
> index 3eefed7..383fd62 100644
> --- a/xen/common/schedule.c
> +++ b/xen/common/schedule.c
> @@ -800,10 +802,13 @@ void vcpu_block(void)
>
> set_bit(_VPF_blocked, &v->pause_flags);
>
> + arch_vcpu_block(v);
> +
>
This is maybe not so big of a deal but, since we call this pretty early
in the blocking path, and _especially_ if we are to keep the
cancellation hook, we may want to consider arch_vcpu_block_prepare()
(as we did for wake).
Regards,
Dario
--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
[-- Attachment #2: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2015-10-26 14:39 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-12 8:54 [PATCH v8 00/17] Add VT-d Posted-Interrupts support Feng Wu
2015-10-12 8:54 ` [PATCH v8 01/17] VT-d Posted-intterrupt (PI) design Feng Wu
2015-10-12 10:41 ` Andrew Cooper
2015-10-13 0:53 ` Wu, Feng
2015-10-29 15:56 ` Dario Faggioli
2015-10-12 8:54 ` [PATCH v8 02/17] Add cmpxchg16b support for x86-64 Feng Wu
2015-10-13 15:29 ` Jan Beulich
2015-10-14 5:57 ` Wu, Feng
2015-10-14 9:05 ` Jan Beulich
2015-10-14 9:29 ` Wu, Feng
2015-10-14 9:45 ` Jan Beulich
2015-10-14 10:03 ` Wu, Feng
2015-10-14 10:21 ` Jan Beulich
2015-10-14 10:25 ` Wu, Feng
2015-10-12 8:54 ` [PATCH v8 03/17] iommu: Add iommu_intpost to control VT-d Posted-Interrupts feature Feng Wu
2015-10-12 8:54 ` [PATCH v8 04/17] vt-d: VT-d Posted-Interrupts feature detection Feng Wu
2015-10-12 8:54 ` [PATCH v8 05/17] vmx: Extend struct pi_desc to support VT-d Posted-Interrupts Feng Wu
2015-10-12 8:54 ` [PATCH v8 06/17] vmx: Add some helper functions for Posted-Interrupts Feng Wu
2015-10-12 8:54 ` [PATCH v8 07/17] vmx: Initialize VT-d Posted-Interrupts Descriptor Feng Wu
2015-10-12 8:54 ` [PATCH v8 08/17] vmx: Suppress posting interrupts when 'SN' is set Feng Wu
2015-10-12 8:54 ` [PATCH v8 09/17] VT-d: Remove pointless casts Feng Wu
2015-10-12 8:54 ` [PATCH v8 10/17] vt-d: Extend struct iremap_entry to support VT-d Posted-Interrupts Feng Wu
2015-10-12 8:54 ` [PATCH v8 11/17] vt-d: Add API to update IRTE when VT-d PI is used Feng Wu
2015-10-12 8:54 ` [PATCH v8 12/17] x86: move some APIC related macros to apicdef.h Feng Wu
2015-10-12 8:54 ` [PATCH v8 13/17] Update IRTE according to guest interrupt config changes Feng Wu
2015-10-12 8:55 ` [PATCH v8 14/17] vmx: Properly handle notification event when vCPU is running Feng Wu
2015-10-12 8:55 ` [PATCH v8 15/17] vmx: VT-d posted-interrupt core logic handling Feng Wu
2015-10-26 14:39 ` Dario Faggioli [this message]
2015-10-27 5:19 ` Wu, Feng
2015-10-27 9:51 ` Jan Beulich
2015-10-28 1:50 ` Dario Faggioli
2015-10-28 2:58 ` Wu, Feng
2015-10-28 9:03 ` Jan Beulich
2015-10-28 16:36 ` Dario Faggioli
2015-10-29 5:39 ` Wu, Feng
2015-10-29 9:26 ` Dario Faggioli
2015-10-29 14:07 ` Wu, Feng
2015-10-27 12:16 ` Dario Faggioli
2015-10-28 2:40 ` Wu, Feng
2015-10-27 12:22 ` Dario Faggioli
2015-10-12 8:55 ` [PATCH v8 16/17] VT-d: Dump the posted format IRTE Feng Wu
2015-10-12 8:55 ` [PATCH v8 17/17] Add a command line parameter for VT-d posted-interrupts Feng Wu
2015-10-23 2:12 ` [PATCH v8 00/17] Add VT-d Posted-Interrupts support Wu, Feng
2015-10-23 8:13 ` Jan Beulich
2015-10-23 8:35 ` Wu, Feng
2015-10-23 8:46 ` Dario Faggioli
2015-10-23 8:52 ` Wu, Feng
2015-10-29 10:51 ` Dario Faggioli
2015-10-29 14:05 ` Wu, Feng
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=1445870370.2717.103.camel@citrix.com \
--to=dario.faggioli@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=feng.wu@intel.com \
--cc=george.dunlap@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.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).