Skip to content

Commit 4b12f0d

Browse files
Sheng Yangavikivity
authored andcommitted
KVM: Replace get_mt_mask_shift with get_mt_mask
Shadow_mt_mask is out of date, now it have only been used as a flag to indicate if TDP enabled. Get rid of it and use tdp_enabled instead. Also put memory type logical in kvm_x86_ops->get_mt_mask(). Signed-off-by: Sheng Yang <sheng@linux.intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
1 parent 9b62e5b commit 4b12f0d

File tree

5 files changed

+24
-25
lines changed

5 files changed

+24
-25
lines changed

arch/x86/include/asm/kvm_host.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ struct kvm_x86_ops {
522522
void (*drop_interrupt_shadow)(struct kvm_vcpu *vcpu);
523523
int (*set_tss_addr)(struct kvm *kvm, unsigned int addr);
524524
int (*get_tdp_level)(void);
525-
int (*get_mt_mask_shift)(void);
525+
u64 (*get_mt_mask)(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio);
526526
};
527527

528528
extern struct kvm_x86_ops *kvm_x86_ops;
@@ -536,7 +536,7 @@ int kvm_mmu_setup(struct kvm_vcpu *vcpu);
536536
void kvm_mmu_set_nonpresent_ptes(u64 trap_pte, u64 notrap_pte);
537537
void kvm_mmu_set_base_ptes(u64 base_pte);
538538
void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
539-
u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 mt_mask);
539+
u64 dirty_mask, u64 nx_mask, u64 x_mask);
540540

541541
int kvm_mmu_reset_context(struct kvm_vcpu *vcpu);
542542
void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot);
@@ -550,6 +550,7 @@ int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
550550
const void *val, int bytes);
551551
int kvm_pv_mmu_op(struct kvm_vcpu *vcpu, unsigned long bytes,
552552
gpa_t addr, unsigned long *ret);
553+
u8 kvm_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn);
553554

554555
extern bool tdp_enabled;
555556

arch/x86/kvm/mmu.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ static u64 __read_mostly shadow_x_mask; /* mutual exclusive with nx_mask */
178178
static u64 __read_mostly shadow_user_mask;
179179
static u64 __read_mostly shadow_accessed_mask;
180180
static u64 __read_mostly shadow_dirty_mask;
181-
static u64 __read_mostly shadow_mt_mask;
182181

183182
static inline u64 rsvd_bits(int s, int e)
184183
{
@@ -199,14 +198,13 @@ void kvm_mmu_set_base_ptes(u64 base_pte)
199198
EXPORT_SYMBOL_GPL(kvm_mmu_set_base_ptes);
200199

201200
void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
202-
u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 mt_mask)
201+
u64 dirty_mask, u64 nx_mask, u64 x_mask)
203202
{
204203
shadow_user_mask = user_mask;
205204
shadow_accessed_mask = accessed_mask;
206205
shadow_dirty_mask = dirty_mask;
207206
shadow_nx_mask = nx_mask;
208207
shadow_x_mask = x_mask;
209-
shadow_mt_mask = mt_mask;
210208
}
211209
EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes);
212210

@@ -1608,7 +1606,7 @@ static int get_mtrr_type(struct mtrr_state_type *mtrr_state,
16081606
return mtrr_state->def_type;
16091607
}
16101608

1611-
static u8 get_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
1609+
u8 kvm_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
16121610
{
16131611
u8 mtrr;
16141612

@@ -1618,6 +1616,7 @@ static u8 get_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
16181616
mtrr = MTRR_TYPE_WRBACK;
16191617
return mtrr;
16201618
}
1619+
EXPORT_SYMBOL_GPL(kvm_get_guest_memory_type);
16211620

