[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v12 for-xen-4.5 16/20] x86/VPMU: Handle PMU interrupts for PV guests

On 10/01/2014 10:26 AM, Jan Beulich wrote:

Looking at the separation of hypervisor vs guest context to report

               /* Non-privileged domains are always in XENPMU_MODE_SELF mode */
               if ( (vpmu_mode & XENPMU_MODE_SELF) ||
                    (!is_hardware_domain(sampled->domain) &&
                     !is_idle_vcpu(sampled)) )
                   cur_regs = guest_cpu_user_regs();
                   cur_regs = regs;

I now additionally wonder why the condition here isn't just the SELF
check: If the interrupt happened while in the hypervisor, why would
you override this unconditionally to report a guest sample instead?
Shouldn't the profiling domain tell you what it wants in that case
(global vs guest local view)?
The second part of the check (!is_hardware_domain(sampled->domain) &&
!is_idle_vcpu(sampled)) is to prevent sending hypervisor sample to a
non-privileged guest. vpmu_mode may be, for example, XENPMU_MODE_HV but
that only means that dom0 can get hypervisor samples.
Right, but that's not what the code above does: Instead of sending
the hypervisor sample to Dom0 it converts it to a guest mode one.
Oh, I see --- when we get interrupted while in a non-privileged guest's
context (but in hypervisor) I send guest's registers, not Xen's.

I think just SELF check is not sufficient though, we need to make sure
that we are not sending hypervisor sample to non-dom0. So
      if ( (vpmu_mode & XENPMU_MODE_SELF) ||
!is_hardware_domain(sampling->domain) )
Actually I think instead the determination of sampling needs to
depend on the register context rather than solely on the current
domain's ID.

Not sure I follow this --- we do need to take domainID into account to avoid sending non-dom0 a hypervisor sample.

Or are you saying that what to send depends on both RIP and domainID?, Something like

    if ( (vpmu_mode & XENPMU_MODE_SELF) )
                cur_regs = guest_cpu_user_regs();
else if ( (regs->rip >= XEN_VIRT_START) && (regs->rip < XEN_VIRT_END) && is_hardware_domain(sampling->domain))
                cur_regs = regs;
                cur_regs = guest_cpu_user_regs();


Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.