The patch isn't for 4.0. You can apply it by hand anyway. The missing
hvm_safe_pvclock doesn't matter.
K.
On 26/05/2010 07:51, "Boris Derzhavets" <bderzhavets@xxxxxxxxx> wrote:
> Patch bellow contains :-
>
> --- a/xen/common/kernel.c Tue May 25 09:08:34 2010 +0100
> +++ b/xen/common/kernel.c Tue May 25 10:44:07 2010 +0100
> @@ -260,7 +260,8 @@
> (1U << XENFEAT_highmem_assist) |
> (1U << XENFEAT_gnttab_map_avail_bits);
> else
> - fi.submap |= (1U << XENFEAT_hvm_safe_pvclock);
> + fi.submap |= (1U << XENFEAT_hvm_safe_pvclock) |
> + (1U << XENFEAT_hvm_callback_vector);
> #endif
>
> However, file xen/common/kernel.c under xen-4.0.0 doesn't contain entry
>
> fi.submap |= (1U << XENFEAT_hvm_safe_pvclock);
>
> Boris.
>
> --- On Tue, 5/25/10, Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> wrote:
>>
>> From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
>> Subject: Re: [Xen-devel] [PATCH] xen: implement vector callback for evtchn
>> delivery
>> To: "Keir Fraser" <Keir.Fraser@xxxxxxxxxxxxx>
>> Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, "Stefano
>> Stabellini" <Stefano.Stabellini@xxxxxxxxxxxxx>
>> Date: Tuesday, May 25, 2010, 5:55 AM
>>
>> On Mon, 24 May 2010, Keir Fraser wrote:
>>> Please add documentation to include/public/hvm/param.h about how to specify
>>> the new callback method, and detect when it is available. Move the new
>>> is_hvm_pv_blah macros out into an appropriate include/asm-x86 header file --
>>> They are not arch independent.
>>
>> Done.
>>
>> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx
>> </mc/compose?to=stefano.stabellini@xxxxxxxxxxxxx> >
>>
>> ---
>>
>>
>> diff -r 12c79a476007 xen/arch/x86/hvm/irq.c
>> --- a/xen/arch/x86/hvm/irq.c Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/arch/x86/hvm/irq.c Tue May 25 10:44:07 2010 +0100
>> @@ -185,16 +185,16 @@
>>
>> void hvm_assert_evtchn_irq(struct vcpu *v)
>> {
>> - if ( v->vcpu_id != 0 )
>> - return;
>> -
>> if ( unlikely(in_irq() || !local_irq_is_enabled()) )
>> {
>> tasklet_schedule(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet);
>> return;
>> }
>>
>> - hvm_set_callback_irq_level(v);
>> + if ( is_hvm_pv_evtchn_vcpu(v) )
>> + vcpu_kick(v);
>> + else if ( v->vcpu_id == 0 )
>> + hvm_set_callback_irq_level(v);
>> }
>>
>> void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq)
>> @@ -251,7 +251,7 @@
>>
>> via_type = (uint8_t)(via >> 56) + 1;
>> if ( ((via_type == HVMIRQ_callback_gsi) && (via == 0)) ||
>> - (via_type > HVMIRQ_callback_pci_intx) )
>> + (via_type > HVMIRQ_callback_vector) )
>> via_type = HVMIRQ_callback_none;
>>
>> spin_lock(&d->arch.hvm_domain.irq_lock);
>> @@ -297,6 +297,9 @@
>> if ( hvm_irq->callback_via_asserted )
>> __hvm_pci_intx_assert(d, pdev, pintx);
>> break;
>> + case HVMIRQ_callback_vector:
>> + hvm_irq->callback_via.vector = (uint8_t)via;
>> + break;
>> default:
>> break;
>> }
>> @@ -312,6 +315,10 @@
>> case HVMIRQ_callback_pci_intx:
>> printk("PCI INTx Dev 0x%02x Int%c\n", pdev, 'A' + pintx);
>> break;
>> + case HVMIRQ_callback_vector:
>> + printk("Set HVMIRQ_callback_vector to %u\n",
>> + hvm_irq->callback_via.vector);
>> + break;
>> default:
>> printk("None\n");
>> break;
>> @@ -323,6 +330,10 @@
>> struct hvm_domain *plat = &v->domain->arch.hvm_domain;
>> int vector;
>>
>> + if (plat->irq.callback_via_type == HVMIRQ_callback_vector &&
>> + vcpu_info(v, evtchn_upcall_pending))
>> + return hvm_intack_vector(plat->irq.callback_via.vector);
>> +
>> if ( unlikely(v->nmi_pending) )
>> return hvm_intack_nmi;
>>
>> @@ -363,6 +374,8 @@
>> case hvm_intsrc_lapic:
>> if ( !vlapic_ack_pending_irq(v, intack.vector) )
>> intack = hvm_intack_none;
>> + break;
>> + case hvm_intsrc_vector:
>> break;
>> default:
>> intack = hvm_intack_none;
>> diff -r 12c79a476007 xen/arch/x86/hvm/vmx/intr.c
>> --- a/xen/arch/x86/hvm/vmx/intr.c Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/arch/x86/hvm/vmx/intr.c Tue May 25 10:44:07 2010 +0100
>> @@ -164,7 +164,8 @@
>> {
>> HVMTRACE_2D(INJ_VIRQ, intack.vector, /*fake=*/ 0);
>> vmx_inject_extint(intack.vector);
>> - pt_intr_post(v, intack);
>> + if (intack.source != hvm_intsrc_vector)
>> + pt_intr_post(v, intack);
>> }
>>
>> /* Is there another IRQ to queue up behind this one? */
>> diff -r 12c79a476007 xen/common/kernel.c
>> --- a/xen/common/kernel.c Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/common/kernel.c Tue May 25 10:44:07 2010 +0100
>> @@ -260,7 +260,8 @@
>> (1U << XENFEAT_highmem_assist) |
>> (1U << XENFEAT_gnttab_map_avail_bits);
>> else
>> - fi.submap |= (1U << XENFEAT_hvm_safe_pvclock);
>> + fi.submap |= (1U << XENFEAT_hvm_safe_pvclock) |
>> + (1U << XENFEAT_hvm_callback_vector);
>> #endif
>> break;
>> default:
>> diff -r 12c79a476007 xen/include/asm-x86/domain.h
>> --- a/xen/include/asm-x86/domain.h Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/include/asm-x86/domain.h Tue May 25 10:44:07 2010 +0100
>> @@ -18,6 +18,10 @@
>> #define is_pv_32on64_domain(d) (0)
>> #endif
>> #define is_pv_32on64_vcpu(v) (is_pv_32on64_domain((v)->domain))
>> +
>> +#define is_hvm_pv_evtchn_domain(d) (is_hvm_domain(d) && \
>> + d->arch.hvm_domain.irq.callback_via_type == HVMIRQ_callback_vector)
>> +#define is_hvm_pv_evtchn_vcpu(v) (is_hvm_pv_evtchn_domain(v->domain))
>>
>> #define VCPU_TRAP_NMI 1
>> #define VCPU_TRAP_MCE 2
>> diff -r 12c79a476007 xen/include/asm-x86/hvm/hvm.h
>> --- a/xen/include/asm-x86/hvm/hvm.h Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/include/asm-x86/hvm/hvm.h Tue May 25 10:44:07 2010 +0100
>> @@ -33,7 +33,8 @@
>> hvm_intsrc_pic,
>> hvm_intsrc_lapic,
>> hvm_intsrc_nmi,
>> - hvm_intsrc_mce
>> + hvm_intsrc_mce,
>> + hvm_intsrc_vector
>> };
>> struct hvm_intack {
>> uint8_t source; /* enum hvm_intsrc */
>> @@ -44,6 +45,7 @@
>> #define hvm_intack_lapic(vec) ( (struct hvm_intack) { hvm_intsrc_lapic, vec
>> } )
>> #define hvm_intack_nmi ( (struct hvm_intack) { hvm_intsrc_nmi, 2 }
>> )
>> #define hvm_intack_mce ( (struct hvm_intack) { hvm_intsrc_mce, 18 }
>> )
>> +#define hvm_intack_vector(vec)( (struct hvm_intack) { hvm_intsrc_vector, vec
>> } )
>> enum hvm_intblk {
>> hvm_intblk_none, /* not blocked (deliverable) */
>> hvm_intblk_shadow, /* MOV-SS or STI shadow */
>> diff -r 12c79a476007 xen/include/asm-x86/hvm/irq.h
>> --- a/xen/include/asm-x86/hvm/irq.h Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/include/asm-x86/hvm/irq.h Tue May 25 10:44:07 2010 +0100
>> @@ -54,12 +54,14 @@
>> enum {
>> HVMIRQ_callback_none,
>> HVMIRQ_callback_gsi,
>> - HVMIRQ_callback_pci_intx
>> + HVMIRQ_callback_pci_intx,
>> + HVMIRQ_callback_vector
>> } callback_via_type;
>> };
>> union {
>> uint32_t gsi;
>> struct { uint8_t dev, intx; } pci;
>> + uint32_t vector;
>> } callback_via;
>>
>> /* Number of INTx wires asserting each PCI-ISA link. */
>> diff -r 12c79a476007 xen/include/public/features.h
>> --- a/xen/include/public/features.h Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/include/public/features.h Tue May 25 10:44:07 2010 +0100
>> @@ -68,6 +68,9 @@
>> */
>> #define XENFEAT_gnttab_map_avail_bits 7
>>
>> +/* x86: Does this Xen host support the HVM callback vector type? */
>> +#define XENFEAT_hvm_callback_vector 8
>> +
>> /* x86: pvclock algorithm is safe to use on HVM */
>> #define XENFEAT_hvm_safe_pvclock 9
>>
>> diff -r 12c79a476007 xen/include/public/hvm/params.h
>> --- a/xen/include/public/hvm/params.h Tue May 25 09:08:34 2010 +0100
>> +++ b/xen/include/public/hvm/params.h Tue May 25 10:44:07 2010 +0100
>> @@ -33,6 +33,9 @@
>> * val[63:56] == 1: val[55:0] is a delivery PCI INTx line, as follows:
>> * Domain = val[47:32], Bus = val[31:16],
>> * DevFn = val[15: 8], IntX = val[ 1: 0]
>> + * val[63:56] == 2: val[7:0] is a vector number, check for
>> + * XENFEAT_hvm_callback_vector to know if this delivery
>> + * method is available.
>> * If val == 0 then CPU0 event-channel notifications are not delivered.
>> */
>> #define HVM_PARAM_CALLBACK_IRQ 0
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxxxxxxxx </mc/compose?to=Xen-devel@xxxxxxxxxxxxxxxxxxx>
>> http://lists.xensource.com/xen-devel
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|