All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: kevin.tian@intel.com, keir@xen.org,
	suravee.suthikulpanit@amd.com, andrew.cooper3@citrix.com,
	tim@xen.org, dietmar.hahn@ts.fujitsu.com,
	xen-devel@lists.xen.org, Aravind.Gopalakrishnan@amd.com,
	jun.nakajima@intel.com, dgdegra@tycho.nsa.gov
Subject: Re: [PATCH v12 for-xen-4.5 16/20] x86/VPMU: Handle PMU interrupts for PV guests
Date: Tue, 30 Sep 2014 11:07:08 -0400	[thread overview]
Message-ID: <542AC71C.6020804@oracle.com> (raw)
In-Reply-To: <542A81B6020000780003ADD4@mail.emea.novell.com>


On 09/30/2014 04:11 AM, Jan Beulich wrote:
>>>> On 25.09.14 at 21:28, <boris.ostrovsky@oracle.com> wrote:
>> --- a/xen/arch/x86/hvm/vpmu.c
>> +++ b/xen/arch/x86/hvm/vpmu.c
>> @@ -80,44 +80,191 @@ static void __init parse_vpmu_param(char *s)
>>   
>>   void vpmu_lvtpc_update(uint32_t val)
>>   {
>> -    struct vpmu_struct *vpmu = vcpu_vpmu(current);
>> +    struct vcpu *curr = current;
>> +    struct vpmu_struct *vpmu = vcpu_vpmu(curr);
>>   
>>       vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | (val & APIC_LVT_MASKED);
>> -    apic_write(APIC_LVTPC, vpmu->hw_lapic_lvtpc);
>> +
>> +    /* Postpone APIC updates for PV(H) guests if PMU interrupt is pending
>> */
>> +    if ( is_hvm_domain(curr->domain) ||
> Please don't open-code is_hvm_vcpu() (more instances elsewhere).

Why is this open-coded?

>
>> +         !(vpmu->xenpmu_data && (vpmu->xenpmu_data->pmu_flags & PMU_CACHED)) )
> I think readability would benefit if you resolved the !(&&) to !||!
> (making it the proper inverse of what you do in vpmu_do_wrmsr()
> and vpmu_do_rdmsr()).
>
>> +static struct vcpu *choose_hwdom_vcpu(void)
>> +{
>> +    struct vcpu *v;
>> +    unsigned idx = smp_processor_id() % hardware_domain->max_vcpus;
>> +
>> +    if ( hardware_domain->vcpu == NULL )
>> +        return NULL;
>> +
>> +    v = hardware_domain->vcpu[idx];
>> +
>> +    /*
>> +     * If index is not populated search downwards the vcpu array until
>> +     * a valid vcpu can be found
>> +     */
>> +    while ( !v && idx-- )
>> +        v = hardware_domain->vcpu[idx];
> Each time I get here I wonder what case this is good for.

I thought we can have a case when first hardware_domain->vcpu[idx] is 
NULL so we walk the array down until we find the first non-NULL vcpu. 
Hot unplug, for example (we may be calling this from NMI context).

>
>>   int vpmu_do_interrupt(struct cpu_user_regs *regs)
>>   {
>> -    struct vcpu *v = current;
>> -    struct vpmu_struct *vpmu = vcpu_vpmu(v);
>> +    struct vcpu *sampled = current, *sampling;
>> +    struct vpmu_struct *vpmu;
>> +
>> +    /* dom0 will handle interrupt for special domains (e.g. idle domain) */
>> +    if ( sampled->domain->domain_id >= DOMID_FIRST_RESERVED )
>> +    {
>> +        sampling = choose_hwdom_vcpu();
>> +        if ( !sampling )
>> +            return 0;
>> +    }
>> +    else
>> +        sampling = sampled;
>> +
>> +    vpmu = vcpu_vpmu(sampling);
>> +    if ( !is_hvm_domain(sampling->domain) )
>> +    {
>> +        /* PV(H) guest */
>> +        const struct cpu_user_regs *cur_regs;
>> +
>> +        if ( !vpmu->xenpmu_data )
>> +            return 0;
>> +
>> +        if ( vpmu->xenpmu_data->pmu_flags & PMU_CACHED )
>> +            return 1;
>> +
>> +        if ( is_pvh_domain(sampled->domain) &&
> Here and below - is this really the right condition? I.e. is the
> opposite case (doing nothing here, but the one further down
> having an else) really meant to cover both HVM and PV? The outer
> !is_hvm_() doesn't count here as that acts on sampling, not
> sampled.

This is test for an error in do_interrupt() --- if it reported a failure 
then there is no reason to proceed further.

>
>> +             !vpmu->arch_vpmu_ops->do_interrupt(regs) )
>> +            return 0;
>> +
>>
>> +
>> +            /* 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();
>> +            else
>> +                cur_regs = regs;
>> +
>> +            r->rip = cur_regs->rip;
>> +            r->rsp = cur_regs->rsp;
>> +
>> +            if ( !is_pvh_domain(sampled->domain) )
> (This is the other instance.)

This actually should be !has_hvm_container_domain(sampled->domain).

>
>> +            {
>> +                r->cs = cur_regs->cs;
>> +                if ( sampled->arch.flags & TF_kernel_mode )
>> +                    r->cs &= ~3;
> And once again I wonder how the consumer of this data is to tell
> apart guest kernel and hypervisor addresses.

Based on the RIP --- perf, for example, searches through various symbol 
tables.

I suppose I can set xenpmu_data->domain_id below to either DOMID_SELF 
for guest and DOMID_XEN for the hypervisor.


>
>> +            }
>> +            else
>> +            {
>> +                struct segment_register seg_cs;
>> +
>> +                hvm_get_segment_register(sampled, x86_seg_cs, &seg_cs);
>> +                r->cs = seg_cs.sel;
>> +            }
>> +        }
>> +
>> +        vpmu->xenpmu_data->domain_id = DOMID_SELF;
>> +        vpmu->xenpmu_data->vcpu_id = sampled->vcpu_id;
>> +        vpmu->xenpmu_data->pcpu_id = smp_processor_id();
>> +
>> +        vpmu->xenpmu_data->pmu_flags |= PMU_CACHED;
>> +        vpmu->hw_lapic_lvtpc |= APIC_LVT_MASKED;
>> +        apic_write(APIC_LVTPC, vpmu->hw_lapic_lvtpc);
>> +
>> +        send_guest_vcpu_virq(sampling, VIRQ_XENPMU);
>> +
>> +        return 1;
>> +    }
>>   

-boris

  reply	other threads:[~2014-09-30 15:07 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-25 19:28 [PATCH v12 for-xen-4.5 00/20] x86/PMU: Xen PMU PV(H) support Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 01/20] common/symbols: Export hypervisor symbols to privileged guest Boris Ostrovsky
2014-09-26 14:58   ` Konrad Rzeszutek Wilk
2014-09-26 15:10     ` Jan Beulich
2014-09-26 16:49       ` Konrad Rzeszutek Wilk
2014-09-29  6:43         ` Jan Beulich
2014-09-29 13:29           ` Boris Ostrovsky
2014-09-29 13:47             ` Jan Beulich
2014-09-29 14:16               ` Boris Ostrovsky
2014-09-29 14:33                 ` Jan Beulich
2014-09-26 21:43   ` Daniel De Graaf
2014-09-26 22:12     ` Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 02/20] x86/VPMU: Manage VPMU_CONTEXT_SAVE flag in vpmu_save_force() Boris Ostrovsky
2014-09-26 14:49   ` Konrad Rzeszutek Wilk
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 03/20] x86/VPMU: Set MSR bitmaps only for HVM/PVH guests Boris Ostrovsky
2014-09-26 14:59   ` Konrad Rzeszutek Wilk
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 04/20] x86/VPMU: Make vpmu macros a bit more efficient Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 05/20] intel/VPMU: Clean up Intel VPMU code Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 06/20] vmx: Merge MSR management routines Boris Ostrovsky
2014-09-26 20:48   ` Tian, Kevin
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 07/20] x86/VPMU: Handle APIC_LVTPC accesses Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 08/20] intel/VPMU: MSR_CORE_PERF_GLOBAL_CTRL should be initialized to zero Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 09/20] x86/VPMU: Add public xenpmu.h Boris Ostrovsky
2014-09-26 20:49   ` Tian, Kevin
2014-09-29 14:17   ` Jan Beulich
2014-09-29 14:30     ` Jan Beulich
2014-09-29 15:19       ` Boris Ostrovsky
2014-09-29 15:41         ` Jan Beulich
2014-09-29 15:48           ` Boris Ostrovsky
2014-09-29 14:57     ` Boris Ostrovsky
2014-09-29 15:40       ` Jan Beulich
2014-09-29 15:56         ` Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 10/20] x86/VPMU: Make vpmu not HVM-specific Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 11/20] x86/VPMU: Interface for setting PMU mode and flags Boris Ostrovsky
2014-09-26 21:04   ` Tian, Kevin
2014-09-26 21:24     ` Boris Ostrovsky
2014-09-26 22:00   ` Daniel De Graaf
2014-09-26 22:26     ` Boris Ostrovsky
2014-09-29 13:25   ` Dietmar Hahn
2014-09-29 13:56     ` Boris Ostrovsky
2014-09-29 14:03       ` Dietmar Hahn
2014-09-29 13:59     ` Jan Beulich
2014-09-29 14:05       ` Dietmar Hahn
2014-09-29 15:14   ` Jan Beulich
2014-09-29 15:34     ` Boris Ostrovsky
2014-10-01  0:48   ` Tian, Kevin
2014-10-01  0:56     ` Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 12/20] x86/VPMU: Initialize PMU for PV(H) guests Boris Ostrovsky
2014-09-26 22:16   ` Daniel De Graaf
2014-09-26 22:23     ` Boris Ostrovsky
2014-09-29 15:25   ` Jan Beulich
2014-09-29 15:41     ` Boris Ostrovsky
2014-09-29 15:42       ` Jan Beulich
2014-09-29 16:04         ` Boris Ostrovsky
2014-09-29 16:10           ` Jan Beulich
2014-10-01  0:16   ` Tian, Kevin
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 13/20] x86/VPMU: Save VPMU state for PV guests during context switch Boris Ostrovsky
2014-09-29 15:52   ` Jan Beulich
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 14/20] x86/VPMU: When handling MSR accesses, leave fault injection to callers Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 15/20] x86/VPMU: Add support for PMU register handling on PV guests Boris Ostrovsky
2014-09-26 16:34   ` Konrad Rzeszutek Wilk
2014-09-26 16:44     ` Boris Ostrovsky
2014-09-26 16:49       ` Konrad Rzeszutek Wilk
2014-09-29 16:04   ` Jan Beulich
2014-10-01  0:17   ` Tian, Kevin
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 16/20] x86/VPMU: Handle PMU interrupts for " Boris Ostrovsky
2014-09-26 22:09   ` Daniel De Graaf
2014-09-30  8:11   ` Jan Beulich
2014-09-30 15:07     ` Boris Ostrovsky [this message]
2014-09-30 15:44       ` Jan Beulich
2014-09-30 16:37         ` Boris Ostrovsky
2014-10-01  6:49           ` Jan Beulich
2014-10-01 12:53             ` Boris Ostrovsky
2014-10-01 13:18               ` Jan Beulich
2014-10-01 14:08                 ` Boris Ostrovsky
2014-10-01 14:26                   ` Jan Beulich
2014-10-01 18:06                     ` Boris Ostrovsky
2014-10-02  6:56                       ` Jan Beulich
2014-10-02 13:53                         ` Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 17/20] x86/VPMU: Merge vpmu_rdmsr and vpmu_wrmsr Boris Ostrovsky
2014-09-30  8:13   ` Jan Beulich
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 18/20] x86/VPMU: Add privileged PMU mode Boris Ostrovsky
2014-09-30  8:18   ` Jan Beulich
2014-09-30 15:16     ` Boris Ostrovsky
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 19/20] x86/VPMU: NMI-based VPMU support Boris Ostrovsky
2014-09-30  8:37   ` Jan Beulich
2014-10-01  0:18     ` Boris Ostrovsky
2014-10-01  7:32       ` Jan Beulich
2014-09-25 19:28 ` [PATCH v12 for-xen-4.5 20/20] x86/VPMU: Move VPMU files up from hvm/ directory Boris Ostrovsky
2014-09-30  8:40   ` Jan Beulich
2014-09-26 17:03 ` [PATCH v12 for-xen-4.5 00/20] x86/PMU: Xen PMU PV(H) support Konrad Rzeszutek Wilk
2014-09-29 13:28 ` Dietmar Hahn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=542AC71C.6020804@oracle.com \
    --to=boris.ostrovsky@oracle.com \
    --cc=Aravind.Gopalakrishnan@amd.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=dietmar.hahn@ts.fujitsu.com \
    --cc=jun.nakajima@intel.com \
    --cc=keir@xen.org \
    --cc=kevin.tian@intel.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.