[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 12/17] x86/VPMU: Handle PMU interrupts for PV guests
>>> On 21.01.14 at 20:08, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> wrote: > int vpmu_do_interrupt(struct cpu_user_regs *regs) > { > struct vcpu *v = current; > - struct vpmu_struct *vpmu = vcpu_vpmu(v); > + struct vpmu_struct *vpmu; > > - if ( vpmu->arch_vpmu_ops ) > + /* dom0 will handle this interrupt */ > + if ( v->domain->domain_id >= DOMID_FIRST_RESERVED ) > + v = dom0->vcpu[smp_processor_id() % dom0->max_vcpus]; > + > + vpmu = vcpu_vpmu(v); > + if ( !is_hvm_domain(v->domain) ) > + { > + /* PV guest or dom0 is doing system profiling */ > + const struct cpu_user_regs *gregs; > + int err; > + > + if ( v->arch.vpmu.xenpmu_data->pmu_flags & PMU_CACHED ) > + return 1; > + > + /* PV guest will be reading PMU MSRs from xenpmu_data */ > + vpmu_set(vpmu, VPMU_CONTEXT_SAVE | VPMU_CONTEXT_LOADED); > + err = vpmu->arch_vpmu_ops->arch_vpmu_save(v); > + vpmu_reset(vpmu, VPMU_CONTEXT_SAVE | VPMU_CONTEXT_LOADED); > + > + /* Store appropriate registers in xenpmu_data */ > + if ( is_pv_32bit_domain(current->domain) ) > + { > + /* > + * 32-bit dom0 cannot process Xen's addresses (which are 64 bit) > + * and therefore we treat it the same way as a non-priviledged > + * PV 32-bit domain. > + */ > + struct compat_cpu_user_regs *cmp; > + > + gregs = guest_cpu_user_regs(); > + > + cmp = (struct compat_cpu_user_regs *) > + &v->arch.vpmu.xenpmu_data->pmu.r.regs; Deliberate type changes like this can easily (and more readably as well as more forward compatibly) be done using (void *). > + XLAT_cpu_user_regs(cmp, gregs); > + } > + else if ( !is_control_domain(current->domain) && > + !is_idle_vcpu(current) ) > + { > + /* PV guest */ > + gregs = guest_cpu_user_regs(); > + memcpy(&v->arch.vpmu.xenpmu_data->pmu.r.regs, > + gregs, sizeof(struct cpu_user_regs)); > + } > + else > + memcpy(&v->arch.vpmu.xenpmu_data->pmu.r.regs, > + regs, sizeof(struct cpu_user_regs)); > + > + v->arch.vpmu.xenpmu_data->domain_id = current->domain->domain_id; > + v->arch.vpmu.xenpmu_data->vcpu_id = current->vcpu_id; > + v->arch.vpmu.xenpmu_data->pcpu_id = smp_processor_id(); > + > + v->arch.vpmu.xenpmu_data->pmu_flags |= PMU_CACHED; > + apic_write(APIC_LVTPC, vpmu->hw_lapic_lvtpc | APIC_LVT_MASKED); > + vpmu->hw_lapic_lvtpc |= APIC_LVT_MASKED; > + > + send_guest_vcpu_virq(v, VIRQ_XENPMU); > + > + return 1; > + } > + else if ( vpmu->arch_vpmu_ops ) If the previous (and only) if() branch returns unconditionally, using "else if" is more confusing then clarifying imo (and in any case needlessly growing the patch, even if just by a bit). Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |