Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Xen: Devel

[PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled

 

 

Xen devel RSS feed   Index | Next | Previous | View Threaded


yang.z.zhang at intel

Aug 9, 2013, 1:49 AM

Post #1 of 9 (19 views)
Permalink
[PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled

From: Yang Zhang <yang.z.zhang [at] Intel>

In some special cases, we want to ack irq regardless of virtual interrupt delivery.

Signed-off-by: Yang Zhang <yang.z.zhang [at] Intel>
---
xen/arch/x86/hvm/irq.c | 2 +-
xen/arch/x86/hvm/vlapic.c | 4 ++--
xen/include/asm-x86/hvm/vlapic.h | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
index 9eae5de..6a6fb68 100644
--- a/xen/arch/x86/hvm/irq.c
+++ b/xen/arch/x86/hvm/irq.c
@@ -437,7 +437,7 @@ struct hvm_intack hvm_vcpu_ack_pending_irq(
intack.vector = (uint8_t)vector;
break;
case hvm_intsrc_lapic:
- if ( !vlapic_ack_pending_irq(v, intack.vector) )
+ if ( !vlapic_ack_pending_irq(v, intack.vector, 0) )
intack = hvm_intack_none;
break;
case hvm_intsrc_vector:
diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
index 7a154f9..20a36a0 100644
--- a/xen/arch/x86/hvm/vlapic.c
+++ b/xen/arch/x86/hvm/vlapic.c
@@ -1048,11 +1048,11 @@ int vlapic_has_pending_irq(struct vcpu *v)
return irr;
}

-int vlapic_ack_pending_irq(struct vcpu *v, int vector)
+int vlapic_ack_pending_irq(struct vcpu *v, int vector, int force_ack)
{
struct vlapic *vlapic = vcpu_vlapic(v);

- if ( vlapic_virtual_intr_delivery_enabled() )
+ if ( vlapic_virtual_intr_delivery_enabled() && !force_ack )
return 1;

vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]);
diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h
index 021a5f2..d8c9511 100644
--- a/xen/include/asm-x86/hvm/vlapic.h
+++ b/xen/include/asm-x86/hvm/vlapic.h
@@ -96,7 +96,7 @@ bool_t is_vlapic_lvtpc_enabled(struct vlapic *vlapic);
void vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig);

int vlapic_has_pending_irq(struct vcpu *v);
-int vlapic_ack_pending_irq(struct vcpu *v, int vector);
+int vlapic_ack_pending_irq(struct vcpu *v, int vector, int force_ack);

int vlapic_init(struct vcpu *v);
void vlapic_destroy(struct vcpu *v);
--
1.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


andrew.cooper3 at citrix

Aug 9, 2013, 3:28 AM

Post #2 of 9 (17 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

On 09/08/13 09:49, Yang Zhang wrote:
> From: Yang Zhang <yang.z.zhang [at] Intel>
>
> In some special cases, we want to ack irq regardless of virtual interrupt delivery.

Can you explain why and when we might want to force an ack?

>
> Signed-off-by: Yang Zhang <yang.z.zhang [at] Intel>
> ---
> xen/arch/x86/hvm/irq.c | 2 +-
> xen/arch/x86/hvm/vlapic.c | 4 ++--
> xen/include/asm-x86/hvm/vlapic.h | 2 +-
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
> index 9eae5de..6a6fb68 100644
> --- a/xen/arch/x86/hvm/irq.c
> +++ b/xen/arch/x86/hvm/irq.c
> @@ -437,7 +437,7 @@ struct hvm_intack hvm_vcpu_ack_pending_irq(
> intack.vector = (uint8_t)vector;
> break;
> case hvm_intsrc_lapic:
> - if ( !vlapic_ack_pending_irq(v, intack.vector) )
> + if ( !vlapic_ack_pending_irq(v, intack.vector, 0) )
> intack = hvm_intack_none;
> break;
> case hvm_intsrc_vector:
> diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
> index 7a154f9..20a36a0 100644
> --- a/xen/arch/x86/hvm/vlapic.c
> +++ b/xen/arch/x86/hvm/vlapic.c
> @@ -1048,11 +1048,11 @@ int vlapic_has_pending_irq(struct vcpu *v)
> return irr;
> }
>
> -int vlapic_ack_pending_irq(struct vcpu *v, int vector)
> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int force_ack)
> {
> struct vlapic *vlapic = vcpu_vlapic(v);
>
> - if ( vlapic_virtual_intr_delivery_enabled() )
> + if ( vlapic_virtual_intr_delivery_enabled() && !force_ack )
> return 1;

The logic in this entire function seems quite backwards. It
unconditionally returns 1 in all cases, and its sole callsite is in an
if statement.

Something like:

void vlapic_ack_pending_irq(struct vcpu *v, uint8_t vector, bool_t
force_ack)
{
struct vlapic *vlapic = vcpu_vlapic(v);

if ( force_ack || !vlapic_virtual_intr_delivery_enabled() )
{
vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]);
vlapic_clear_irr(vector, vlapic);
}
}

Seems substantially clearer.

~Andrew

>
> vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]);
> diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h
> index 021a5f2..d8c9511 100644
> --- a/xen/include/asm-x86/hvm/vlapic.h
> +++ b/xen/include/asm-x86/hvm/vlapic.h
> @@ -96,7 +96,7 @@ bool_t is_vlapic_lvtpc_enabled(struct vlapic *vlapic);
> void vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig);
>
> int vlapic_has_pending_irq(struct vcpu *v);
> -int vlapic_ack_pending_irq(struct vcpu *v, int vector);
> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int force_ack);
>
> int vlapic_init(struct vcpu *v);
> void vlapic_destroy(struct vcpu *v);


_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


yang.z.zhang at intel

Aug 9, 2013, 3:32 AM

Post #3 of 9 (17 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

Andrew Cooper wrote on 2013-08-09:
> On 09/08/13 09:49, Yang Zhang wrote:
>> From: Yang Zhang <yang.z.zhang [at] Intel>
>>
>> In some special cases, we want to ack irq regardless of virtual
>> interrupt
> delivery.
>
> Can you explain why and when we might want to force an ack?
After vritual_vmexit, if the interrupt already is already recorded in vmcs12. Then we should clear the irr and set isr regardless APIC-v.
>
>>
>> Signed-off-by: Yang Zhang <yang.z.zhang [at] Intel>
>> ---
>> xen/arch/x86/hvm/irq.c | 2 +-
>> xen/arch/x86/hvm/vlapic.c | 4 ++--
>> xen/include/asm-x86/hvm/vlapic.h | 2 +-
>> 3 files changed, 4 insertions(+), 4 deletions(-)
>> diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index
>> 9eae5de..6a6fb68 100644
>> --- a/xen/arch/x86/hvm/irq.c
>> +++ b/xen/arch/x86/hvm/irq.c
>> @@ -437,7 +437,7 @@ struct hvm_intack hvm_vcpu_ack_pending_irq(
>> intack.vector = (uint8_t)vector;
>> break;
>> case hvm_intsrc_lapic:
>> - if ( !vlapic_ack_pending_irq(v, intack.vector) )
>> + if ( !vlapic_ack_pending_irq(v, intack.vector, 0) )
>> intack = hvm_intack_none;
>> break;
>> case hvm_intsrc_vector:
>> diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
>> index 7a154f9..20a36a0 100644
>> --- a/xen/arch/x86/hvm/vlapic.c
>> +++ b/xen/arch/x86/hvm/vlapic.c
>> @@ -1048,11 +1048,11 @@ int vlapic_has_pending_irq(struct vcpu *v)
>> return irr;
>> }
>> -int vlapic_ack_pending_irq(struct vcpu *v, int vector)
>> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int
>> +force_ack)
>> {
>> struct vlapic *vlapic = vcpu_vlapic(v);
>> - if ( vlapic_virtual_intr_delivery_enabled() )
>> + if ( vlapic_virtual_intr_delivery_enabled() && !force_ack )
>> return 1;
>
> The logic in this entire function seems quite backwards. It
> unconditionally returns 1 in all cases, and its sole callsite is in an if statement.
>
> Something like:
>
> void vlapic_ack_pending_irq(struct vcpu *v, uint8_t vector, bool_t
> force_ack) {
> struct vlapic *vlapic = vcpu_vlapic(v);
>
> if ( force_ack || !vlapic_virtual_intr_delivery_enabled() )
> {
> vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]);
> vlapic_clear_irr(vector, vlapic);
> }
> }
>
> Seems substantially clearer.
>
> ~Andrew
>
>>
>> vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]); diff
>> --git a/xen/include/asm-x86/hvm/vlapic.h
>> b/xen/include/asm-x86/hvm/vlapic.h
>> index 021a5f2..d8c9511 100644
>> --- a/xen/include/asm-x86/hvm/vlapic.h
>> +++ b/xen/include/asm-x86/hvm/vlapic.h
>> @@ -96,7 +96,7 @@ bool_t is_vlapic_lvtpc_enabled(struct vlapic
>> *vlapic); void vlapic_set_irq(struct vlapic *vlapic, uint8_t vec,
>> uint8_t trig);
>>
>> int vlapic_has_pending_irq(struct vcpu *v); -int
>> vlapic_ack_pending_irq(struct vcpu *v, int vector);
>> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int
>> +force_ack);
>>
>> int vlapic_init(struct vcpu *v);
>> void vlapic_destroy(struct vcpu *v);


Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


JBeulich at suse

Aug 9, 2013, 5:04 AM

Post #4 of 9 (16 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

>>> On 09.08.13 at 12:32, "Zhang, Yang Z" <yang.z.zhang [at] intel> wrote:
> Andrew Cooper wrote on 2013-08-09:
>> On 09/08/13 09:49, Yang Zhang wrote:
>>> From: Yang Zhang <yang.z.zhang [at] Intel>
>>>
>>> In some special cases, we want to ack irq regardless of virtual
>>> interrupt
>> delivery.
>>
>> Can you explain why and when we might want to force an ack?
> After vritual_vmexit, if the interrupt already is already recorded in
> vmcs12. Then we should clear the irr and set isr regardless APIC-v.

So please add this to the commit message.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


JBeulich at suse

Aug 9, 2013, 5:06 AM

Post #5 of 9 (16 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

>>> On 09.08.13 at 10:49, Yang Zhang <yang.z.zhang [at] intel> wrote:
> From: Yang Zhang <yang.z.zhang [at] Intel>
>
> In some special cases, we want to ack irq regardless of virtual interrupt
> delivery.

Again, the whole change is meaningless. I can see reasons to break
out such preparatory changes when otherwise the resulting patch
would be huge and hard to review. That doesn't seem to be the
case here; it rather looks like the splitting was done pretty arbitrarily
here.

Jan

> Signed-off-by: Yang Zhang <yang.z.zhang [at] Intel>
> ---
> xen/arch/x86/hvm/irq.c | 2 +-
> xen/arch/x86/hvm/vlapic.c | 4 ++--
> xen/include/asm-x86/hvm/vlapic.h | 2 +-
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
> index 9eae5de..6a6fb68 100644
> --- a/xen/arch/x86/hvm/irq.c
> +++ b/xen/arch/x86/hvm/irq.c
> @@ -437,7 +437,7 @@ struct hvm_intack hvm_vcpu_ack_pending_irq(
> intack.vector = (uint8_t)vector;
> break;
> case hvm_intsrc_lapic:
> - if ( !vlapic_ack_pending_irq(v, intack.vector) )
> + if ( !vlapic_ack_pending_irq(v, intack.vector, 0) )
> intack = hvm_intack_none;
> break;
> case hvm_intsrc_vector:
> diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
> index 7a154f9..20a36a0 100644
> --- a/xen/arch/x86/hvm/vlapic.c
> +++ b/xen/arch/x86/hvm/vlapic.c
> @@ -1048,11 +1048,11 @@ int vlapic_has_pending_irq(struct vcpu *v)
> return irr;
> }
>
> -int vlapic_ack_pending_irq(struct vcpu *v, int vector)
> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int force_ack)
> {
> struct vlapic *vlapic = vcpu_vlapic(v);
>
> - if ( vlapic_virtual_intr_delivery_enabled() )
> + if ( vlapic_virtual_intr_delivery_enabled() && !force_ack )
> return 1;
>
> vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]);
> diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h
> index 021a5f2..d8c9511 100644
> --- a/xen/include/asm-x86/hvm/vlapic.h
> +++ b/xen/include/asm-x86/hvm/vlapic.h
> @@ -96,7 +96,7 @@ bool_t is_vlapic_lvtpc_enabled(struct vlapic *vlapic);
> void vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig);
>
> int vlapic_has_pending_irq(struct vcpu *v);
> -int vlapic_ack_pending_irq(struct vcpu *v, int vector);
> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int force_ack);
>
> int vlapic_init(struct vcpu *v);
> void vlapic_destroy(struct vcpu *v);
> --
> 1.7.1




