Re: [PATCH v6 26/29] KVM: Optimize gfn lookup in kvm_zap_gfn_range()

From: Maciej S. Szmigiero
Date: Wed Dec 01 2021 - 10:49:24 EST


On 01.12.2021 04:41, Sean Christopherson wrote:
On Tue, Nov 30, 2021, Maciej S. Szmigiero wrote:
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 41efe53cf150..6fce6eb797a7 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -848,6 +848,105 @@ struct kvm_memory_slot *id_to_memslot(struct kvm_memslots *slots, int id)
return NULL;
}
+/* Iterator used for walking memslots that overlap a gfn range. */
+struct kvm_memslot_iter {
+ struct kvm_memslots *slots;
+ gfn_t end;
+ struct rb_node *node;
+};

...

+static inline struct kvm_memory_slot *kvm_memslot_iter_slot(struct kvm_memslot_iter *iter)
+{
+ return container_of(iter->node, struct kvm_memory_slot, gfn_node[iter->slots->node_idx]);

Having to use a helper in callers of kvm_for_each_memslot_in_gfn_range() is a bit
ugly, any reason not to grab @slot as well? Then the callers just do iter.slot,
which IMO is much more readable.

"slot" can be easily calculated from "node" together with either "slots" or
"node_idx" (the code above just adjusts a pointer) so storing it in the
iterator makes little sense if the later are already stored there.

And if we do that, I'd also vote to omit slots and end from the iterator. It would
mean passing in slots and end to kvm_memslot_iter_is_valid() and kvm_memslot_iter_next(),
but that's more idiomatic in a for-loop if iter is considered to be _just_ the iterator
part. "slots" is arguable, but "end" really shouldn't be part of the iterator.

You're right that we can get away with not storing "end", will remove it.

Thanks,
Maciej