Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp854386rwb; Thu, 1 Dec 2022 09:09:40 -0800 (PST) X-Google-Smtp-Source: AA0mqf5hyrM2+g/T4B35epvX+R2W7LMSxDCo227tb7bkXu/9GNC19wtOnLmZo9XGHh014RxVClKW X-Received: by 2002:a17:906:a198:b0:7b4:bc42:3b44 with SMTP id s24-20020a170906a19800b007b4bc423b44mr49826402ejy.101.1669914579736; Thu, 01 Dec 2022 09:09:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669914579; cv=none; d=google.com; s=arc-20160816; b=wH2O10vg7xQQ9NHQfZjKUi3QXS6PbIy857QB/Ovr7a3GivSmYhqey7nT7UK4kAIAON Vl9s7W33UuUxpcQAt1Tsyn9W1bKkGUhJI6vafY5lKcJ63j/ypYAMOJd4hu7H8Bl6y0T3 FRp90xZmN0WHi3qtvppA4Ys3WrtHSOnNSdUP0I6y5BrPmrSbjbhEuOBAkU4PKaDB+OAF Rcc9WEmuPPrruQk75iVNQhxnYZY4IKHANWT3zAKO6vGjAohCSvPBE0AKHjKYM1JBMPHu suAROXKaPvZtyNnfWqtcLSVICN9bJelKgrDBzhJKDrj+XD+NbH0GIU2CbmKjMo5welyo qWPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=CcbLtYfJOUPv9hfp+Y14KjDL6nnYgGwjjKw594bKLHA=; b=oWZgg6asTsZi64Uqe8RRHZYQsAlfkQgepMx6m/sOl4kUCxXgAaHQIgnqs3W+laucIh /YOQXNgXw/9VSQeFiWH56hj0dWx7jd6VTTKpuCF49bAC3uO+SjyCQFIU6EBe6/I9vJaL Dy0c/TZag/F7liEnJ5EWiqRSGml6cZbd07KcF/19pmkWjHYInu/C3dAlRqw5Qih1idYp 1iB6Elhph12uUbyNTfKa2zhesHbt7Bzzj9TOYz+952CeF88wA35XiCL2M5hWnrbV9mIY jU+L9VB8neH78DGHWzc59cSSok5QCgBuN+k7+kK8j49hvLdDZRItq4EVbLnF7H2nj3j6 SI4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="M7Cy/EGD"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c15-20020a05640227cf00b0046b4ea89826si4653587ede.616.2022.12.01.09.09.19; Thu, 01 Dec 2022 09:09:39 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="M7Cy/EGD"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229890AbiLAQ6R (ORCPT + 82 others); Thu, 1 Dec 2022 11:58:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229853AbiLAQ6P (ORCPT ); Thu, 1 Dec 2022 11:58:15 -0500 Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E690D1A064 for ; Thu, 1 Dec 2022 08:58:14 -0800 (PST) Received: by mail-pg1-x52c.google.com with SMTP id 62so2150334pgb.13 for ; Thu, 01 Dec 2022 08:58:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=CcbLtYfJOUPv9hfp+Y14KjDL6nnYgGwjjKw594bKLHA=; b=M7Cy/EGD/LO/JhRD3VFjxVgnlzZBSlIpWZurKAOV4ywrSpW3BkU+d8f9iD0IT7hiOF S8Sj5iB7vAGpqvxgcz3x7K+IYUatpvfwK19hR64X5gGXCtlhz3DpU7q3WkfgJBBRhXoU M4QGPq9IPVAlmcWPmI1Brr1MoCz9OxLy4FbIjLVUhuueYlCAjXTFsG7WVC7rlYOTCY8Q mjXtv3KBNnaPLEVvmY1W1rT4zlJnvwmI4yMHdV+G2oXOkEVM/qOd2TYDCNmqSYjweSk7 0zjdlIKCN+vOkRtSErgKZbL9FajfcaKblWDV2awqCIYbvyOe/6114Qt0Xmc8S0MeEgZf QdMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=CcbLtYfJOUPv9hfp+Y14KjDL6nnYgGwjjKw594bKLHA=; b=EKz1VjGiG0whycPx/1EvCtVbii8vFtw/hb3bHTwfzqLA4N9qbDVlfLY/E7TGJ+lqCg wkTjAqsq9Hc/k4pcT3usQXO568thlUewSJwow0ZFwysxl19OKnllUYEvOoVARQWz1z2V SrEG0Md0e2BdweXX39OzspLq0j84WygM/43mfAISmsMrImpGjGQ0OUV/JFrfYPNPGLOU HdZxo0jyCZsLlBnvMUA28kNbw848tAqvzhFwxQoJ8U7o78Clm1H0DrzXJ4gUSgwrmxLX Q+9AABZZcoYDW7cUhOyhV62hvUJqMXGXUAsm81720FwpTMIx85Oj6t7GwbfOoigitbYl eeow== X-Gm-Message-State: ANoB5plSANBKg6LcVEtOmgcgr19QLJnD0jHh67pE/BWL4mATAKQBol0u iF7GqRIo3okAyMCXvc/wGHoFSA== X-Received: by 2002:a63:4c63:0:b0:477:103:d1c4 with SMTP id m35-20020a634c63000000b004770103d1c4mr40951530pgl.369.1669913894315; Thu, 01 Dec 2022 08:58:14 -0800 (PST) Received: from google.com (7.104.168.34.bc.googleusercontent.com. [34.168.104.7]) by smtp.gmail.com with ESMTPSA id iw1-20020a170903044100b0017f5ad327casm3850241plb.103.2022.12.01.08.58.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 08:58:13 -0800 (PST) Date: Thu, 1 Dec 2022 16:58:10 +0000 From: Sean Christopherson To: Alexey Kardashevskiy Cc: kvm@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Venu Busireddy , Tony Luck , Tom Lendacky , Thomas Gleixner , Peter Zijlstra , Paolo Bonzini , Michael Sterritt , Michael Roth , Mario Limonciello , Ingo Molnar , Heiko Carstens , Greg Kroah-Hartman , Dave Hansen , Borislav Petkov , Andrew Cooper , "Jason A. Donenfeld" , "H. Peter Anvin" Subject: Re: [PATCH kernel 1/3] x86/amd/dr_addr_mask: Cache values in percpu variables Message-ID: References: <20221201021948.9259-1-aik@amd.com> <20221201021948.9259-2-aik@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20221201021948.9259-2-aik@amd.com> X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Dec 01, 2022, Alexey Kardashevskiy wrote: > Reading DR[0-3]_ADDR_MASK MSRs takes about 250 cycles which is going to > be noticeable when the AMD KVM SEV-ES's DebugSwap feature is enabled and > KVM needs to store these before switching to a guest; the DebugSwitch > hardware support restores them as type B swap. > > This stores MSR values from set_dr_addr_mask() in percpu values and > returns them via new get_dr_addr_mask(). The gain here is about 10x. > > Signed-off-by: Alexey Kardashevskiy > --- > arch/x86/include/asm/debugreg.h | 1 + > arch/x86/kernel/cpu/amd.c | 32 ++++++++++++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/arch/x86/include/asm/debugreg.h b/arch/x86/include/asm/debugreg.h > index cfdf307ddc01..c4324d0205b5 100644 > --- a/arch/x86/include/asm/debugreg.h > +++ b/arch/x86/include/asm/debugreg.h > @@ -127,6 +127,7 @@ static __always_inline void local_db_restore(unsigned long dr7) > > #ifdef CONFIG_CPU_SUP_AMD > extern void set_dr_addr_mask(unsigned long mask, int dr); > +extern unsigned long get_dr_addr_mask(int dr); > #else > static inline void set_dr_addr_mask(unsigned long mask, int dr) { } KVM_AMD doesn't depend on CPU_SUP_AMD, i.e. this needs a stub. Or we need to add a dependency. > diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c > index c75d75b9f11a..ec7efcef4e14 100644 > --- a/arch/x86/kernel/cpu/amd.c > +++ b/arch/x86/kernel/cpu/amd.c > @@ -1158,6 +1158,11 @@ static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) > return false; > } > > +DEFINE_PER_CPU_READ_MOSTLY(unsigned long, dr0_addr_mask); > +DEFINE_PER_CPU_READ_MOSTLY(unsigned long, dr1_addr_mask); > +DEFINE_PER_CPU_READ_MOSTLY(unsigned long, dr2_addr_mask); > +DEFINE_PER_CPU_READ_MOSTLY(unsigned long, dr3_addr_mask); > + > void set_dr_addr_mask(unsigned long mask, int dr) > { > if (!boot_cpu_has(X86_FEATURE_BPEXT)) > @@ -1166,17 +1171,44 @@ void set_dr_addr_mask(unsigned long mask, int dr) > switch (dr) { > case 0: > wrmsr(MSR_F16H_DR0_ADDR_MASK, mask, 0); LOL, I'd love to hear how MSR_F16H_DR0_ADDR_MASK ended up with a completely different MSR index. > + per_cpu(dr0_addr_mask, smp_processor_id()) = mask; Use an array to avoid the copy+paste? And if you're going to add a cache, might as well use it to avoid unnecessary writes. > break; > case 1: