Received: by 2002:a05:7412:d1aa:b0:fc:a2b0:25d7 with SMTP id ba42csp1956421rdb; Wed, 31 Jan 2024 14:46:04 -0800 (PST) X-Google-Smtp-Source: AGHT+IFglau8nV3rFI/wgfNhomHRIafbYLuucaEQibAKect5SLQO5XwHy8PgIveiPGZAnDK/fuL9 X-Received: by 2002:a05:6871:314d:b0:218:e907:75fe with SMTP id lu13-20020a056871314d00b00218e90775femr21062oac.35.1706741164040; Wed, 31 Jan 2024 14:46:04 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706741164; cv=pass; d=google.com; s=arc-20160816; b=qoanMsxKVxSQalGFpPgJdtXurLRPjEzvvtrFEyu7E7qMAsJZG7taD+P+MqAb1Wm+VD afY9gBnVcy28xFxW1KLRQA00Km9yLVX7I/n3w4Ug7nyNqT5g19UjaRdTt+ZtFCXxfBiG SWLdXaMiFTvymXw3akPhE+/9lOLbDR4IWTOhPanlTSAoXirzkmcBSWnTpkdSm5O3z9Tq uYlP34LxphSxqEOZ0W1av2M5GHq387lzmS0CJTZhQi5zRj/3xxXJo/VR8Q3sLuBX0/H5 0cKN1lD0Rj5gyXpA0zyhWDwyP+xXEi7ni7aNGvb7zlBDUhAN4RZAtqsXEiZuF4/6IcgT W/jw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:from:subject:message-id:references:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:in-reply-to:date :dkim-signature; bh=LFZR+caDlnxynR006W8r06MBUXUFwhkI/G9N83P84WQ=; fh=VnA9ePxtGD4xbRTfQxVLBDzbwOvIi8WDIotWQnPyAx0=; b=zoUIhgcdqz0QH71wFLD+xvHphDuET/zVR8Rw6a5GEWzI5gIOiBNcDTmt4Uxs8Koe5b jKQrvup0YkOM/GoYrlcj4nFqUPx72QYjFLhMpzfC5rHMYHY1dfmNdqbo0BvZ4yoxM7Qe 7k+l4ww8sdbd7p+Qgkwqe4Ep4uLTXaQQpnkEz9OjRI5nWwqZwxl4CEIog0zgh2wtCYdZ ++FP6pFOMttVeuM2B7/VDeFyzc3HcM8FuZESXDIFTHaeRJqg5ZlChyksTIls7VXi1rKV kGL+46rgpSG+5QTzTS6mXhWsHX11WwDS2Dul7tjxAbPSL275y33j8E4ZKuab3+VW9j3/ Vgyw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=KSr1X6kH; arc=pass (i=1 spf=pass spfdomain=flex--seanjc.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-47272-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-47272-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com X-Forwarded-Encrypted: i=1; AJvYcCUp57oKDTiTWHbH9kjxtLogVmf6XN75LTvjk75UPTMXUHPqVKfMJmkLXldd/GH13incxJ6RDXesLzR0uBFzBZtkkBlz9YCLRaEeg3b4PA== Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id e6-20020a656886000000b005cecbe69c23si10503347pgt.43.2024.01.31.14.46.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Jan 2024 14:46:04 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-47272-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=KSr1X6kH; arc=pass (i=1 spf=pass spfdomain=flex--seanjc.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-47272-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-47272-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id A690828D37F for ; Wed, 31 Jan 2024 22:46:03 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4941D3A1AC; Wed, 31 Jan 2024 22:45:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KSr1X6kH" Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC5C53A1CB for ; Wed, 31 Jan 2024 22:45:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706741152; cv=none; b=a7JyDMvPrL2CBWMH0a/qI0cGLhmd+ImtUlS/EXzdAShFQKCU6P2pk+D3Rc7QtPskqmkD+oWE6NV7IMC6b9AsGv9PIffl/mD/pZBRqYLVDYjtNe6Z4VgRAW4PPWLHixHxPjWWzbTdbyOC9bVeZ+hI7CCLa74xI+pc0oMxH8g161k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706741152; c=relaxed/simple; bh=AmunZczr7Dfx6/pExPG2SuXfqHdgyF1ugeSr+E7O7go=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=msFn28N8oDMVuYaRN2qT5ANqtCqPiZfgUds0eFIreVYclAsm9WoEfsFJY38u6ROKPgyHhgj/r52x11MLo/TTKZlbChRYW7veOaRDyI2RXoj60wMBf51yiKQiSS0ruUtx4GwDEkEhSzEwca52ElIqVxoafVZlyVfJn/0CYy0AV58= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KSr1X6kH; arc=none smtp.client-ip=209.85.128.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-60416f4cba4so6104067b3.2 for ; Wed, 31 Jan 2024 14:45:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706741149; x=1707345949; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=LFZR+caDlnxynR006W8r06MBUXUFwhkI/G9N83P84WQ=; b=KSr1X6kHrIQ/BP+R5ebibWU22EhUPy/ug/0p0W6MqElajxbHo4ZiHrf4lbyyjsEVCS uunvycOKsQT0UgHurNj7+18jQSIGYNFvdZ43I22f6RkSQVh49hapm+BXRuZgvHtwCIJ1 MHNJ5aXXC+9TExrXY90ZrfutlDh2NX0pSLsHWVzlzP5dBJbHTASNfBlFQXDbahpKTtjl 5YsSH6pw6ognzRKgx+95eLf8kdT/By3FPdIpAOAv2UyOQAsz8+hvN83LIFvHiaKREac2 PG3rlZjovqUuO9sJA11kjpNRqCXRmwjKy9bbBHurWZFiY2GrQT9B2B3h/QgovSFlvmPL PTOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706741149; x=1707345949; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=LFZR+caDlnxynR006W8r06MBUXUFwhkI/G9N83P84WQ=; b=EKbYIRanTNOT9xcRpmpukESspwCEebQUD7FtLNszgv710RSJqn88B79I+EKDIfgk2g +5vOl1hAgX2PX8fUbt+tBBYNu8Nrp/o1OncyGhp+TLHSbGTA7vK3Vsjba9ky5TP7T6dD kkdLipT0P28emdchXYj9PAjUWKfPKYWROKdu9rSsXOJZDuedfMAYRDZX5zydr2N+10wO +5FTmtHIoKprB4Hbh+z206Dsg4kZTIayaKselTrCEXDq/UXBEpHSIKhzBtUIBWsAFp+r 649gqKEgK/iUJZjQCl5F23cg8PzsUy8j8/dpW4WN6It1hNcFt4tFiEoYofVR3rUhiXAO XrVw== X-Gm-Message-State: AOJu0YwmiMDKJjDb3SQr9nIr7KHZNs/LcmqhoKrzeIGR8zO9nAspQvIt Kjvja28YpPhMQgX9HtX6G5iQ9Vqag97AVPZmEA7LUUxUhli/xSoHKCxG3ibkZ0y9OSAx4UlU5gx PCw== X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:11c3:b0:dc2:398d:a671 with SMTP id n3-20020a05690211c300b00dc2398da671mr827981ybu.10.1706741148737; Wed, 31 Jan 2024 14:45:48 -0800 (PST) Date: Wed, 31 Jan 2024 14:45:46 -0800 In-Reply-To: <20231102155111.28821-2-guang.zeng@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20231102155111.28821-1-guang.zeng@intel.com> <20231102155111.28821-2-guang.zeng@intel.com> Message-ID: Subject: Re: [RFC PATCH v1 1/8] KVM: selftests: x86: Fix bug in addr_arch_gva2gpa() From: Sean Christopherson To: Zeng Guang Cc: Paolo Bonzini , Shuah Khan , Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Zenghui Yu , Anup Patel , Atish Patra , David Hildenbrand , kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org Content-Type: text/plain; charset="us-ascii" On Thu, Nov 02, 2023, Zeng Guang wrote: > Fix the approach to get page map from gva to gpa. > > If gva maps a 4-KByte page, current implementation of addr_arch_gva2gpa() > will obtain wrong page size and cannot derive correct offset from the guest > virtual address. > > Meanwhile using HUGEPAGE_MASK(x) to calculate the offset within page > (1G/2M/4K) mistakenly incorporates the upper part of 64-bit canonical > linear address. That will work out improper guest physical address if > translating guest virtual address in supervisor-mode address space. The "Meanwhile ..." is a huge clue that this should be two separate patches. > Signed-off-by: Zeng Guang > --- > tools/testing/selftests/kvm/lib/x86_64/processor.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c > index d8288374078e..9f4b8c47edce 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c > @@ -293,6 +293,7 @@ uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm, uint64_t vaddr, > if (vm_is_target_pte(pde, level, PG_LEVEL_2M)) > return pde; > > + *level = PG_LEVEL_4K; > return virt_get_pte(vm, pde, vaddr, PG_LEVEL_4K); > } > > @@ -496,7 +497,7 @@ vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva) > * No need for a hugepage mask on the PTE, x86-64 requires the "unused" > * address bits to be zero. > */ > - return PTE_GET_PA(*pte) | (gva & ~HUGEPAGE_MASK(level)); > + return PTE_GET_PA(*pte) | (gva & (HUGEPAGE_SIZE(level) - 1)); I think I would prefer to "fix" HUGEPAGE_MASK() and drop its incorporation of PHYSICAL_PAGE_MASK. Regardless of anyone's personal views on whether or not PAGE_MASK and HUGEPAGE_MASK should only cover physical address bits, (a) the _one_ usage of HUGEPAGE_MASK is broken and (b) diverging from the kernel for something like is a terrible idea, and the kernel does: #define PAGE_MASK (~(PAGE_SIZE-1)) #define HPAGE_MASK (~(HPAGE_SIZE - 1)) #define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1)) Luckily, there are barely any users in x86, so I think the entirety of the conversion is this? diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 0f4792083d01..ef895038c87f 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -352,11 +352,12 @@ static inline unsigned int x86_model(unsigned int eax) #define PAGE_SHIFT 12 #define PAGE_SIZE (1ULL << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1) & PHYSICAL_PAGE_MASK) +#define PAGE_MASK (~(PAGE_SIZE-1)) +kvm_static_assert((PHYSICAL_PAGE_MASK & PAGE_MASK) == PHYSICAL_PAGE_MASK); #define HUGEPAGE_SHIFT(x) (PAGE_SHIFT + (((x) - 1) * 9)) #define HUGEPAGE_SIZE(x) (1UL << HUGEPAGE_SHIFT(x)) -#define HUGEPAGE_MASK(x) (~(HUGEPAGE_SIZE(x) - 1) & PHYSICAL_PAGE_MASK) +#define HUGEPAGE_MASK(x) (~(HUGEPAGE_SIZE(x) - 1)) #define PTE_GET_PA(pte) ((pte) & PHYSICAL_PAGE_MASK) #define PTE_GET_PFN(pte) (PTE_GET_PA(pte) >> PAGE_SHIFT) diff --git a/tools/testing/selftests/kvm/x86_64/hyperv_tlb_flush.c b/tools/testing/selftests/kvm/x86_64/hyperv_tlb_flush.c index 05b56095cf76..cc5730322072 100644 --- a/tools/testing/selftests/kvm/x86_64/hyperv_tlb_flush.c +++ b/tools/testing/selftests/kvm/x86_64/hyperv_tlb_flush.c @@ -623,7 +623,7 @@ int main(int argc, char *argv[]) for (i = 0; i < NTEST_PAGES; i++) { pte = vm_get_page_table_entry(vm, data->test_pages + i * PAGE_SIZE); gpa = addr_hva2gpa(vm, pte); - __virt_pg_map(vm, gva + PAGE_SIZE * i, gpa & PAGE_MASK, PG_LEVEL_4K); + __virt_pg_map(vm, gva + PAGE_SIZE * i, gpa & PHYSICAL_PAGE_MASK, PG_LEVEL_4K); data->test_pages_pte[i] = gva + (gpa & ~PAGE_MASK); }