16221621
static int kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
16231622
{
@@ -1670,7 +1669,6 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
16701669
{
16711670
u64 spte;
16721671
int ret = 0;
1673-
u64 mt_mask = shadow_mt_mask;
16741672

16751673
/*
16761674
* We don't set the accessed bit, since we sometimes want to see
@@ -1690,16 +1688,9 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
16901688
spte |= shadow_user_mask;
16911689
if (largepage)
16921690
spte |= PT_PAGE_SIZE_MASK;
1693-
if (mt_mask) {
1694-
if (!kvm_is_mmio_pfn(pfn)) {
1695-
mt_mask = get_memory_type(vcpu, gfn) <<
1696-
kvm_x86_ops->get_mt_mask_shift();
1697-
mt_mask |= VMX_EPT_IGMT_BIT;
1698-
} else
1699-
mt_mask = MTRR_TYPE_UNCACHABLE <<
1700-
kvm_x86_ops->get_mt_mask_shift();
1701-
spte |= mt_mask;
1702-
}
1691+
if (tdp_enabled)
1692+
spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
1693+
kvm_is_mmio_pfn(pfn));
17031694

17041695
spte |= (u64)pfn << PAGE_SHIFT;
17051696

arch/x86/kvm/svm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,7 +2589,7 @@ static int get_npt_level(void)
25892589
#endif
25902590
}
25912591

2592-
static int svm_get_mt_mask_shift(void)
2592+
static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
25932593
{
25942594
return 0;
25952595
}
@@ -2652,7 +2652,7 @@ static struct kvm_x86_ops svm_x86_ops = {
26522652

26532653
.set_tss_addr = svm_set_tss_addr,
26542654
.get_tdp_level = get_npt_level,
2655-
.get_mt_mask_shift = svm_get_mt_mask_shift,
2655+
.get_mt_mask = svm_get_mt_mask,
26562656
};
26572657

26582658
static int __init svm_init(void)

arch/x86/kvm/vmx.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3577,9 +3577,17 @@ static int get_ept_level(void)
35773577
return VMX_EPT_DEFAULT_GAW + 1;
35783578
}
35793579

3580-
static int vmx_get_mt_mask_shift(void)
3580+
static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
35813581
{
3582-
return VMX_EPT_MT_EPTE_SHIFT;
3582+
u64 ret;
3583+
3584+
if (is_mmio)
3585+
ret = MTRR_TYPE_UNCACHABLE << VMX_EPT_MT_EPTE_SHIFT;
3586+
else
3587+
ret = (kvm_get_guest_memory_type(vcpu, gfn) <<
3588+
VMX_EPT_MT_EPTE_SHIFT) | VMX_EPT_IGMT_BIT;
3589+
3590+
return ret;
35833591
}
35843592

35853593
static struct kvm_x86_ops vmx_x86_ops = {
@@ -3639,7 +3647,7 @@ static struct kvm_x86_ops vmx_x86_ops = {
36393647

36403648
.set_tss_addr = vmx_set_tss_addr,
36413649
.get_tdp_level = get_ept_level,
3642-
.get_mt_mask_shift = vmx_get_mt_mask_shift,
3650+
.get_mt_mask = vmx_get_mt_mask,
36433651
};
36443652

36453653
static int __init vmx_init(void)
@@ -3698,8 +3706,7 @@ static int __init vmx_init(void)
36983706
kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK |
36993707
VMX_EPT_WRITABLE_MASK);
37003708
kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
3701-
VMX_EPT_EXECUTABLE_MASK,
3702-
VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT);
3709+
VMX_EPT_EXECUTABLE_MASK);
37033710
kvm_enable_tdp();
37043711
} else
37053712
kvm_disable_tdp();

arch/x86/kvm/x86.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2772,7 +2772,7 @@ int kvm_arch_init(void *opaque)
27722772
kvm_mmu_set_nonpresent_ptes(0ull, 0ull);
27732773
kvm_mmu_set_base_ptes(PT_PRESENT_MASK);
27742774
kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK,
2775-
PT_DIRTY_MASK, PT64_NX_MASK, 0, 0);
2775+
PT_DIRTY_MASK, PT64_NX_MASK, 0);
27762776

27772777
for_each_possible_cpu(cpu)
27782778
per_cpu(cpu_tsc_khz, cpu) = tsc_khz;

0 commit comments

Comments
 (0)