Commit 76458291 authored by Sean Christopherson's avatar Sean Christopherson

KVM: x86/mmu: Add KVM_RMAP_MANY to replace open coded '1' and '1ul' literals

Replace all of the open coded '1' literals used to mark a PTE list as
having many/multiple entries with a proper define.  It's hard enough to
read the code with one magic bit, and a future patch to support "locking"
a single rmap will add another.

No functional change intended.

Link: https://lore.kernel.org/r/20240809194335.1726916-17-seanjc@google.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 7aac9dc6
...@@ -912,6 +912,7 @@ static struct kvm_memory_slot *gfn_to_memslot_dirty_bitmap(struct kvm_vcpu *vcpu ...@@ -912,6 +912,7 @@ static struct kvm_memory_slot *gfn_to_memslot_dirty_bitmap(struct kvm_vcpu *vcpu
* in this rmap chain. Otherwise, (rmap_head->val & ~1) points to a struct * in this rmap chain. Otherwise, (rmap_head->val & ~1) points to a struct
* pte_list_desc containing more mappings. * pte_list_desc containing more mappings.
*/ */
#define KVM_RMAP_MANY BIT(0)
/* /*
* Returns the number of pointers in the rmap chain, not counting the new one. * Returns the number of pointers in the rmap chain, not counting the new one.
...@@ -924,16 +925,16 @@ static int pte_list_add(struct kvm_mmu_memory_cache *cache, u64 *spte, ...@@ -924,16 +925,16 @@ static int pte_list_add(struct kvm_mmu_memory_cache *cache, u64 *spte,
if (!rmap_head->val) { if (!rmap_head->val) {
rmap_head->val = (unsigned long)spte; rmap_head->val = (unsigned long)spte;
} else if (!(rmap_head->val & 1)) { } else if (!(rmap_head->val & KVM_RMAP_MANY)) {
desc = kvm_mmu_memory_cache_alloc(cache); desc = kvm_mmu_memory_cache_alloc(cache);
desc->sptes[0] = (u64 *)rmap_head->val; desc->sptes[0] = (u64 *)rmap_head->val;
desc->sptes[1] = spte; desc->sptes[1] = spte;
desc->spte_count = 2; desc->spte_count = 2;
desc->tail_count = 0; desc->tail_count = 0;
rmap_head->val = (unsigned long)desc | 1; rmap_head->val = (unsigned long)desc | KVM_RMAP_MANY;
++count; ++count;
} else { } else {
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul); desc = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
count = desc->tail_count + desc->spte_count; count = desc->tail_count + desc->spte_count;
/* /*
...@@ -942,10 +943,10 @@ static int pte_list_add(struct kvm_mmu_memory_cache *cache, u64 *spte, ...@@ -942,10 +943,10 @@ static int pte_list_add(struct kvm_mmu_memory_cache *cache, u64 *spte,
*/ */
if (desc->spte_count == PTE_LIST_EXT) { if (desc->spte_count == PTE_LIST_EXT) {
desc = kvm_mmu_memory_cache_alloc(cache); desc = kvm_mmu_memory_cache_alloc(cache);
desc->more = (struct pte_list_desc *)(rmap_head->val & ~1ul); desc->more = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
desc->spte_count = 0; desc->spte_count = 0;
desc->tail_count = count; desc->tail_count = count;
rmap_head->val = (unsigned long)desc | 1; rmap_head->val = (unsigned long)desc | KVM_RMAP_MANY;
} }
desc->sptes[desc->spte_count++] = spte; desc->sptes[desc->spte_count++] = spte;
} }
...@@ -956,7 +957,7 @@ static void pte_list_desc_remove_entry(struct kvm *kvm, ...@@ -956,7 +957,7 @@ static void pte_list_desc_remove_entry(struct kvm *kvm,
struct kvm_rmap_head *rmap_head, struct kvm_rmap_head *rmap_head,
struct pte_list_desc *desc, int i) struct pte_list_desc *desc, int i)
{ {
struct pte_list_desc *head_desc = (struct pte_list_desc *)(rmap_head->val & ~1ul); struct pte_list_desc *head_desc = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
int j = head_desc->spte_count - 1; int j = head_desc->spte_count - 1;
/* /*
...@@ -985,7 +986,7 @@ static void pte_list_desc_remove_entry(struct kvm *kvm, ...@@ -985,7 +986,7 @@ static void pte_list_desc_remove_entry(struct kvm *kvm,
if (!head_desc->more) if (!head_desc->more)
rmap_head->val = 0; rmap_head->val = 0;
else else
rmap_head->val = (unsigned long)head_desc->more | 1; rmap_head->val = (unsigned long)head_desc->more | KVM_RMAP_MANY;
mmu_free_pte_list_desc(head_desc); mmu_free_pte_list_desc(head_desc);
} }
...@@ -998,13 +999,13 @@ static void pte_list_remove(struct kvm *kvm, u64 *spte, ...@@ -998,13 +999,13 @@ static void pte_list_remove(struct kvm *kvm, u64 *spte,
if (KVM_BUG_ON_DATA_CORRUPTION(!rmap_head->val, kvm)) if (KVM_BUG_ON_DATA_CORRUPTION(!rmap_head->val, kvm))
return; return;
if (!(rmap_head->val & 1)) { if (!(rmap_head->val & KVM_RMAP_MANY)) {
if (KVM_BUG_ON_DATA_CORRUPTION((u64 *)rmap_head->val != spte, kvm)) if (KVM_BUG_ON_DATA_CORRUPTION((u64 *)rmap_head->val != spte, kvm))
return; return;
rmap_head->val = 0; rmap_head->val = 0;
} else { } else {
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul); desc = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
while (desc) { while (desc) {
for (i = 0; i < desc->spte_count; ++i) { for (i = 0; i < desc->spte_count; ++i) {
if (desc->sptes[i] == spte) { if (desc->sptes[i] == spte) {
...@@ -1037,12 +1038,12 @@ static bool kvm_zap_all_rmap_sptes(struct kvm *kvm, ...@@ -1037,12 +1038,12 @@ static bool kvm_zap_all_rmap_sptes(struct kvm *kvm,
if (!rmap_head->val) if (!rmap_head->val)
return false; return false;
if (!(rmap_head->val & 1)) { if (!(rmap_head->val & KVM_RMAP_MANY)) {
mmu_spte_clear_track_bits(kvm, (u64 *)rmap_head->val); mmu_spte_clear_track_bits(kvm, (u64 *)rmap_head->val);
goto out; goto out;
} }
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul); desc = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
for (; desc; desc = next) { for (; desc; desc = next) {
for (i = 0; i < desc->spte_count; i++) for (i = 0; i < desc->spte_count; i++)
...@@ -1062,10 +1063,10 @@ unsigned int pte_list_count(struct kvm_rmap_head *rmap_head) ...@@ -1062,10 +1063,10 @@ unsigned int pte_list_count(struct kvm_rmap_head *rmap_head)
if (!rmap_head->val) if (!rmap_head->val)
return 0; return 0;
else if (!(rmap_head->val & 1)) else if (!(rmap_head->val & KVM_RMAP_MANY))
return 1; return 1;
desc = (struct pte_list_desc *)(rmap_head->val & ~1ul); desc = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
return desc->tail_count + desc->spte_count; return desc->tail_count + desc->spte_count;
} }
...@@ -1127,13 +1128,13 @@ static u64 *rmap_get_first(struct kvm_rmap_head *rmap_head, ...@@ -1127,13 +1128,13 @@ static u64 *rmap_get_first(struct kvm_rmap_head *rmap_head,
if (!rmap_head->val) if (!rmap_head->val)
return NULL; return NULL;
if (!(rmap_head->val & 1)) { if (!(rmap_head->val & KVM_RMAP_MANY)) {
iter->desc = NULL; iter->desc = NULL;
sptep = (u64 *)rmap_head->val; sptep = (u64 *)rmap_head->val;
goto out; goto out;
} }
iter->desc = (struct pte_list_desc *)(rmap_head->val & ~1ul); iter->desc = (struct pte_list_desc *)(rmap_head->val & ~KVM_RMAP_MANY);
iter->pos = 0; iter->pos = 0;
sptep = iter->desc->sptes[iter->pos]; sptep = iter->desc->sptes[iter->pos];
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment