KVM: x86/mmu: Files and sp helper cleanups
cover KVM: x86/mmu: Files and sp helper cleanups
Move more files to the mmu/ directory, and an mmu_internal.h to share stuff amongst the mmu/ files, and clean up the helpers for retrieving a shadow page from a sptep and/or hpa.
Sean Christopherson (6):
KVM: x86/mmu: Move mmu_audit.c and mmutrace.h into the mmu/
sub-directory
KVM: x86/mmu: Move kvm_mmu_available_pages() into mmu.c
KVM: x86/mmu: Add MMU-internal header
KVM: x86/mmu: Make kvm_mmu_page definition and accessor internal-only
KVM: x86/mmu: Add sptep_to_sp() helper to wrap shadow page lookup
KVM: x86/mmu: Rename page_header() to to_shadow_page()
arch/x86/include/asm/kvm_host.h | 46 +---------------------
arch/x86/kvm/mmu.h | 13 ------
arch/x86/kvm/mmu/mmu.c | 58 +++++++++++++++------------
arch/x86/kvm/{ => mmu}/mmu_audit.c | 12 +++---
arch/x86/kvm/mmu/mmu_internal.h | 63 ++++++++++++++++++++++++++++++
arch/x86/kvm/{ => mmu}/mmutrace.h | 2 +-
arch/x86/kvm/mmu/page_track.c | 2 +-
arch/x86/kvm/mmu/paging_tmpl.h | 4 +-
8 files changed, 108 insertions(+), 92 deletions(-)
rename arch/x86/kvm/{ => mmu}/mmu_audit.c (96%)
create mode 100644 arch/x86/kvm/mmu/mmu_internal.h
rename arch/x86/kvm/{ => mmu}/mmutrace.h (99%)Signature · 1 line
2.26.0
PATCH 1/6 KVM: x86/mmu: Move mmu_audit.c and mmutrace.h into the mmu/ sub-directory
Move mmu_audit.c and mmutrace.h under mmu/ where they belong.
---
arch/x86/kvm/{ => mmu}/mmu_audit.c | 0
arch/x86/kvm/{ => mmu}/mmutrace.h | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
rename arch/x86/kvm/{ => mmu}/mmu_audit.c (100%)
rename arch/x86/kvm/{ => mmu}/mmutrace.h (99%)arch/x86/kvm/mmu/mmu_audit.c renamed from arch/x86/kvm/mmu_audit.c +0 -0
arch/x86/kvm/mmu/mmutrace.h renamed from arch/x86/kvm/mmutrace.h +1 -1
@@ -387,7 +387,7 @@ TRACE_EVENT(#endif /* _TRACE_KVMMMU_H */ #undef TRACE_INCLUDE_PATH -#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_PATH mmu#undef TRACE_INCLUDE_FILE#define TRACE_INCLUDE_FILE mmutrace
Signature · 1 line
2.26.0
PATCH 2/6 KVM: x86/mmu: Move kvm_mmu_available_pages() into mmu.c
In reply to Sean ChristophersonMove kvm_mmu_available_pages() from mmu.h to mmu.c, it has a single caller and has no business being exposed via mmu.h.
--- arch/x86/kvm/mmu.h | 9 --------- arch/x86/kvm/mmu/mmu.c | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-)
arch/x86/kvm/mmu.h +0 -9
@@ -64,15 +64,6 @@ bool kvm_can_do_async_pf(struct kvm_vcpu *vcpu);int kvm_handle_page_fault (struct kvm_vcpu *vcpu,u64 error_code,u64 fault_address,char *insn,int insn_len); -static inline unsigned long kvm_mmu_available_pages (struct kvm *kvm) -{ -if (kvm->arch.n_max_mmu_pages > kvm->arch.n_used_mmu_pages) -return kvm->arch.n_max_mmu_pages - - kvm->arch.n_used_mmu_pages; - -return 0 ; -} -static inline int kvm_mmu_reload (struct kvm_vcpu *vcpu) {if (likely (vcpu->arch.mmu->root_hpa !=INVALID_PAGE ))
arch/x86/kvm/mmu/mmu.c +9 -0
@@ -2825,6 +2825,15 @@ static bool prepare_zap_oldest_mmu_page(struct kvm *kvm,return kvm_mmu_prepare_zap_page (kvm, sp, invalid_list); } +static inline unsigned long kvm_mmu_available_pages (struct kvm *kvm) +{ +if (kvm->arch.n_max_mmu_pages > kvm->arch.n_used_mmu_pages) +return kvm->arch.n_max_mmu_pages - + kvm->arch.n_used_mmu_pages; + +return 0 ; +} +static int make_mmu_pages_available (struct kvm_vcpu *vcpu) {LIST_HEAD (invalid_list);
Signature · 1 line
2.26.0
PATCH 3/6 KVM: x86/mmu: Add MMU-internal header
In reply to Sean ChristophersonAdd mmu/mmu_internal.h to hold declarations and definitions that need to be shared between various mmu/ files, but should not be used by anything outside of the MMU.
Begin populating mmu_internal.h with declarations of the helpers used by page_track.c.
--- arch/x86/kvm/mmu.h | 4 ---- arch/x86/kvm/mmu/mmu.c | 1 + arch/x86/kvm/mmu/mmu_internal.h | 10 ++++++++++ arch/x86/kvm/mmu/page_track.c | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 arch/x86/kvm/mmu/mmu_internal.h
arch/x86/kvm/mmu.h +0 -4
@@ -209,10 +209,6 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,void kvm_zap_gfn_range (struct kvm *kvm,gfn_t gfn_start,gfn_t gfn_end); -void kvm_mmu_gfn_disallow_lpage (struct kvm_memory_slot *slot,gfn_t gfn); -void kvm_mmu_gfn_allow_lpage (struct kvm_memory_slot *slot,gfn_t gfn); -bool kvm_mmu_slot_gfn_write_protect (struct kvm *kvm, -struct kvm_memory_slot *slot,u64 gfn);int kvm_arch_write_log_dirty (struct kvm_vcpu *vcpu);int kvm_mmu_post_init_vm (struct kvm *kvm);
arch/x86/kvm/mmu/mmu.c +1 -0
@@ -18,6 +18,7 @@#include "irq.h" #include "ioapic.h" #include "mmu.h" +#include "mmu_internal.h" #include "x86.h" #include "kvm_cache_regs.h" #include "kvm_emulate.h"
arch/x86/kvm/mmu/mmu_internal.h new file +10 -0
@@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __KVM_X86_MMU_INTERNAL_H +#define __KVM_X86_MMU_INTERNAL_H + +void kvm_mmu_gfn_disallow_lpage (struct kvm_memory_slot *slot,gfn_t gfn); +void kvm_mmu_gfn_allow_lpage (struct kvm_memory_slot *slot,gfn_t gfn); +bool kvm_mmu_slot_gfn_write_protect (struct kvm *kvm, +struct kvm_memory_slot *slot,u64 gfn); + +#endif /* __KVM_X86_MMU_INTERNAL_H */
arch/x86/kvm/mmu/page_track.c +1 -1
@@ -16,7 +16,7 @@#include <asm/kvm_page_track.h> -#include "mmu.h" +#include "mmu_internal.h" void kvm_page_track_free_memslot (struct kvm_memory_slot *slot) {
Signature · 1 line
2.26.0
PATCH 4/6 KVM: x86/mmu: Make kvm_mmu_page definition and accessor internal-only
In reply to Sean ChristophersonMake 'struct kvm_mmu_page' MMU-only, nothing outside of the MMU should be poking into the gory details of shadow pages.
--- arch/x86/include/asm/kvm_host.h | 46 ++----------------------------- arch/x86/kvm/mmu/mmu_internal.h | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 44 deletions(-)
arch/x86/include/asm/kvm_host.h +2 -44
@@ -322,43 +322,6 @@ struct kvm_rmap_head {unsigned long val; }; -struct kvm_mmu_page { -struct list_head link; -struct hlist_node hash_link; -struct list_head lpage_disallowed_link; - -bool unsync; -u8 mmu_valid_gen; -bool mmio_cached; -bool lpage_disallowed;/* Can't be replaced by an equiv large page */ - -/* -* The following two entries are used to key the shadow page in the -* hash table. -*/ -union kvm_mmu_page_role role; -gfn_t gfn; - -u64 *spt; -/* hold the gfn of each spte inside spt */ -gfn_t *gfns; -int root_count;/* Currently serving as active root */ -unsigned int unsync_children; -struct kvm_rmap_head parent_ptes;/* rmap pointers to parent sptes */ - DECLARE_BITMAP(unsync_child_bitmap, 512); - -#ifdef CONFIG_X86_32 -/* -* Used out of the mmu-lock to avoid reading spte values while an -* update is in progress; see the comments in __get_spte_lockless(). -*/ -int clear_spte_count; -#endif - -/* Number of writes since the last time traversal visited this page. */ -atomic_t write_flooding_count; -}; -struct kvm_pio_request {unsigned long linear_rip;unsigned long count;
@@ -384,6 +347,8 @@ struct kvm_mmu_root_info {#define KVM_MMU_NUM_PREV_ROOTS 3 +struct kvm_mmu_page ; +/* * x86 supports 4 paging modes (5-level 64-bit, 4-level 64-bit, 3-level 32-bit, * and 2-level 32-bit). The kvm_mmu structure abstracts the details of the
@@ -1557,13 +1522,6 @@ static inline gpa_t translate_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access,return gpa; } -static inline struct kvm_mmu_page *page_header (hpa_t shadow_page) -{ -struct page *page =pfn_to_page (shadow_page >>PAGE_SHIFT ); - -return (struct kvm_mmu_page *)page_private (page); -} -static inline u16 kvm_read_ldt (void ) {u16 ldt;
arch/x86/kvm/mmu/mmu_internal.h +48 -0
54 lines not on this page · raw message
Signature · 1 line
2.26.0
PATCH 5/6 KVM: x86/mmu: Add sptep_to_sp() helper to wrap shadow page lookup
In reply to Sean ChristophersonIntroduce sptep_to_sp() to reduce the boilerplate code needed to get the shadow page associated with a spte pointer, and to improve readability as it's not immediately obvious that "page_header" is a KVM-specific accessor for retrieving a shadow page.
--- arch/x86/kvm/mmu/mmu.c | 28 +++++++++++++--------------- arch/x86/kvm/mmu/mmu_audit.c | 6 +++--- arch/x86/kvm/mmu/mmu_internal.h | 5 +++++ arch/x86/kvm/mmu/paging_tmpl.h | 4 ++-- 4 files changed, 23 insertions(+), 20 deletions(-)
arch/x86/kvm/mmu/mmu.c +13 -15
@@ -677,7 +677,7 @@ union split_spte {static void count_spte_clear (u64 *sptep,u64 spte) { -struct kvm_mmu_page *sp =page_header (__pa (sptep)); +struct kvm_mmu_page *sp =sptep_to_sp (sptep);if (is_shadow_present_pte (spte))return ;
@@ -761,7 +761,7 @@ static u64 __update_clear_spte_slow(u64 *sptep, u64 spte)*/ static u64 __get_spte_lockless (u64 *sptep) { -struct kvm_mmu_page *sp =page_header (__pa (sptep)); +struct kvm_mmu_page *sp =sptep_to_sp (sptep);union split_spte spte, *orig = (union split_spte *)sptep;int count;
@@ -1427,7 +1427,7 @@ static int rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn)struct kvm_mmu_page *sp;struct kvm_rmap_head *rmap_head; - sp =page_header (__pa (spte)); + sp =sptep_to_sp (spte);kvm_mmu_page_set_gfn (sp, spte - sp->spt, gfn); rmap_head =gfn_to_rmap (vcpu->kvm, gfn, sp);return pte_list_add (vcpu, spte, rmap_head);
@@ -1439,7 +1439,7 @@ static void rmap_remove(struct kvm *kvm, u64 *spte)gfn_t gfn;struct kvm_rmap_head *rmap_head; - sp =page_header (__pa (spte)); + sp =sptep_to_sp (spte); gfn =kvm_mmu_page_get_gfn (sp, spte - sp->spt); rmap_head =gfn_to_rmap (kvm, gfn, sp);__pte_list_remove (spte, rmap_head);
@@ -1531,7 +1531,7 @@ static void drop_spte(struct kvm *kvm, u64 *sptep)static bool __drop_large_spte (struct kvm *kvm,u64 *sptep) {if (is_large_pte (*sptep)) { -WARN_ON (page_header (__pa (sptep))->role.level ==PG_LEVEL_4K ); +WARN_ON (sptep_to_sp (sptep)->role.level ==PG_LEVEL_4K );drop_spte (kvm, sptep); --kvm->stat.lpages;return true;
@@ -1543,7 +1543,7 @@ static bool __drop_large_spte(struct kvm *kvm, u64 *sptep)static void drop_large_spte (struct kvm_vcpu *vcpu,u64 *sptep) {if (__drop_large_spte (vcpu->kvm, sptep)) { -struct kvm_mmu_page *sp =page_header (__pa (sptep)); +struct kvm_mmu_page *sp =sptep_to_sp (sptep);kvm_flush_remote_tlbs_with_address (vcpu->kvm, sp->gfn,KVM_PAGES_PER_HPAGE (sp->role.level));
@@ -2017,7 +2017,7 @@ static void rmap_recycle(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn)struct kvm_rmap_head *rmap_head;struct kvm_mmu_page *sp; - sp =page_header (__pa (spte)); + sp =sptep_to_sp (spte); rmap_head =gfn_to_rmap (vcpu->kvm, gfn, sp);
@@ -2139,7 +2139,7 @@ static void mark_unsync(u64 *spte)struct kvm_mmu_page *sp;unsigned int index; - sp =page_header (__pa (spte)); + sp =sptep_to_sp (spte); index = spte - sp->spt;if (__test_and_set_bit (index, sp->unsync_child_bitmap))return ;
@@ -2465,9 +2465,7 @@ static void __clear_sp_write_flooding_count(struct kvm_mmu_page *sp)static void clear_sp_write_flooding_count (u64 *spte) { -struct kvm_mmu_page *sp =page_header (__pa (spte)); - -__clear_sp_write_flooding_count (sp); +__clear_sp_write_flooding_count (sptep_to_sp (spte)); } static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
@@ -3009,7 +3007,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,if (set_mmio_spte (vcpu, sptep, gfn, pfn, pte_access))return 0 ; - sp =page_header (__pa (sptep)); + sp =sptep_to_sp (sptep);if (sp_ad_disabled (sp)) spte |=SPTE_AD_DISABLED_MASK ;else if (kvm_vcpu_ad_need_write_protect (vcpu))
@@ -3222,7 +3220,7 @@ static void direct_pte_prefetch(struct kvm_vcpu *vcpu, u64 *sptep) {struct kvm_mmu_page *sp; - sp =page_header (__pa (sptep)); + sp =sptep_to_sp (sptep);/* * Without accessed bits, there's no way to distinguish between
@@ -3530,7 +3528,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,if (!is_shadow_present_pte (spte))break ; - sp =page_header (__pa (iterator.sptep)); + sp =sptep_to_sp (iterator.sptep);if (!is_last_spte (spte, sp->role.level))break ;
@@ -5914,7 +5912,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm, restart:for_each_rmap_spte (rmap_head, &iter, sptep) { - sp =page_header (__pa (sptep)); + sp =sptep_to_sp (sptep); pfn =spte_to_pfn (*sptep);/*
arch/x86/kvm/mmu/mmu_audit.c +3 -3
@@ -97,7 +97,7 @@ static void audit_mappings(struct kvm_vcpu *vcpu, u64 *sptep, int level)kvm_pfn_t pfn;hpa_t hpa; - sp =page_header (__pa (sptep)); + sp =sptep_to_sp (sptep);if (sp->unsync) {if (level !=PG_LEVEL_4K ) {
@@ -132,7 +132,7 @@ static void inspect_spte_has_rmap(struct kvm *kvm, u64 *sptep)struct kvm_memory_slot *slot;gfn_t gfn; - rev_sp =page_header (__pa (sptep)); + rev_sp =sptep_to_sp (sptep); gfn =kvm_mmu_page_get_gfn (rev_sp, sptep - rev_sp->spt); slots =kvm_memslots_for_spte_role (kvm, rev_sp->role);
@@ -165,7 +165,7 @@ static void audit_sptes_have_rmaps(struct kvm_vcpu *vcpu, u64 *sptep, int level)static void audit_spte_after_sync (struct kvm_vcpu *vcpu,u64 *sptep,int level) { -struct kvm_mmu_page *sp =page_header (__pa (sptep)); +struct kvm_mmu_page *sp =sptep_to_sp (sptep);if (vcpu->kvm->arch.audit_point ==AUDIT_POST_SYNC && sp->unsync) audit_printk(vcpu->kvm, "meet unsync sp(%p) after sync "
arch/x86/kvm/mmu/mmu_internal.h +5 -0
@@ -50,6 +50,11 @@ static inline struct kvm_mmu_page *page_header(hpa_t shadow_page)return (struct kvm_mmu_page *)page_private (page); } +static inline struct kvm_mmu_page *sptep_to_sp (u64 *sptep) +{ +return page_header (__pa (sptep)); +} +void kvm_mmu_gfn_disallow_lpage (struct kvm_memory_slot *slot,gfn_t gfn);void kvm_mmu_gfn_allow_lpage (struct kvm_memory_slot *slot,gfn_t gfn); bool kvm_mmu_slot_gfn_write_protect(struct kvm *kvm,
arch/x86/kvm/mmu/paging_tmpl.h +2 -2
@@ -598,7 +598,7 @@ static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw,u64 *spte;int i; - sp =page_header (__pa (sptep)); + sp =sptep_to_sp (sptep);if (sp->role.level >PG_LEVEL_4K )return ;
@@ -917,7 +917,7 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva, hpa_t root_hpa) level = iterator.level; sptep = iterator.sptep; - sp =page_header (__pa (sptep)); + sp =sptep_to_sp (sptep);if (is_last_spte (*sptep, level)) {pt_element_t gpte;gpa_t pte_gpa;
Signature · 1 line
2.26.0
PATCH 6/6 KVM: x86/mmu: Rename page_header() to to_shadow_page()
In reply to Sean ChristophersonRename KVM's accessor for retrieving a 'struct kvm_mmu_page' from the associated host physical address to better convey what the function is doing.
--- arch/x86/kvm/mmu/mmu.c | 20 ++++++++++---------- arch/x86/kvm/mmu/mmu_audit.c | 6 +++--- arch/x86/kvm/mmu/mmu_internal.h | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-)
arch/x86/kvm/mmu/mmu.c +10 -10
@@ -2208,7 +2208,7 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp,continue ; } - child =page_header (ent &PT64_BASE_ADDR_MASK ); + child =to_shadow_page (ent &PT64_BASE_ADDR_MASK );if (child->unsync_children) {if (mmu_pages_add (pvec, child, i))
@@ -2656,7 +2656,7 @@ static void validate_direct_spte(struct kvm_vcpu *vcpu, u64 *sptep,* so we should update the spte at this point to get * a new sp with the correct access. */ - child =page_header (*sptep &PT64_BASE_ADDR_MASK ); + child =to_shadow_page (*sptep &PT64_BASE_ADDR_MASK );if (child->role.access == direct_access)return ;
@@ -2678,7 +2678,7 @@ static bool mmu_page_zap_pte(struct kvm *kvm, struct kvm_mmu_page *sp,if (is_large_pte (pte)) --kvm->stat.lpages; }else { - child =page_header (pte &PT64_BASE_ADDR_MASK ); + child =to_shadow_page (pte &PT64_BASE_ADDR_MASK );drop_parent_pte (child, spte); }return true;
@@ -3110,7 +3110,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,struct kvm_mmu_page *child;u64 pte = *sptep; - child =page_header (pte &PT64_BASE_ADDR_MASK ); + child =to_shadow_page (pte &PT64_BASE_ADDR_MASK );drop_parent_pte (child, sptep); flush = true; }else if (pfn !=spte_to_pfn (*sptep)) {
@@ -3615,7 +3615,7 @@ static void mmu_free_root_page(struct kvm *kvm, hpa_t *root_hpa,if (!VALID_PAGE (*root_hpa))return ; - sp =page_header (*root_hpa &PT64_BASE_ADDR_MASK ); + sp =to_shadow_page (*root_hpa &PT64_BASE_ADDR_MASK ); --sp->root_count;if (!sp->root_count && sp->role.invalid)kvm_mmu_prepare_zap_page (kvm, sp, invalid_list);
@@ -3845,7 +3845,7 @@ void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu)if (vcpu->arch.mmu->root_level >=PT64_ROOT_4LEVEL ) {hpa_t root = vcpu->arch.mmu->root_hpa; - sp =page_header (root); + sp =to_shadow_page (root);/* * Even if another CPU was marking the SP as unsync-ed
@@ -3879,7 +3879,7 @@ void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu)if (root &&VALID_PAGE (root)) { root &=PT64_BASE_ADDR_MASK ; - sp =page_header (root); + sp =to_shadow_page (root);mmu_sync_children (vcpu, sp); } }
@@ -4235,8 +4235,8 @@ static inline bool is_root_usable(struct kvm_mmu_root_info *root, gpa_t pgd, union kvm_mmu_page_role role) {return (role.direct || pgd == root->pgd) && -VALID_PAGE (root->hpa) &&page_header (root->hpa) && - role.word ==page_header (root->hpa)->role.word; +VALID_PAGE (root->hpa) &&to_shadow_page (root->hpa) && + role.word ==to_shadow_page (root->hpa)->role.word; }/*
@@ -4321,7 +4321,7 @@ static void __kvm_mmu_new_pgd(struct kvm_vcpu *vcpu, gpa_t new_pgd,*/ vcpu_clear_mmio_info (vcpu,MMIO_GVA_ANY ); -__clear_sp_write_flooding_count (page_header (vcpu->arch.mmu->root_hpa)); +__clear_sp_write_flooding_count (to_shadow_page (vcpu->arch.mmu->root_hpa)); } void kvm_mmu_new_pgd(struct kvm_vcpu *vcpu, gpa_t new_pgd, bool skip_tlb_flush,
arch/x86/kvm/mmu/mmu_audit.c +3 -3
@@ -45,7 +45,7 @@ static void __mmu_spte_walk(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, !is_last_spte(ent[i], level)) {struct kvm_mmu_page *child; - child =page_header (ent[i] &PT64_BASE_ADDR_MASK ); + child =to_shadow_page (ent[i] &PT64_BASE_ADDR_MASK );__mmu_spte_walk (vcpu, child, fn, level -1 ); } }
@@ -62,7 +62,7 @@ static void mmu_spte_walk(struct kvm_vcpu *vcpu, inspect_spte_fn fn)if (vcpu->arch.mmu->root_level >=PT64_ROOT_4LEVEL ) {hpa_t root = vcpu->arch.mmu->root_hpa; - sp =page_header (root); + sp =to_shadow_page (root);__mmu_spte_walk (vcpu, sp, fn, vcpu->arch.mmu->root_level);return ; }
@@ -72,7 +72,7 @@ static void mmu_spte_walk(struct kvm_vcpu *vcpu, inspect_spte_fn fn)if (root &&VALID_PAGE (root)) { root &=PT64_BASE_ADDR_MASK ; - sp =page_header (root); + sp =to_shadow_page (root);__mmu_spte_walk (vcpu, sp, fn,2 ); } }
arch/x86/kvm/mmu/mmu_internal.h +2 -2
@@ -43,7 +43,7 @@ struct kvm_mmu_page {atomic_t write_flooding_count; }; -static inline struct kvm_mmu_page *page_header (hpa_t shadow_page) +static inline struct kvm_mmu_page *to_shadow_page (hpa_t shadow_page) {struct page *page =pfn_to_page (shadow_page >>PAGE_SHIFT );
@@ -52,7 +52,7 @@ static inline struct kvm_mmu_page *page_header(hpa_t shadow_page)static inline struct kvm_mmu_page *sptep_to_sp (u64 *sptep) { -return page_header (__pa (sptep)); +return to_shadow_page (__pa (sptep)); }void kvm_mmu_gfn_disallow_lpage (struct kvm_memory_slot *slot,gfn_t gfn);
Signature · 1 line
2.26.0
Quoted 13 lines · Sean Christopherson
Move more files to the mmu/ directory, and an
mmu_internal.hto share stuff amongst the mmu/ files, and clean up the helpers for retrieving a shadow page from a sptep and/or hpa.Sean Christopherson (6):
KVM: x86/mmu: Movemmu_audit.candmmutrace.hinto the mmu/
sub-directory
KVM: x86/mmu: Movekvm_mmu_available_pages()intommu.c
KVM: x86/mmu: Add MMU-internal header
KVM: x86/mmu: Makekvm_mmu_pagedefinition and accessor internal-only
KVM: x86/mmu: Addsptep_to_sp()helper to wrap shadow page lookup
KVM: x86/mmu: Renamepage_header()toto_shadow_page()
Quoted 13 lines
arch/x86/include/asm/kvm_host.h | 46 +---------------------
arch/x86/kvm/mmu.h | 13 ------
arch/x86/kvm/mmu/mmu.c | 58 +++++++++++++++------------
arch/x86/kvm/{ => mmu}/mmu_audit.c | 12 +++---
arch/x86/kvm/mmu/mmu_internal.h | 63 ++++++++++++++++++++++++++++++
arch/x86/kvm/{ => mmu}/mmutrace.h | 2 +-
arch/x86/kvm/mmu/page_track.c | 2 +-
arch/x86/kvm/mmu/paging_tmpl.h | 4 +-
8 files changed, 108 insertions(+), 92 deletions(-)
rename arch/x86/kvm/{ => mmu}/mmu_audit.c (96%)
create mode 100644 arch/x86/kvm/mmu/mmu_internal.h
rename arch/x86/kvm/{ => mmu}/mmutrace.h (99%)Queued, thanks.
Paolo