_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


yang.z.zhang at intel

Aug 10, 2013, 7:30 PM

Post #6 of 9 (13 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

Jan Beulich wrote on 2013-08-09:
>>>> On 09.08.13 at 12:32, "Zhang, Yang Z" <yang.z.zhang [at] intel> wrote:
>> Andrew Cooper wrote on 2013-08-09:
>>> On 09/08/13 09:49, Yang Zhang wrote:
>>>> From: Yang Zhang <yang.z.zhang [at] Intel>
>>>>
>>>> In some special cases, we want to ack irq regardless of virtual
>>>> interrupt
>>> delivery.
>>>
>>> Can you explain why and when we might want to force an ack?
>> After vritual_vmexit, if the interrupt already is already recorded
>> in vmcs12. Then we should clear the irr and set isr regardless APIC-v.
>
> So please add this to the commit message.
Sure.

Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


yang.z.zhang at intel

Aug 10, 2013, 7:43 PM

Post #7 of 9 (13 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

Jan Beulich wrote on 2013-08-09:
>>>> On 09.08.13 at 10:49, Yang Zhang <yang.z.zhang [at] intel> wrote:
>> From: Yang Zhang <yang.z.zhang [at] Intel>
>>
>> In some special cases, we want to ack irq regardless of virtual
>> interrupt delivery.
>
> Again, the whole change is meaningless. I can see reasons to break out
> such preparatory changes when otherwise the resulting patch would be
> huge and hard to review. That doesn't seem to be the case here; it
> rather looks like the splitting was done pretty arbitrarily here.
No, splitting the patch is not only for easy reviewing. It is useful for "git bisect" and debug purpose. Also, if the change is independent, we also should to split it into a separate patch.
Here, though the change is minimal, it touches the key interrupt handle logic. It's better to put it into a single patch.

> Jan
>
>> Signed-off-by: Yang Zhang <yang.z.zhang [at] Intel>
>> ---
>> xen/arch/x86/hvm/irq.c | 2 +-
>> xen/arch/x86/hvm/vlapic.c | 4 ++--
>> xen/include/asm-x86/hvm/vlapic.h | 2 +-
>> 3 files changed, 4 insertions(+), 4 deletions(-)
>> diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index
>> 9eae5de..6a6fb68 100644
>> --- a/xen/arch/x86/hvm/irq.c
>> +++ b/xen/arch/x86/hvm/irq.c
>> @@ -437,7 +437,7 @@ struct hvm_intack hvm_vcpu_ack_pending_irq(
>> intack.vector = (uint8_t)vector;
>> break;
>> case hvm_intsrc_lapic:
>> - if ( !vlapic_ack_pending_irq(v, intack.vector) )
>> + if ( !vlapic_ack_pending_irq(v, intack.vector, 0) )
>> intack = hvm_intack_none;
>> break;
>> case hvm_intsrc_vector:
>> diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
>> index 7a154f9..20a36a0 100644
>> --- a/xen/arch/x86/hvm/vlapic.c
>> +++ b/xen/arch/x86/hvm/vlapic.c
>> @@ -1048,11 +1048,11 @@ int vlapic_has_pending_irq(struct vcpu *v)
>> return irr;
>> }
>> -int vlapic_ack_pending_irq(struct vcpu *v, int vector)
>> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int
>> +force_ack)
>> {
>> struct vlapic *vlapic = vcpu_vlapic(v);
>> - if ( vlapic_virtual_intr_delivery_enabled() )
>> + if ( vlapic_virtual_intr_delivery_enabled() && !force_ack )
>> return 1;
>> vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]); diff
>> --git a/xen/include/asm-x86/hvm/vlapic.h
>> b/xen/include/asm-x86/hvm/vlapic.h
>> index 021a5f2..d8c9511 100644
>> --- a/xen/include/asm-x86/hvm/vlapic.h
>> +++ b/xen/include/asm-x86/hvm/vlapic.h
>> @@ -96,7 +96,7 @@ bool_t is_vlapic_lvtpc_enabled(struct vlapic
>> *vlapic); void vlapic_set_irq(struct vlapic *vlapic, uint8_t vec,
>> uint8_t trig);
>>
>> int vlapic_has_pending_irq(struct vcpu *v); -int
>> vlapic_ack_pending_irq(struct vcpu *v, int vector);
>> +int vlapic_ack_pending_irq(struct vcpu *v, int vector, int
>> +force_ack);
>>
>> int vlapic_init(struct vcpu *v);
>> void vlapic_destroy(struct vcpu *v);
>> --
>> 1.7.1
>
>


Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


JBeulich at suse

Aug 11, 2013, 11:47 PM

Post #8 of 9 (3 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

>>> On 11.08.13 at 04:43, "Zhang, Yang Z" <yang.z.zhang [at] intel> wrote:
> Jan Beulich wrote on 2013-08-09:
>>>>> On 09.08.13 at 10:49, Yang Zhang <yang.z.zhang [at] intel> wrote:
>>> From: Yang Zhang <yang.z.zhang [at] Intel>
>>>
>>> In some special cases, we want to ack irq regardless of virtual
>>> interrupt delivery.
>>
>> Again, the whole change is meaningless. I can see reasons to break out
>> such preparatory changes when otherwise the resulting patch would be
>> huge and hard to review. That doesn't seem to be the case here; it
>> rather looks like the splitting was done pretty arbitrarily here.
> No, splitting the patch is not only for easy reviewing. It is useful for
> "git bisect" and debug purpose. Also, if the change is independent, we also
> should to split it into a separate patch.
> Here, though the change is minimal, it touches the key interrupt handle
> logic. It's better to put it into a single patch.

I continue to disagree.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel


yang.z.zhang at intel

Aug 12, 2013, 6:10 PM

Post #9 of 9 (2 views)
Permalink
Re: [PATCH 2/7] Nested VMX: Allow to ack irq even virtual intr delivery is enabled [In reply to]

Jan Beulich wrote on 2013-08-12:
>>>> On 11.08.13 at 04:43, "Zhang, Yang Z" <yang.z.zhang [at] intel> wrote:
>> Jan Beulich wrote on 2013-08-09:
>>>>>> On 09.08.13 at 10:49, Yang Zhang <yang.z.zhang [at] intel> wrote:
>>>> From: Yang Zhang <yang.z.zhang [at] Intel>
>>>>
>>>> In some special cases, we want to ack irq regardless of virtual
>>>> interrupt delivery.
>>>
>>> Again, the whole change is meaningless. I can see reasons to break out
>>> such preparatory changes when otherwise the resulting patch would be
>>> huge and hard to review. That doesn't seem to be the case here; it
>>> rather looks like the splitting was done pretty arbitrarily here.
>> No, splitting the patch is not only for easy reviewing. It is useful for
>> "git bisect" and debug purpose. Also, if the change is independent, we also
>> should to split it into a separate patch.
>> Here, though the change is minimal, it touches the key interrupt handle
>> logic. It's better to put it into a single patch.
>
> I continue to disagree.
OK. Then how about to merge it into patch 6?

Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel [at] lists
http://lists.xen.org/xen-devel

Xen devel RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.