Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1126432pxf; Fri, 9 Apr 2021 00:08:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKclPnjy5aXoEk8UKTy0YGUu6Sz8xnbFHGEWVEcnv9qFU3PqJYqvJB+kHEZNkYPRWy0KVW X-Received: by 2002:a05:6a00:8c2:b029:23d:60e9:ecb7 with SMTP id s2-20020a056a0008c2b029023d60e9ecb7mr11260419pfu.57.1617952133910; Fri, 09 Apr 2021 00:08:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617952133; cv=none; d=google.com; s=arc-20160816; b=g8JiAMAWeLRnwNIWpnkPCSCIdoDvIO5ZCWD6X8BP7t86Su90ZXEAqj2MdpJ9W5aE6Q CA1+CKXJmx1UEP3m/ciDlCRHQs39acdTLm64JOWRcXMobwHNiIoqO4kSOofuB5kLulMr YeqzNdC2Hl13GHzNgJ1B4viJJJgcqdAHAuboOo3cOhmVPQSsKpdLU6FJv19PY+plcgyn P5Vo0annDg42KsBoOo/+xqZ1yNJNQ/kJqDIxXxCWUYLwWoH3uUcV11Z7IE6tpBotU5ba v9G0PXjyFmoYamTl5WHpUX3nG8uLXJ4Cz2oJDGWmOQnAeboPtdXMOFCoMzMRVzyvEPea Fdyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-language:content-transfer-encoding :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject:ironport-sdr:ironport-sdr; bh=O6pSroCL/FfZO1DQ8LUGgchXeJAjilv1vLY3tL78Wt8=; b=DEOLTzEirfFax45DV4Xl4UlVaFkDxcEUoqIyNJUKA+DZxrLSzjv9RkfLIgKk8wOsTQ oHp8oaXtPQ7KVfvoFmofmm/OC7OXSHL/5h7/NryFw47IQW3yZBFU7XY/wxZ6n7Ulj2uf +ZoBEXGpAH52X2UgetjqbErfMcTm4yqdguKw9m/S4H+0t2kFZXM9C3iNNUjcYrlw5Q/8 IQOq689m+PxCTTEz8vp9NoVZ24E93xC/46CenNSEZcXg8X16foPlXGKnKnCqdx2Dd1uZ SHIlVM0iG5WiHKHW/yQXxmdrkd1DmA+zXDn//AvEUUsTjY4+N6+E5qDHOWFJvntJcKr5 FoHg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y6si2076192plh.60.2021.04.09.00.08.41; Fri, 09 Apr 2021 00:08:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233475AbhDIHH6 (ORCPT + 99 others); Fri, 9 Apr 2021 03:07:58 -0400 Received: from mga09.intel.com ([134.134.136.24]:45714 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231630AbhDIHH5 (ORCPT ); Fri, 9 Apr 2021 03:07:57 -0400 IronPort-SDR: yYuBZGPB74CDNSu4TP17Fc9TLjesoP9jjy+Mz4e+nTEwIMCWzGLe4X/7+i7z1l7qk2KwSXflq6 tNaxdDAG6owg== X-IronPort-AV: E=McAfee;i="6000,8403,9948"; a="193819433" X-IronPort-AV: E=Sophos;i="5.82,208,1613462400"; d="scan'208";a="193819433" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Apr 2021 00:07:44 -0700 IronPort-SDR: NvnqZbMIt4bbgLmNxOtZ6ggslg6Nofws6gwwAVSc3fq/eZ7SLJ4YzN7pPNbosdt7aY/criDkU4 wPB9AO+9SDGA== X-IronPort-AV: E=Sophos;i="5.82,208,1613462400"; d="scan'208";a="416145833" Received: from likexu-mobl1.ccr.corp.intel.com (HELO [10.238.4.93]) ([10.238.4.93]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Apr 2021 00:07:41 -0700 Subject: Re: [PATCH v4 08/16] KVM: x86/pmu: Add IA32_DS_AREA MSR emulation to manage guest DS buffer To: Peter Zijlstra Cc: Sean Christopherson , Paolo Bonzini , eranian@google.com, andi@firstfloor.org, kan.liang@linux.intel.com, wei.w.wang@intel.com, Wanpeng Li , Vitaly Kuznetsov , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Andi Kleen , Like Xu References: <20210329054137.120994-1-like.xu@linux.intel.com> <20210329054137.120994-9-like.xu@linux.intel.com> <610bfd14-3250-0542-2d93-cbd15f2b4e16@intel.com> From: "Xu, Like" Message-ID: <8695f271-9da9-f16d-15f2-e2757186db65@intel.com> Date: Fri, 9 Apr 2021 15:07:38 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.9.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Peter, On 2021/4/8 15:52, Peter Zijlstra wrote: >> This is because in the early part of this function, we have operations: >> >>     if (x86_pmu.flags & PMU_FL_PEBS_ALL) >>         arr[0].guest &= ~cpuc->pebs_enabled; >>     else >>         arr[0].guest &= ~(cpuc->pebs_enabled & PEBS_COUNTER_MASK); >> >> and if guest has PEBS_ENABLED, we need these bits back for PEBS counters: >> >>     arr[0].guest |= arr[1].guest; I can't keep up with you on this comment and would you explain more ? > I don't think that's right, who's to say they were set in the first > place? The guest's GLOBAL_CTRL could have had the bits cleared at VMEXIT > time. You can't unconditionally add PEBS_ENABLED into GLOBAL_CTRL, > that's wrong. > To address your previous comments, does the code below look good to you? static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) {     struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);     struct perf_guest_switch_msr *arr = cpuc->guest_switch_msrs;     struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds);     struct kvm_pmu *pmu = (struct kvm_pmu *)data;     u64 pebs_mask = (x86_pmu.flags & PMU_FL_PEBS_ALL) ?             cpuc->pebs_enabled : (cpuc->pebs_enabled & PEBS_COUNTER_MASK);     int i = 0;     arr[i].msr = MSR_CORE_PERF_GLOBAL_CTRL;     arr[i].host = x86_pmu.intel_ctrl & ~cpuc->intel_ctrl_guest_mask;     arr[i].guest = x86_pmu.intel_ctrl & ~cpuc->intel_ctrl_host_mask;     arr[i].guest &= ~pebs_mask;     if (!x86_pmu.pebs)         goto out;     /*      * If PMU counter has PEBS enabled it is not enough to      * disable counter on a guest entry since PEBS memory      * write can overshoot guest entry and corrupt guest      * memory. Disabling PEBS solves the problem.      *      * Don't do this if the CPU already enforces it.      */     if (x86_pmu.pebs_no_isolation) {         i++;         arr[i].msr = MSR_IA32_PEBS_ENABLE;         arr[i].host = cpuc->pebs_enabled;         arr[i].guest = 0;         goto out;     }     if (!pmu || !x86_pmu.pebs_vmx)         goto out;     i++;     arr[i].msr = MSR_IA32_DS_AREA;     arr[i].host = (unsigned long)ds;     arr[i].guest = pmu->ds_area;     if (x86_pmu.intel_cap.pebs_baseline) {         i++;         arr[i].msr = MSR_PEBS_DATA_CFG;         arr[i].host = cpuc->pebs_data_cfg;         arr[i].guest = pmu->pebs_data_cfg;     }     i++;     arr[i].msr = MSR_IA32_PEBS_ENABLE;     arr[i].host = cpuc->pebs_enabled & ~cpuc->intel_ctrl_guest_mask;     arr[i].guest = pebs_mask & ~cpuc->intel_ctrl_host_mask;     if (arr[i].host) {         /* Disable guest PEBS if host PEBS is enabled. */         arr[i].guest = 0;     } else {         /* Disable guest PEBS for cross-mapped PEBS counters. */         arr[i].guest &= ~pmu->host_cross_mapped_mask;         arr[0].guest |= arr[i].guest;     } out:     *nr = ++i;     return arr; }