|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/viridian: Add Partition Reference Time enlightenment
>>> On 25.09.14 at 17:50, <paul.durrant@xxxxxxxxxx> wrote:
> The presence of the partition reference time enlightenment persuades newer
> versions of Windows to prefer the TSC as their primary time source. Hence,
> if rdtsc is not being emulated and is invariant then many vmexits (for
> alternative time sources such as the HPET or reference counter MSR) can
> be avoided.
>
> If the VM is migrated to a host where TSC is no longer invariant and/or
> TSC is emulated then the enlightenment is disabled.
Which means performance of a guest post migration can change
dramatically. Is that really a good thing?
> + do
> + p->TscSequence++;
> + while ( p->TscSequence == 0xFFFFFFFF ||
> + p->TscSequence == 0 ); /* Avoid both 'invalid' values */
I don't think we ever use "naked" do/while constructs - please add
figure braces here.
> +static void initialize_reference_tsc(struct domain *d)
> +{
> + unsigned long gmfn =
> d->arch.hvm_domain.viridian.reference_tsc.fields.pfn;
> + struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
> + HV_REFERENCE_TSC_PAGE *p;
> +
> + if ( !page || !get_page_type(page, PGT_writable_page) )
> + {
> + if ( page )
> + put_page(page);
> + gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
> + page ? page_to_mfn(page) : INVALID_MFN);
> + return;
> + }
> +
> + p = __map_domain_page(page);
> +
> + memset(p, 0, sizeof(*p));
clear_page()
> @@ -341,9 +433,12 @@ int rdmsr_viridian_regs(uint32_t idx, uint64_t *val)
> *val = vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI);
> break;
>
> - case VIRIDIAN_MSR_APIC_ASSIST:
> - perfc_incr(mshv_rdmsr_apic_msr);
> - *val = v->arch.hvm_vcpu.viridian.apic_assist.raw;
> + case VIRIDIAN_MSR_REFERENCE_TSC:
> + if ( !(viridian_feature_mask(d) & HVMPV_reference_tsc) )
> + return 0;
> +
> + perfc_incr(mshv_rdmsr_tsc_msr);
> + *val = d->arch.hvm_domain.viridian.reference_tsc.raw;
> break;
Did you really mean to delete the VIRIDIAN_MSR_APIC_ASSIST code?
> @@ -460,11 +556,37 @@ static int viridian_load_domain_ctxt(struct domain *d,
> hvm_domain_context_t *h)
> {
> struct hvm_viridian_domain_context ctxt;
>
> - if ( hvm_load_entry(VIRIDIAN_DOMAIN, h, &ctxt) != 0 )
> + if ( hvm_load_entry_zeroextend(VIRIDIAN_DOMAIN, h, &ctxt) != 0 )
> return -EINVAL;
>
> d->arch.hvm_domain.viridian.hypercall_gpa.raw = ctxt.hypercall_gpa;
> d->arch.hvm_domain.viridian.guest_os_id.raw = ctxt.guest_os_id;
> + d->arch.hvm_domain.viridian.reference_tsc.raw = ctxt.reference_tsc;
> +
> + if ( d->arch.hvm_domain.viridian.reference_tsc.fields.enabled )
> + {
> + unsigned long gmfn;
> + struct page_info *page;
> + HV_REFERENCE_TSC_PAGE *p;
> +
> + gmfn = d->arch.hvm_domain.viridian.reference_tsc.fields.pfn;
> + page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
> +
> + if ( !page || !get_page_type(page, PGT_writable_page) )
> + {
> + if ( page )
> + put_page(page);
> + return -EINVAL;
> + }
> +
> + p = __map_domain_page(page);
> +
> + update_reference_tsc(d, p);
> +
> + unmap_domain_page(p);
> +
> + put_page_and_type(page);
> + }
Isn't this initialize_reference_tsc() without the memset()?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |