Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp600767rdf; Tue, 21 Nov 2023 10:48:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IE1uTDgwSL4+c3J57mPlVoo4nck9L4iEtu91LtIArNkZSmEQ6D7mNF3Tk6IMeKZomuQikf1 X-Received: by 2002:a17:90b:1e0e:b0:280:a5b8:daf1 with SMTP id pg14-20020a17090b1e0e00b00280a5b8daf1mr65536pjb.47.1700592510221; Tue, 21 Nov 2023 10:48:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700592510; cv=none; d=google.com; s=arc-20160816; b=cjVwPbef1Js7MrvmuFj3nEhmjNtYL+CPxw4JViplcJOjBZue9u7ThOwR/JhDTdiGGU dBuimxQJ4yvmi+UeXtzMn/h3Khxr6+rADRG5mGF9bJppCaRiyYumXfdnugYau9cNOWxO JMsxtVdUEjAFgA3/WpBAtDtfgsLUMlWUYkCjpXAKmUs/smIN1PIt1xKqNELjL08zkzWG 5tXBgWmQeXOABC8mvIuwuM2zlJN78O5Xn3qYCyDOVvR5//xGA1BPvR8t2NcsvCi4RTFl FFEN/syK8J3ieZYeUVMY8PpYA0iziKkDZAzV8+pAybJrm+7dftPYIztU86OvqrVqlsNa 8/Tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=ul4KEFASJpTyKeeWEaoEGIEJkAp76tc14RGcJ05EwiA=; fh=Cum1qOF0YrAzH/5yQjcCBfU63B+V0l01YtzsDBRUOAc=; b=NB+kTcAwDfgDq/FjQEMfzcv6XcUIXPHTS1PJ0sMzyzhQjaeHs4Sx6Vvf5e6PLRPBlv g6O8s9F4GPu+TF4U/12AAaXVkPSR6MOxZNqtwDNKM9upRS834yxRLRkL3zjnKiCMnQNv A6HlL8G9IKiU6FrQ2EQaWU8Ho8n+A7Y7VG/pbEPSSnAIRBb66SgjMtab1WCiKiMvVQ61 lCtE1VlnlSmdRXO2XxbOnx5i5wxBBcxFlchgJdSgcBAMeKZ4eBLb46qN7LLH/0GHRkm/ 2i7Rgxcf9tGx5Dd4xrw8Ci2PH/e3rR14W/f4fruuLkfq0ZWxNk2hB5Wn50SNNkzvCoch plpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@xen.org header.s=20200302mail header.b=erG+F38a; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id gp1-20020a17090adf0100b00280f5032e03si13224019pjb.133.2023.11.21.10.48.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 10:48:30 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@xen.org header.s=20200302mail header.b=erG+F38a; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 7E6F180FA86A; Tue, 21 Nov 2023 10:03:59 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234495AbjKUSDq (ORCPT + 99 others); Tue, 21 Nov 2023 13:03:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49328 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234426AbjKUSDh (ORCPT ); Tue, 21 Nov 2023 13:03:37 -0500 Received: from mail.xenproject.org (mail.xenproject.org [104.130.215.37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DEA3219A; Tue, 21 Nov 2023 10:03:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xen.org; s=20200302mail; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:To:From; bh=ul4KEFASJpTyKeeWEaoEGIEJkAp76tc14RGcJ05EwiA=; b=erG+F38airXnNflww1t2so14R0 digkEX2GGR3Oi798xyp5sw6vC2tZbX4ylcCt7x4nGGkjR4bBmgYvyfqau4e86DRvrXx27nu+XFmBY JMwv2gRcUEJxXpJqzao6rE77ceGI0+DXOQAcUnN/D/NLKJPIPRG3SxK2qyUPYAWywauw=; Received: from xenbits.xenproject.org ([104.239.192.120]) by mail.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1r5V5f-00085K-UE; Tue, 21 Nov 2023 18:03:15 +0000 Received: from 54-240-197-231.amazon.com ([54.240.197.231] helo=REM-PW02S00X.ant.amazon.com) by xenbits.xenproject.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1r5V5f-0004Z3-Le; Tue, 21 Nov 2023 18:03:15 +0000 From: Paul Durrant To: David Woodhouse , Paul Durrant , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 07/15] KVM: pfncache: include page offset in uhva and use it consistently Date: Tue, 21 Nov 2023 18:02:15 +0000 Message-Id: <20231121180223.12484-8-paul@xen.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231121180223.12484-1-paul@xen.org> References: <20231121180223.12484-1-paul@xen.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE 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 X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 21 Nov 2023 10:03:59 -0800 (PST) From: Paul Durrant Currently the pfncache page offset is sometimes determined using the gpa and sometimes the khva, whilst the uhva is always page-aligned. After a subsequent patch is applied the gpa will not always be valid so adjust the code to include the page offset in the uhva and use it consistently as the source of truth. Also, where a page-aligned address is required, use PAGE_ALIGN_DOWN() for clarity. Signed-off-by: Paul Durrant --- Cc: Sean Christopherson Cc: Paolo Bonzini Cc: David Woodhouse v8: - New in this version. --- virt/kvm/pfncache.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/virt/kvm/pfncache.c b/virt/kvm/pfncache.c index 0eeb034d0674..c545f6246501 100644 --- a/virt/kvm/pfncache.c +++ b/virt/kvm/pfncache.c @@ -48,10 +48,10 @@ bool kvm_gpc_check(struct gfn_to_pfn_cache *gpc, unsigned long len) if (!gpc->active) return false; - if (offset_in_page(gpc->gpa) + len > PAGE_SIZE) + if (gpc->generation != slots->generation || kvm_is_error_hva(gpc->uhva)) return false; - if (gpc->generation != slots->generation || kvm_is_error_hva(gpc->uhva)) + if (offset_in_page(gpc->uhva) + len > PAGE_SIZE) return false; if (!gpc->valid) @@ -119,7 +119,7 @@ static inline bool mmu_notifier_retry_cache(struct kvm *kvm, unsigned long mmu_s static kvm_pfn_t hva_to_pfn_retry(struct gfn_to_pfn_cache *gpc) { /* Note, the new page offset may be different than the old! */ - void *old_khva = gpc->khva - offset_in_page(gpc->khva); + void *old_khva = (void *)PAGE_ALIGN_DOWN((uintptr_t)gpc->khva); kvm_pfn_t new_pfn = KVM_PFN_ERR_FAULT; void *new_khva = NULL; unsigned long mmu_seq; @@ -192,7 +192,7 @@ static kvm_pfn_t hva_to_pfn_retry(struct gfn_to_pfn_cache *gpc) gpc->valid = true; gpc->pfn = new_pfn; - gpc->khva = new_khva + offset_in_page(gpc->gpa); + gpc->khva = new_khva + offset_in_page(gpc->uhva); /* * Put the reference to the _new_ pfn. The pfn is now tracked by the @@ -215,8 +215,8 @@ static int __kvm_gpc_refresh(struct gfn_to_pfn_cache *gpc, gpa_t gpa, struct kvm_memslots *slots = kvm_memslots(gpc->kvm); unsigned long page_offset = offset_in_page(gpa); bool unmap_old = false; - unsigned long old_uhva; kvm_pfn_t old_pfn; + bool hva_change = false; void *old_khva; int ret; @@ -242,8 +242,7 @@ static int __kvm_gpc_refresh(struct gfn_to_pfn_cache *gpc, gpa_t gpa, } old_pfn = gpc->pfn; - old_khva = gpc->khva - offset_in_page(gpc->khva); - old_uhva = gpc->uhva; + old_khva = (void *)PAGE_ALIGN_DOWN((uintptr_t)gpc->khva); /* If the userspace HVA is invalid, refresh that first */ if (gpc->gpa != gpa || gpc->generation != slots->generation || @@ -259,13 +258,25 @@ static int __kvm_gpc_refresh(struct gfn_to_pfn_cache *gpc, gpa_t gpa, ret = -EFAULT; goto out; } + + hva_change = true; + } else { + /* + * No need to do any re-mapping if the only thing that has + * changed is the page offset. Just page align it to allow the + * new offset to be added in. + */ + gpc->uhva = PAGE_ALIGN_DOWN(gpc->uhva); } + /* Note: the offset must be correct before calling hva_to_pfn_retry() */ + gpc->uhva += page_offset; + /* * If the userspace HVA changed or the PFN was already invalid, * drop the lock and do the HVA to PFN lookup again. */ - if (!gpc->valid || old_uhva != gpc->uhva) { + if (!gpc->valid || hva_change) { ret = hva_to_pfn_retry(gpc); } else { /* -- 2.39.2