From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 D63A831064A for ; Thu, 8 Jan 2026 18:31:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767897086; cv=none; b=OySJ422XLLVYxSltA4azegm42CAtSnxIJpfz/m5HSOZhxzPZgNaqypToBKQX1lETPjmJxsunA129CrHIpjIC9O2nAI+soK6kS6s9GnsxRokg8S4n6tU/7eioqZOlAXbbW2YeINOSIOVWsnHnuVLeu5Bi1/TglA25j9mveeDzUWk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767897086; c=relaxed/simple; bh=HiZzKC6IpEiXD+YG7Xq5JdCfDWfJLzGMhECalIcNpBQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lifUdc5vGUZEIzcpUhggK9OdXwEyJ4WH+z5aCyepEAokPgMWzIT22PvHOX6904LsgPEdYBjrNLkSHuzfDvnDGs80PoLxYAJPI8AZkJLrQNIZxJEw1SoVPn4HF+QXOUTm5gxSF3RThCeSFgp9QH1dEkaYJk/3oMG6OFN7Gs1bSYM= 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=vM6gfqsW; arc=none smtp.client-ip=209.85.216.73 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vM6gfqsW" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-34ab459c051so7845908a91.0 for ; Thu, 08 Jan 2026 10:31:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1767897084; x=1768501884; 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=nY/l54WU76DsZYqDI43j/uSoqA/+4oD9QHehzkck2fM=; b=vM6gfqsWwI1u64FI4M91FEqxL5tVGhgDe3MSHI2wsgQWBqCFuGQS2ZzKKmCwEkwF8V iaZCKCpf8bnkObE5VlthNEtm9ufO/3YoisO2OEvQSKvCI7gh13n6yIt5R4cVD/GjUBwc d+Z4MalPRxDpUjvGoSSNdsn3ryzuXvG7VfGz3wsz80Cov3jLl14vqbQBdapOq7aJYQrc qHxwPwc8fdFwCTpAgBxOt/aqUFqgXKMUfXk6IDGXdpsEkwEwQbmyI+XlDSl71ojwMO4M MwQtlyDS+LuVazXVVLWaRiYF08kPJZtOwiAWsGJzDybEqMUP5Fm05X7IUdpOulkuQm9K d/4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767897084; x=1768501884; 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=nY/l54WU76DsZYqDI43j/uSoqA/+4oD9QHehzkck2fM=; b=EA4qPzxrSmOg7Y9KqX3NvF00aP1VsqJt8XT/Y88ndFlV/XDtk2TyPfhD46W3jZett9 36eYDHJtIrLaPAolXVXw9aeS+FpNmLiv4RRlRDcdumoKmGKVQVKxUwR7JBrJg5sum97h BBcZ1OXPaaVf0kZ/jWMLOpZ+zMh9IhiF3qPVgGLZSMU0CsKqmqi8X2EvMGzGxMcTGPI1 x/ceUt8mdm33ZwD3gaFg4zbGx40szoYknKk7hNJdvEhW9/8Sp1TPzPjtVqBCTlnM+io6 TN6MmQycvJqgbZAPmcVU2Nxqa8WMNWsxNK9a1Oh3DWiQiH5gXkYNywb80t9EeYtIZZKy Yy0Q== X-Forwarded-Encrypted: i=1; AJvYcCWm1gYdmtkhdLflcX1C2XwQdr3hEmsvMjqM8wRq/T6CphBDBQyxkiE57XHmwNGbzh2pElGcyI5APlQJ61Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzKPmpoC53fMoHfk11iq1PFlxhm5yEjtLXKv3PAX1pHRdsHul9v qco0ZMkNMnkx6QowoyLVIDnKsBwkrcjXVO9RX3VCPaMhv0oRFSrSrX8WON/npFOu7gEtdTELgjJ 72mMgmw== X-Google-Smtp-Source: AGHT+IHEOdI4r0O9pcHM188bqvdusRA2ROI4oJ6wpZajhgwchTGU2kxOjQW3XQ2z18n6bt3vYCQzcYAxHoc= X-Received: from pjrx16.prod.google.com ([2002:a17:90a:bc90:b0:34c:6f7a:2ab8]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3c09:b0:349:2154:eef4 with SMTP id 98e67ed59e1d1-34f68b83d71mr6555128a91.5.1767897083980; Thu, 08 Jan 2026 10:31:23 -0800 (PST) Date: Thu, 8 Jan 2026 10:31:22 -0800 In-Reply-To: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251230230150.4150236-1-seanjc@google.com> <20251230230150.4150236-22-seanjc@google.com> Message-ID: Subject: Re: [PATCH v4 21/21] KVM: selftests: Test READ=>WRITE dirty logging behavior for shadow MMU From: Sean Christopherson To: Yosry Ahmed Cc: Paolo Bonzini , Marc Zyngier , Oliver Upton , Tianrui Zhao , Bibo Mao , Huacai Chen , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, loongarch@lists.linux.dev, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="us-ascii" On Thu, Jan 08, 2026, Yosry Ahmed wrote: > On Thu, Jan 08, 2026 at 08:32:44AM -0800, Sean Christopherson wrote: > > On Fri, Jan 02, 2026, Yosry Ahmed wrote: > > diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/selftests/kvm/lib/x86/processor.c > > index ab869a98bbdc..fab18e9be66c 100644 > > --- a/tools/testing/selftests/kvm/lib/x86/processor.c > > +++ b/tools/testing/selftests/kvm/lib/x86/processor.c > > @@ -390,6 +390,13 @@ static uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm, > > return virt_get_pte(vm, mmu, pte, vaddr, PG_LEVEL_4K); > > } > > > > +uint64_t *tdp_get_pte(struct kvm_vm *vm, uint64_t l2_gpa) > > nested_paddr is the name used by tdp_map(), maybe use that here as well > (and in the header)? Oh hell no :-) nested_paddr is a terrible name (I was *very* tempted to change it on the fly, but restrained myself). "nested" is far too ambigous, e.g. without nested virtualization, "nested_paddr" arguably refers to _L1_ physical addresses (SVM called 'em Nested Page Tables after all). > > + int level = PG_LEVEL_4K; > > + > > + return __vm_get_page_table_entry(vm, &vm->stage2_mmu, l2_gpa, &level); > > +} > > + > > uint64_t *vm_get_pte(struct kvm_vm *vm, uint64_t vaddr) > > { > > int level = PG_LEVEL_4K; > [..] > > @@ -133,35 +220,50 @@ static void test_dirty_log(bool nested_tdp) > > > > /* Add an extra memory slot for testing dirty logging */ > > vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, > > - GUEST_TEST_MEM, > > + TEST_MEM_BASE, > > TEST_MEM_SLOT_INDEX, > > TEST_MEM_PAGES, > > KVM_MEM_LOG_DIRTY_PAGES); > > > > /* > > - * Add an identity map for GVA range [0xc0000000, 0xc0002000). This > > + * Add an identity map for GVA range [0xc0000000, 0xc0004000). This > > * affects both L1 and L2. However... > > */ > > - virt_map(vm, GUEST_TEST_MEM, GUEST_TEST_MEM, TEST_MEM_PAGES); > > + virt_map(vm, TEST_MEM_BASE, TEST_MEM_BASE, TEST_MEM_PAGES); > > > > /* > > - * ... pages in the L2 GPA range [0xc0001000, 0xc0003000) will map to > > - * 0xc0000000. > > + * ... pages in the L2 GPA ranges [0xc0001000, 0xc0002000) and > > + * [0xc0003000, 0xc0004000) will map to 0xc0000000 and 0xc0001000 > > + * respectively. > > Are these ranges correct? I thought L2 GPA range [0xc0002000, > 0xc0004000) will map to [0xc0000000, 0xc0002000). Gah, no. I looked at the comments after changing things around, but my eyes had glazed over by that point. > Also, perhaps it's better to express those in terms of the macros? > > L2 GPA range [TEST_MEM_ALIAS_BASE, TEST_MEM_ALIAS_BASE + 2*PAGE_SIZE) > will map to [TEST_MEM_BASE, TEST_MEM_BASE + 2*PAGE_SIZE)? Hmm, no, at some point we need to concretely state the addresses, so that people debugging this know what to expect, i.e. don't have to manually compute the addresses from the macros in order to debug. > > * > > * When TDP is disabled, the L2 guest code will still access the same L1 > > * GPAs as the TDP enabled case. > > + * > > + * Set the Dirty bit in the PTEs used by L2 so that KVM will create > > + * writable SPTEs when handling read faults (if the Dirty bit isn't > > + * set, KVM must intercept the next write to emulate the Dirty bit > > + * update). > > */ > > if (nested_tdp) { > > + vm_vaddr_t gva0 = TEST_GUEST_ADDR(TEST_MEM_ALIAS_BASE, 0); > > + vm_vaddr_t gva1 = TEST_GUEST_ADDR(TEST_MEM_ALIAS_BASE, 1); > > Why are these gvas? Should these be L2 GPAs? Pure oversight. > Maybe 'uint64_t l2_gpa0' or 'uint64_t nested_paddr0'? For better of worse, vm_paddr_t is the typedef in selftests. Hmm, if/when we go with David M's proposal to switch to u64 (from e.g. uint64_t), it'd probably be a good time to switch to KVM's gva_t and gpa_t as well. > Also maybe add TEST_ALIAS_GPA() macro to keep things consistent? Ya, then the line lengths are short enough to omit the local variables. How's this look? /* * ... pages in the L2 GPA address range [0xc0002000, 0xc0004000) will * map to [0xc0000000, 0xc0002000) when TDP is enabled (for L2). * * When TDP is disabled, the L2 guest code will still access the same L1 * GPAs as the TDP enabled case. * * Set the Dirty bit in the PTEs used by L2 so that KVM will create * writable SPTEs when handling read faults (if the Dirty bit isn't * set, KVM must intercept the next write to emulate the Dirty bit * update). */ if (nested_tdp) { tdp_identity_map_default_memslots(vm); tdp_map(vm, TEST_ALIAS_GPA(0), TEST_GPA(0), PAGE_SIZE); tdp_map(vm, TEST_ALIAS_GPA(1), TEST_GPA(1), PAGE_SIZE); *tdp_get_pte(vm, TEST_ALIAS_GPA(0)) |= PTE_DIRTY_MASK(&vm->stage2_mmu); *tdp_get_pte(vm, TEST_ALIAS_GPA(1)) |= PTE_DIRTY_MASK(&vm->stage2_mmu); } else { *vm_get_pte(vm, TEST_GVA(0)) |= PTE_DIRTY_MASK(&vm->mmu); *vm_get_pte(vm, TEST_GVA(1)) |= PTE_DIRTY_MASK(&vm->mmu); }