From: Sean Christopherson <seanjc@google.com>
To: Yu Zhao <yuzhao@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Jonathan Corbet <corbet@lwn.net>,
Michael Larabel <michael@michaellarabel.com>,
kvmarm@lists.linux.dev, kvm@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linuxppc-dev@lists.ozlabs.org, x86@kernel.org,
linux-mm@google.com
Subject: Re: [PATCH mm-unstable v1 1/5] mm/kvm: add mmu_notifier_test_clear_young()
Date: Thu, 23 Feb 2023 09:13:58 -0800 [thread overview]
Message-ID: <Y/ee1s3XPGa62SFV@google.com> (raw)
In-Reply-To: <20230217041230.2417228-2-yuzhao@google.com>
On Thu, Feb 16, 2023, Yu Zhao wrote:
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 9c60384b5ae0..1b465df4a93d 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -875,6 +875,63 @@ static int kvm_mmu_notifier_clear_young(struct mmu_notifier *mn,
> return kvm_handle_hva_range_no_flush(mn, start, end, kvm_age_gfn);
> }
>
> +static bool kvm_test_clear_young(struct kvm *kvm, unsigned long start,
> + unsigned long end, unsigned long *bitmap)
> +{
> + int i;
> + int key;
> + bool success = true;
> +
> + trace_kvm_age_hva(start, end);
> +
> + key = srcu_read_lock(&kvm->srcu);
> +
> + for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) {
> + struct interval_tree_node *node;
> + struct kvm_memslots *slots = __kvm_memslots(kvm, i);
> +
> + kvm_for_each_memslot_in_hva_range(node, slots, start, end - 1) {
> + gfn_t lsb_gfn;
> + unsigned long hva_start, hva_end;
> + struct kvm_gfn_range range = {
> + .slot = container_of(node, struct kvm_memory_slot,
> + hva_node[slots->node_idx]),
> + };
> +
> + hva_start = max(start, range.slot->userspace_addr);
> + hva_end = min(end - 1, range.slot->userspace_addr +
> + range.slot->npages * PAGE_SIZE - 1);
> +
> + range.start = hva_to_gfn_memslot(hva_start, range.slot);
> + range.end = hva_to_gfn_memslot(hva_end, range.slot) + 1;
> +
> + if (WARN_ON_ONCE(range.end <= range.start))
> + continue;
Extend __kvm_handle_hva_range() instead of copy-pasting. At a very quick glance,
I believe all that is needed is (minus sanity checks):
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index d255964ec331..3296ae2cf6fa 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -544,6 +544,7 @@ struct kvm_hva_range {
hva_handler_t handler;
on_lock_fn_t on_lock;
on_unlock_fn_t on_unlock;
+ bool lockless;
bool flush_on_ret;
bool may_block;
};
@@ -616,7 +617,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm,
gfn_range.end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot);
gfn_range.slot = slot;
- if (!locked) {
+ if (!range->lockless && !locked) {
locked = true;
KVM_MMU_LOCK(kvm);
if (!IS_KVM_NULL_FN(range->on_lock))
> +
> + /* see the comments on the generic kvm_arch_has_test_clear_young() */
> + lsb_gfn = hva_to_gfn_memslot(end - 1, range.slot);
> +
> + success = kvm_arch_test_clear_young(kvm, &range, lsb_gfn, bitmap);
> + if (!success)
> + break;
> + }
> + }
> +
> + srcu_read_unlock(&kvm->srcu, key);
> +
> + return success;
> +}
WARNING: multiple messages have this Message-ID (diff)
From: Sean Christopherson <seanjc@google.com>
To: Yu Zhao <yuzhao@google.com>
Cc: linux-mm@google.com, kvm@vger.kernel.org,
Jonathan Corbet <corbet@lwn.net>,
Michael Larabel <michael@michaellarabel.com>,
x86@kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org,
kvmarm@lists.linux.dev, Paolo Bonzini <pbonzini@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
linuxppc-dev@lists.ozlabs.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH mm-unstable v1 1/5] mm/kvm: add mmu_notifier_test_clear_young()
Date: Thu, 23 Feb 2023 09:13:58 -0800 [thread overview]
Message-ID: <Y/ee1s3XPGa62SFV@google.com> (raw)
In-Reply-To: <20230217041230.2417228-2-yuzhao@google.com>
On Thu, Feb 16, 2023, Yu Zhao wrote:
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 9c60384b5ae0..1b465df4a93d 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -875,6 +875,63 @@ static int kvm_mmu_notifier_clear_young(struct mmu_notifier *mn,
> return kvm_handle_hva_range_no_flush(mn, start, end, kvm_age_gfn);
> }
>
> +static bool kvm_test_clear_young(struct kvm *kvm, unsigned long start,
> + unsigned long end, unsigned long *bitmap)
> +{
> + int i;
> + int key;
> + bool success = true;
> +
> + trace_kvm_age_hva(start, end);
> +
> + key = srcu_read_lock(&kvm->srcu);
> +
> + for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) {
> + struct interval_tree_node *node;
> + struct kvm_memslots *slots = __kvm_memslots(kvm, i);
> +
> + kvm_for_each_memslot_in_hva_range(node, slots, start, end - 1) {
> + gfn_t lsb_gfn;
> + unsigned long hva_start, hva_end;
> + struct kvm_gfn_range range = {
> + .slot = container_of(node, struct kvm_memory_slot,
> + hva_node[slots->node_idx]),
> + };
> +
> + hva_start = max(start, range.slot->userspace_addr);
> + hva_end = min(end - 1, range.slot->userspace_addr +
> + range.slot->npages * PAGE_SIZE - 1);
> +
> + range.start = hva_to_gfn_memslot(hva_start, range.slot);
> + range.end = hva_to_gfn_memslot(hva_end, range.slot) + 1;
> +
> + if (WARN_ON_ONCE(range.end <= range.start))
> + continue;
Extend __kvm_handle_hva_range() instead of copy-pasting. At a very quick glance,
I believe all that is needed is (minus sanity checks):
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index d255964ec331..3296ae2cf6fa 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -544,6 +544,7 @@ struct kvm_hva_range {
hva_handler_t handler;
on_lock_fn_t on_lock;
on_unlock_fn_t on_unlock;
+ bool lockless;
bool flush_on_ret;
bool may_block;
};
@@ -616,7 +617,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm,
gfn_range.end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot);
gfn_range.slot = slot;
- if (!locked) {
+ if (!range->lockless && !locked) {
locked = true;
KVM_MMU_LOCK(kvm);
if (!IS_KVM_NULL_FN(range->on_lock))
> +
> + /* see the comments on the generic kvm_arch_has_test_clear_young() */
> + lsb_gfn = hva_to_gfn_memslot(end - 1, range.slot);
> +
> + success = kvm_arch_test_clear_young(kvm, &range, lsb_gfn, bitmap);
> + if (!success)
> + break;
> + }
> + }
> +
> + srcu_read_unlock(&kvm->srcu, key);
> +
> + return success;
> +}
WARNING: multiple messages have this Message-ID (diff)
From: Sean Christopherson <seanjc@google.com>
To: Yu Zhao <yuzhao@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Jonathan Corbet <corbet@lwn.net>,
Michael Larabel <michael@michaellarabel.com>,
kvmarm@lists.linux.dev, kvm@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linuxppc-dev@lists.ozlabs.org, x86@kernel.org,
linux-mm@google.com
Subject: Re: [PATCH mm-unstable v1 1/5] mm/kvm: add mmu_notifier_test_clear_young()
Date: Thu, 23 Feb 2023 09:13:58 -0800 [thread overview]
Message-ID: <Y/ee1s3XPGa62SFV@google.com> (raw)
In-Reply-To: <20230217041230.2417228-2-yuzhao@google.com>
On Thu, Feb 16, 2023, Yu Zhao wrote:
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 9c60384b5ae0..1b465df4a93d 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -875,6 +875,63 @@ static int kvm_mmu_notifier_clear_young(struct mmu_notifier *mn,
> return kvm_handle_hva_range_no_flush(mn, start, end, kvm_age_gfn);
> }
>
> +static bool kvm_test_clear_young(struct kvm *kvm, unsigned long start,
> + unsigned long end, unsigned long *bitmap)
> +{
> + int i;
> + int key;
> + bool success = true;
> +
> + trace_kvm_age_hva(start, end);
> +
> + key = srcu_read_lock(&kvm->srcu);
> +
> + for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) {
> + struct interval_tree_node *node;
> + struct kvm_memslots *slots = __kvm_memslots(kvm, i);
> +
> + kvm_for_each_memslot_in_hva_range(node, slots, start, end - 1) {
> + gfn_t lsb_gfn;
> + unsigned long hva_start, hva_end;
> + struct kvm_gfn_range range = {
> + .slot = container_of(node, struct kvm_memory_slot,
> + hva_node[slots->node_idx]),
> + };
> +
> + hva_start = max(start, range.slot->userspace_addr);
> + hva_end = min(end - 1, range.slot->userspace_addr +
> + range.slot->npages * PAGE_SIZE - 1);
> +
> + range.start = hva_to_gfn_memslot(hva_start, range.slot);
> + range.end = hva_to_gfn_memslot(hva_end, range.slot) + 1;
> +
> + if (WARN_ON_ONCE(range.end <= range.start))
> + continue;
Extend __kvm_handle_hva_range() instead of copy-pasting. At a very quick glance,
I believe all that is needed is (minus sanity checks):
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index d255964ec331..3296ae2cf6fa 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -544,6 +544,7 @@ struct kvm_hva_range {
hva_handler_t handler;
on_lock_fn_t on_lock;
on_unlock_fn_t on_unlock;
+ bool lockless;
bool flush_on_ret;
bool may_block;
};
@@ -616,7 +617,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm,
gfn_range.end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, slot);
gfn_range.slot = slot;
- if (!locked) {
+ if (!range->lockless && !locked) {
locked = true;
KVM_MMU_LOCK(kvm);
if (!IS_KVM_NULL_FN(range->on_lock))
> +
> + /* see the comments on the generic kvm_arch_has_test_clear_young() */
> + lsb_gfn = hva_to_gfn_memslot(end - 1, range.slot);
> +
> + success = kvm_arch_test_clear_young(kvm, &range, lsb_gfn, bitmap);
> + if (!success)
> + break;
> + }
> + }
> +
> + srcu_read_unlock(&kvm->srcu, key);
> +
> + return success;
> +}
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-02-23 17:14 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-17 4:12 [PATCH mm-unstable v1 0/5] mm/kvm: lockless accessed bit harvest Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` [PATCH mm-unstable v1 1/5] mm/kvm: add mmu_notifier_test_clear_young() Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-23 17:13 ` Sean Christopherson [this message]
2023-02-23 17:13 ` Sean Christopherson
2023-02-23 17:13 ` Sean Christopherson
2023-02-23 17:40 ` Yu Zhao
2023-02-23 17:40 ` Yu Zhao
2023-02-23 17:40 ` Yu Zhao
2023-02-23 21:12 ` Sean Christopherson
2023-02-23 21:12 ` Sean Christopherson
2023-02-23 21:12 ` Sean Christopherson
2023-02-23 17:34 ` Sean Christopherson
2023-02-23 17:34 ` Sean Christopherson
2023-02-23 17:34 ` Sean Christopherson
2023-02-17 4:12 ` [PATCH mm-unstable v1 2/5] kvm/x86: add kvm_arch_test_clear_young() Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:19 ` Yu Zhao
2023-02-17 4:19 ` Yu Zhao
2023-02-17 4:19 ` Yu Zhao
2023-02-17 16:27 ` Sean Christopherson
2023-02-17 16:27 ` Sean Christopherson
2023-02-17 16:27 ` Sean Christopherson
2023-02-23 5:58 ` Yu Zhao
2023-02-23 5:58 ` Yu Zhao
2023-02-23 5:58 ` Yu Zhao
2023-02-23 17:09 ` Sean Christopherson
2023-02-23 17:09 ` Sean Christopherson
2023-02-23 17:09 ` Sean Christopherson
2023-02-23 17:27 ` Yu Zhao
2023-02-23 17:27 ` Yu Zhao
2023-02-23 17:27 ` Yu Zhao
2023-02-23 18:23 ` Sean Christopherson
2023-02-23 18:23 ` Sean Christopherson
2023-02-23 18:23 ` Sean Christopherson
2023-02-23 18:34 ` Yu Zhao
2023-02-23 18:34 ` Yu Zhao
2023-02-23 18:34 ` Yu Zhao
2023-02-23 18:47 ` Sean Christopherson
2023-02-23 18:47 ` Sean Christopherson
2023-02-23 18:47 ` Sean Christopherson
2023-02-23 19:02 ` Yu Zhao
2023-02-23 19:02 ` Yu Zhao
2023-02-23 19:02 ` Yu Zhao
2023-02-23 19:21 ` Sean Christopherson
2023-02-23 19:21 ` Sean Christopherson
2023-02-23 19:21 ` Sean Christopherson
2023-02-23 19:25 ` Yu Zhao
2023-02-23 19:25 ` Yu Zhao
2023-02-23 19:25 ` Yu Zhao
2023-02-17 4:12 ` [PATCH mm-unstable v1 3/5] kvm/arm64: " Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:21 ` Yu Zhao
2023-02-17 4:21 ` Yu Zhao
2023-02-17 4:21 ` Yu Zhao
2023-02-17 9:00 ` Marc Zyngier
2023-02-17 9:00 ` Marc Zyngier
2023-02-17 9:00 ` Marc Zyngier
2023-02-23 3:58 ` Yu Zhao
2023-02-23 3:58 ` Yu Zhao
2023-02-23 3:58 ` Yu Zhao
2023-02-23 9:03 ` Marc Zyngier
2023-02-23 9:03 ` Marc Zyngier
2023-02-23 9:03 ` Marc Zyngier
2023-02-23 9:18 ` Yu Zhao
2023-02-23 9:18 ` Yu Zhao
2023-02-23 9:18 ` Yu Zhao
2023-02-17 9:09 ` Oliver Upton
2023-02-17 9:09 ` Oliver Upton
2023-02-17 9:09 ` Oliver Upton
2023-02-17 16:00 ` Sean Christopherson
2023-02-17 16:00 ` Sean Christopherson
2023-02-17 16:00 ` Sean Christopherson
2023-02-23 5:25 ` Yu Zhao
2023-02-23 5:25 ` Yu Zhao
2023-02-23 5:25 ` Yu Zhao
2023-02-23 4:43 ` Yu Zhao
2023-02-23 4:43 ` Yu Zhao
2023-02-23 4:43 ` Yu Zhao
2023-02-17 4:12 ` [PATCH mm-unstable v1 4/5] kvm/powerpc: " Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:24 ` Yu Zhao
2023-02-17 4:24 ` Yu Zhao
2023-02-17 4:24 ` Yu Zhao
2023-02-17 4:12 ` [PATCH mm-unstable v1 5/5] mm: multi-gen LRU: use mmu_notifier_test_clear_young() Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-17 4:12 ` Yu Zhao
2023-02-23 17:43 ` Sean Christopherson
2023-02-23 17:43 ` Sean Christopherson
2023-02-23 17:43 ` Sean Christopherson
2023-02-23 18:08 ` Yu Zhao
2023-02-23 18:08 ` Yu Zhao
2023-02-23 18:08 ` Yu Zhao
2023-02-23 19:11 ` Sean Christopherson
2023-02-23 19:11 ` Sean Christopherson
2023-02-23 19:11 ` Sean Christopherson
2023-02-23 19:36 ` Yu Zhao
2023-02-23 19:36 ` Yu Zhao
2023-02-23 19:36 ` Yu Zhao
2023-02-23 19:58 ` Sean Christopherson
2023-02-23 19:58 ` Sean Christopherson
2023-02-23 19:58 ` Sean Christopherson
2023-02-23 20:09 ` Yu Zhao
2023-02-23 20:09 ` Yu Zhao
2023-02-23 20:09 ` Yu Zhao
2023-02-23 20:28 ` Sean Christopherson
2023-02-23 20:28 ` Sean Christopherson
2023-02-23 20:28 ` Sean Christopherson
2023-02-23 20:48 ` Yu Zhao
2023-02-23 20:48 ` Yu Zhao
2023-02-23 20:48 ` Yu Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y/ee1s3XPGa62SFV@google.com \
--to=seanjc@google.com \
--cc=akpm@linux-foundation.org \
--cc=corbet@lwn.net \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@google.com \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=michael@michaellarabel.com \
--cc=pbonzini@redhat.com \
--cc=x86@kernel.org \
--cc=yuzhao@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.