Received: by 2002:ab2:69cc:0:b0:1fd:c486:4f03 with SMTP id n12csp37006lqp; Mon, 10 Jun 2024 17:23:17 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWs0GYWYdfyQSaka+36cITx6CFMzdjyQek4fizMkfKj4r95a2rr49ltFORjN0KgN6669Yi0J1IatnQkNN77CB3ajE5TyX9WqERAYb5feg== X-Google-Smtp-Source: AGHT+IGVXJB4haHyYTad1TPTqpdNUXnSKtwbsnaHFpJKXM4XZKIWmbjgDyBx99Oml8zk4p581GUX X-Received: by 2002:a05:6871:5224:b0:254:e4a0:4d9c with SMTP id 586e51a60fabf-254f5a50a90mr362861fac.58.1718065397389; Mon, 10 Jun 2024 17:23:17 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718065397; cv=pass; d=google.com; s=arc-20160816; b=aJ67aZzaO0ryD2g1/4ZA7azpBcLaHaBLyQX0HDEN9iTfKQDmCfHq8ailRT8pQVchpF YE0/PLKzmRj7BsU5xov8Of+zDR1ysbp/Nm3Eb6zXJOQbzPoKf6qe+gwU0Njnyw5TXaP5 8qvRVbxSQlaibn22FA/1d0uJNtIDj5VzxUV92P8EVkjFIqGYvTQFmeyinmlcWuE7/WhM 9tCo7lOGguNUrnSeoq2vv5oaBHiHt+WFtm6nsnULo+fPHeJyWXuJacI6T/7JGia5MRRL yvXRBY0HCQJXH3ff1zF+2mb0bKxCGnWHKiWUqd4qxf7pB6JoMEWOW8HtV5oBGsu6FfAK Rnhw== 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=2WPKTEITGM8+K86UxPq3iqbgD4SGKZWY5JBo64AhYsQ=; fh=sWGkLQEPjb18YQbSTONvR/gow1jhSTM7cpbJ0gXyevc=; b=Hb2JAoGgTX419ZgAPLGlThtiPSZlr0/DTDi52pWAJ113LrGup+Qx+wR/vkKDirVu1y Joj/5iZmtv05du2qMRjcrc8UrNfPstznVpglSA8RNE3atzOdMjrH7COcoKgoATyXxWay 1ZdW4LU8CphIh3OszGZ37hZLPAuvAS7ub8BDsskfnruAwbh1YA4GZUY60EZeno4PrVOn WWbbULW9s9RwFL75DI20Hujlv7Y1cyQ0bvkwQIkHBchB/6mSJdb/1UVoVSK1nl/AoWcD nhrJfeijSlRbX0GCHDN5nG5ltQTxvbwfPxVUzN4Ub4lmlIWuZGyg5gTVN7KVsYcEiFSh Xnzg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=qHSmKlUg; arc=pass (i=1 spf=pass spfdomain=flex--jthoughton.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-209117-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-209117-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id af79cd13be357-7978864061esi262180785a.154.2024.06.10.17.23.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 17:23:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-209117-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=qHSmKlUg; arc=pass (i=1 spf=pass spfdomain=flex--jthoughton.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-209117-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-209117-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 ny.mirrors.kernel.org (Postfix) with ESMTPS id 103281C213E9 for ; Tue, 11 Jun 2024 00:23:17 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7A6711D543; Tue, 11 Jun 2024 00:22:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qHSmKlUg" Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.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 7F6704C9B for ; Tue, 11 Jun 2024 00:22:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718065325; cv=none; b=Ls9dOV/LWJIaKgtKAVJmG3OulvgO/5t6n+0xtUkwhmWPBSC5VXcggQo4To3/QxS6hhMNKy62kaOImd33q1TEEDtMvblB1xRIewJ/ixXZjtZEU1S5YGUlKdP+SrXiX4HgOK3HECBuByg19DLONFilbyXzBAKooJTHeo1yaWt6UVI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718065325; c=relaxed/simple; bh=X0aJuerMySwWEyOImz8FDWK4xkhRvTlVTnaqD8v70CY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MfK4bHI/rAqT+ec1cwpC4++zy9/E43hdWP4FOkZLIymGVhw9P/HSJoCG3A2FBDBQQI7JIFLqwtzwaZj6jMCayf5PhFDm4zE3TzSG0Pm7Zzek8+4TfTD6IPN78b/oQ5peXhF2dXZ1pHMKOrOWaNYIluEwUWufnMQi9wailqMcDhc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=qHSmKlUg; arc=none smtp.client-ip=209.85.219.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--jthoughton.bounces.google.com Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dfaf7ead784so7082398276.0 for ; Mon, 10 Jun 2024 17:22:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718065321; x=1718670121; 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=2WPKTEITGM8+K86UxPq3iqbgD4SGKZWY5JBo64AhYsQ=; b=qHSmKlUgjKi0CqRwDCES9k3uNlqCBz6rFHfp8OgisCFvxY2Bm6j3rd+etU1ArUlNpz LKj29EKFXjgu7sYeZpBkXH6dWBc8pBHCwrYulGXQsVzqTlZakYCR5mmCq/N14G1UJCUk +R+9DwZUF5rzRPGEgfBXbg7bLJKv85LRjyMhI85neWi1Fz055AlpjxhtcyfH5CUgsf73 nKK/kEulynqr88b5HGH2HV6dibhndZWO9xFWlEcQvPLiCNAf2ZOPSoRSbzKK14RS8Ot9 AMkd14a1eaHt1QRh/Ez37WEyDIpJ4C9u1E6shBVR7NxXRuu5cWBEtEyOXrIXxWMyai49 JBpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718065321; x=1718670121; 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=2WPKTEITGM8+K86UxPq3iqbgD4SGKZWY5JBo64AhYsQ=; b=NKw3psf/Q4heLXui5zkVAdApt0oPbVHDlKBQ0l676SbPnj2Qh4zKN09LGvPE7IywUo 84hqmyhJCEmTw7itEDV4elw4mfoISVI1Iyuu4AMzNm4eg5tkKYn3WXiQ/bWlMWc10SLU FVjtCSkIUP45FDpvXRERHYruHtNfXsP83HGGxsz1/24SdOgQd2yEPB4sxH45glD85Lq5 Zq/0Yc0hxstutffdNHtmnDak1g3xV7ucNC8jUSuYJBG5yEt2xBaKqWjKhbbqHqblAAw1 LXyXw0lqM/uFRP3Qgi6o8592b9xc6kcw4tp6RxI1VyZOE0l9QoybaRsRfqk7FIY2heP9 vv4A== X-Forwarded-Encrypted: i=1; AJvYcCVfar8dmZN0bUAIAjnuiMrg06Z9k8FQp81R801XmBHzVPF2St5U3cq+cGYqgGqGyz/qKoXBCNJyuTn0dN9EiGdUZAd1jn/mNostjDpV X-Gm-Message-State: AOJu0YxVQWEqLX0XNXQeP0TRC4U3Xo9x5HjOjAKDz6RdXFHW1uyOnPSZ kQLna1ZkXgMzFSnUVztJGUo9QozEryZcmtu86biHzKshmmPg/8H8Vuif9UXS4w2VEOJ0cM3iQvQ Bx+fUXDxDKuVOcgTtCg== X-Received: from jthoughton.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:2a4f]) (user=jthoughton job=sendgmr) by 2002:a05:6902:100a:b0:df4:ece5:2720 with SMTP id 3f1490d57ef6-dfaf6608d72mr3353252276.13.1718065321541; Mon, 10 Jun 2024 17:22:01 -0700 (PDT) Date: Tue, 11 Jun 2024 00:21:39 +0000 In-Reply-To: <20240611002145.2078921-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240611002145.2078921-1-jthoughton@google.com> X-Mailer: git-send-email 2.45.2.505.gda0bf45e8d-goog Message-ID: <20240611002145.2078921-4-jthoughton@google.com> Subject: [PATCH v5 3/9] KVM: arm64: Relax locking for kvm_test_age_gfn and kvm_age_gfn From: James Houghton To: Andrew Morton , Paolo Bonzini Cc: Ankit Agrawal , Axel Rasmussen , Catalin Marinas , David Matlack , David Rientjes , James Houghton , James Morse , Jonathan Corbet , Marc Zyngier , Oliver Upton , Raghavendra Rao Ananta , Ryan Roberts , Sean Christopherson , Shaoqin Huang , Suzuki K Poulose , Wei Xu , Will Deacon , Yu Zhao , Zenghui Yu , kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Replace the MMU write locks (taken in the memslot iteration loop) for read locks. Grabbing the read lock instead of the write lock is safe because the only requirement we have is that the stage-2 page tables do not get deallocated while we are walking them. The stage2_age_walker() callback is safe to race with itself; update the comment to reflect the synchronization change. Signed-off-by: James Houghton --- arch/arm64/kvm/Kconfig | 1 + arch/arm64/kvm/hyp/pgtable.c | 15 +++++++++------ arch/arm64/kvm/mmu.c | 26 ++++++++++++++++++++------ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 58f09370d17e..7a1af8141c0e 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -22,6 +22,7 @@ menuconfig KVM select KVM_COMMON select KVM_GENERIC_HARDWARE_ENABLING select KVM_GENERIC_MMU_NOTIFIER + select KVM_MMU_NOTIFIER_YOUNG_LOCKLESS select HAVE_KVM_CPU_RELAX_INTERCEPT select KVM_MMIO select KVM_GENERIC_DIRTYLOG_READ_PROTECT diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 9e2bbee77491..b1b0f7148cff 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -1319,10 +1319,10 @@ static int stage2_age_walker(const struct kvm_pgtable_visit_ctx *ctx, data->young = true; /* - * stage2_age_walker() is always called while holding the MMU lock for - * write, so this will always succeed. Nonetheless, this deliberately - * follows the race detection pattern of the other stage-2 walkers in - * case the locking mechanics of the MMU notifiers is ever changed. + * This walk may not be exclusive; the PTE is permitted to change + * from under us. If there is a race to update this PTE, then the + * GFN is most likely young, so failing to clear the AF is likely + * to be inconsequential. */ if (data->mkold && !stage2_try_set_pte(ctx, new)) return -EAGAIN; @@ -1345,10 +1345,13 @@ bool kvm_pgtable_stage2_test_clear_young(struct kvm_pgtable *pgt, u64 addr, struct kvm_pgtable_walker walker = { .cb = stage2_age_walker, .arg = &data, - .flags = KVM_PGTABLE_WALK_LEAF, + .flags = KVM_PGTABLE_WALK_LEAF | + KVM_PGTABLE_WALK_SHARED, }; + int r; - WARN_ON(kvm_pgtable_walk(pgt, addr, size, &walker)); + r = kvm_pgtable_walk(pgt, addr, size, &walker); + WARN_ON(r && r != -EAGAIN); return data.young; } diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 8bcab0cc3fe9..a62c27a347ed 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1773,25 +1773,39 @@ bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { u64 size = (range->end - range->start) << PAGE_SHIFT; + bool young = false; + + read_lock(&kvm->mmu_lock); if (!kvm->arch.mmu.pgt) return false; - return kvm_pgtable_stage2_test_clear_young(kvm->arch.mmu.pgt, - range->start << PAGE_SHIFT, - size, true); + young = kvm_pgtable_stage2_test_clear_young(kvm->arch.mmu.pgt, + range->start << PAGE_SHIFT, + size, true); + +out: + read_unlock(&kvm->mmu_lock); + return young; } bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { u64 size = (range->end - range->start) << PAGE_SHIFT; + bool young = false; + + read_lock(&kvm->mmu_lock); if (!kvm->arch.mmu.pgt) return false; - return kvm_pgtable_stage2_test_clear_young(kvm->arch.mmu.pgt, - range->start << PAGE_SHIFT, - size, false); + young = kvm_pgtable_stage2_test_clear_young(kvm->arch.mmu.pgt, + range->start << PAGE_SHIFT, + size, false); + +out: + read_unlock(&kvm->mmu_lock); + return young; } phys_addr_t kvm_mmu_get_httbr(void) -- 2.45.2.505.gda0bf45e8d-goog