Received: by 2002:ab2:69cc:0:b0:1fd:c486:4f03 with SMTP id n12csp40082lqp; Mon, 10 Jun 2024 17:33:10 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWVn3+uISJO2FXZCLpcTQBlvsBVjjvvC+P+KagrHIfXR5tFOhY1SNht7FXUVhogl5c7rKW3uCTtg7ctM5UbU+2puf/OxG7qcRu4bi1eLA== X-Google-Smtp-Source: AGHT+IGAr2UdmXDOTqm6g+CgH8GMhpw4GXgAlhHLKeoCkFSXoHPn/kNmx/mxUe9/k8ToHW54cEwW X-Received: by 2002:a17:902:e74b:b0:1f7:55e:1be with SMTP id d9443c01a7336-1f7055e033cmr65685925ad.41.1718065990322; Mon, 10 Jun 2024 17:33:10 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718065990; cv=pass; d=google.com; s=arc-20160816; b=gGE7n82nE5DmGRFJRv264MFTvpsezn2tD84EkybvhCpz+LEn2r7pUyETHvM4dvgYYR oC/q/sGeYx/atqVoIgceh3xf5e+F+2xXzrtpSIt0dmn5Dk8p11T9R6B9UFuTlOVwZUul mWMe2xB6c+HgLG4CJgQLvX0Jjgi2Qo4AYoHl2eqJGa9btkFGnsqoKfv3xZimWm+ZW8rv 9hKioiVohajl+GieIVc4ptJ7ydfkfyX5jFpST+BaCmJtAwsC+IHm6A+X0RHtug4TcLty +sziprsmgRDD/TZPf2bBR+CiRZ4WBlgV9tm7WhJs+PD1XjpYOpRnWvgwYD9V1+2Rnk1h bl/g== 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=UYg8xBfSHgODLvTlV3mxh03y8s3TyTlow0j+6oXRZyE=; fh=pxiDCG2kMmamiFCYXd91XkG9AE/e8c1lfmqiPnKoQPI=; b=oEwOLKAvBQzQYLu5LhOeRzMYbowvVm9G3NQ9U/hNh3KehyldXf+N5qmbZLF37GhVGs MWmKjktiEpVikybRgUdgGvoTWItj+wmIOqfn/hZsh1ZHs2+HSpVgfNyJYtyrV1qmv8FG jMASnMZfdmjDRf45KkH5yvlFxuFSTx2e5RoG0mdQfI5RSB8ebENN19A+pvcsVC71mf3W yQ5kccIFrxpgzsRfihhFtDVb0/3OgiHUI4nGLCmbpJGbDTJC2auemiqOTkuufSu3orxU LkGcInbcBBZsrZgNc9SQ+F5OBU/ndSha+HC1B8PCy/f+bnNNUed8xUy1uQHWh0bRknTP N5jQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=TQ1W1hNF; 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-209114-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-209114-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id d9443c01a7336-1f7235c11d8si11164615ad.564.2024.06.10.17.33.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 17:33:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-209114-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=TQ1W1hNF; 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-209114-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-209114-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 49F712862B0 for ; Tue, 11 Jun 2024 00:22:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 825A1EEA6; Tue, 11 Jun 2024 00:22:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TQ1W1hNF" 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 C1CB6EBE for ; Tue, 11 Jun 2024 00:22:00 +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=1718065323; cv=none; b=rVVzXBxEgiHVr/+60h9hf551CxwWkLrY3ogm7wgtbHwDsjZTYzEx7Sl8f2LuQ2uYEibRGmikOq+MxLeDpxit2oDbmeeKtmfIEoAg0Wa4GUQVom4i9Obvg1e831GmE8M3NiSCEz2KW9aTOzwwLqL+/PdTIf6PtwgG+2sj84LPXUY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718065323; c=relaxed/simple; bh=IMzEBBV4IPFmaMdvHVInrQZr7OKJx2Kta2GVtSnPoRs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JCTpbwnf865Ng4yqHsharjCce8pVnHZm8XBENccbjJk9lu4N/4OuJol9dOHWw5o6raaLFtKAqlPkn0GbRTos3jAiVDcQgjxiXXwy8FbFJ5mYcmjADfQCsmQ90Sr6b/QuLUJMVbggAd58o6Om7pML7FPflpMrC5nm9zICf0t+5SA= 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=TQ1W1hNF; 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--jthoughton.bounces.google.com Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-62cf0ed7761so30292167b3.1 for ; Mon, 10 Jun 2024 17:22:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718065320; x=1718670120; 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=UYg8xBfSHgODLvTlV3mxh03y8s3TyTlow0j+6oXRZyE=; b=TQ1W1hNFMy7cNANL+VpkoZgQ7JSKRKZ4OcC5WoaHK4RSOMZkBMq5+OXXEvZfvaiSKj MwAIq+V69sfqHZAQDZDHt4/PDHGzlcQNtZG5tEVbV0JCx62dq1X+w80V4HKLCvvpmf1i /iIItw0K/V4ByA1fepeR6LjAFVNlWu8xO5ygP+aSMTwy+gsVXUATnx4UNDlMIkEQ10sU J9FqGQipxQtPCBcj1UKKtiyVz8er0OCazq5wzPjuSUFWqdYdi98RUrDWOImPfN/WOg1F cS/Gky0kIlDR3lGPXEz+yqXltWIUV4JfwBrli7EyKkDRuXQsMw8mDdiSaXe0U4vw3Zue 0L3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718065320; x=1718670120; 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=UYg8xBfSHgODLvTlV3mxh03y8s3TyTlow0j+6oXRZyE=; b=iMOnyzmhTBPTBIWTw4Yni3mFKoFCf8WAbIv/tAqvVJZeDs7ukiWNb+kZ1m8uK4kKIh du0NivtJUvQsYHJc9yZV2L24Ty1RVSxPw0T4CVjGtyWuNLF9jTcLk2EPSNds7b4X/mO9 jx01NVuZZXBoJRQXN8e1+RQuVwNvzsfjhL3SKFxbO3SSzipl9jfIH3QzhC2rf+c7b8Dj E8VtIivWJMSHhDk3gwozGSUjX9/4QaGAdTzC0PNwJIbihoBJX74hYNaCqb6M739mlzu9 mF9z94O9gZEjMXcOLSKMM78Qiqk/IPALbf6a/+B7BA74TmxvKm/ov2IDq2Undkvy+VUd jzDw== X-Forwarded-Encrypted: i=1; AJvYcCUNWncTxLCWNA3GmQwzH3WRoRWKN76riBWPTtuT78PyvgehAvgxdh3lQ1p/yk4d9ezKri/y4jk/C1Cnd/0XgQnb8PKHzj3qEeofrvOJ X-Gm-Message-State: AOJu0YzIbhtPjC3Ojb4g+TtHUbukwdGvBn1uJOpW3KJ+tMFdDdr6rLvi vHQjLc+4uKUtpxsLP1R9dEx0IdaLVpNLm/yqEjE2cwD621S+CZ/5movtd/F0F38edla25hSKiCp QpoxU/v6Eo0JQ1VrYNw== X-Received: from jthoughton.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:2a4f]) (user=jthoughton job=sendgmr) by 2002:a05:6902:1003:b0:dd9:20c1:85b6 with SMTP id 3f1490d57ef6-dfd9fcb617bmr288182276.2.1718065319751; Mon, 10 Jun 2024 17:21:59 -0700 (PDT) Date: Tue, 11 Jun 2024 00:21:37 +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-2-jthoughton@google.com> Subject: [PATCH v5 1/9] KVM: Add lockless memslot walk to KVM 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" Provide flexibility to the architecture to synchronize as optimally as they can instead of always taking the MMU lock for writing. Architectures that do their own locking must select CONFIG_KVM_MMU_NOTIFIER_YOUNG_LOCKLESS. The immediate application is to allow architectures to implement the test/clear_young MMU notifiers more cheaply. Suggested-by: Yu Zhao Signed-off-by: James Houghton --- include/linux/kvm_host.h | 1 + virt/kvm/Kconfig | 3 +++ virt/kvm/kvm_main.c | 26 +++++++++++++++++++------- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 692c01e41a18..4d7c3e8632e6 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -266,6 +266,7 @@ struct kvm_gfn_range { gfn_t end; union kvm_mmu_notifier_arg arg; bool may_block; + bool lockless; }; 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); diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 29b73eedfe74..0404857c1702 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -97,6 +97,9 @@ config KVM_GENERIC_MMU_NOTIFIER select MMU_NOTIFIER bool +config KVM_MMU_NOTIFIER_YOUNG_LOCKLESS + bool + config KVM_GENERIC_MEMORY_ATTRIBUTES depends on KVM_GENERIC_MMU_NOTIFIER bool diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 14841acb8b95..d8fa0d617f12 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -558,6 +558,7 @@ struct kvm_mmu_notifier_range { on_lock_fn_t on_lock; bool flush_on_ret; bool may_block; + bool lockless; }; /* @@ -612,6 +613,10 @@ static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, IS_KVM_NULL_FN(range->handler))) return r; + /* on_lock will never be called for lockless walks */ + if (WARN_ON_ONCE(range->lockless && !IS_KVM_NULL_FN(range->on_lock))) + return r; + idx = srcu_read_lock(&kvm->srcu); for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { @@ -643,15 +648,18 @@ static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, gfn_range.start = hva_to_gfn_memslot(hva_start, slot); gfn_range.end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot); gfn_range.slot = slot; + gfn_range.lockless = range->lockless; if (!r.found_memslot) { r.found_memslot = true; - KVM_MMU_LOCK(kvm); - if (!IS_KVM_NULL_FN(range->on_lock)) - range->on_lock(kvm); - - if (IS_KVM_NULL_FN(range->handler)) - break; + if (!range->lockless) { + KVM_MMU_LOCK(kvm); + if (!IS_KVM_NULL_FN(range->on_lock)) + range->on_lock(kvm); + + if (IS_KVM_NULL_FN(range->handler)) + break; + } } r.ret |= range->handler(kvm, &gfn_range); } @@ -660,7 +668,7 @@ static __always_inline kvm_mn_ret_t __kvm_handle_hva_range(struct kvm *kvm, if (range->flush_on_ret && r.ret) kvm_flush_remote_tlbs(kvm); - if (r.found_memslot) + if (r.found_memslot && !range->lockless) KVM_MMU_UNLOCK(kvm); srcu_read_unlock(&kvm->srcu, idx); @@ -681,6 +689,8 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, .on_lock = (void *)kvm_null_fn, .flush_on_ret = true, .may_block = false, + .lockless = + IS_ENABLED(CONFIG_KVM_MMU_NOTIFIER_YOUNG_LOCKLESS), }; return __kvm_handle_hva_range(kvm, &range).ret; @@ -699,6 +709,8 @@ static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn .on_lock = (void *)kvm_null_fn, .flush_on_ret = false, .may_block = false, + .lockless = + IS_ENABLED(CONFIG_KVM_MMU_NOTIFIER_YOUNG_LOCKLESS), }; return __kvm_handle_hva_range(kvm, &range).ret; -- 2.45.2.505.gda0bf45e8d-goog