Skip to content

Commit bb5ffbd

Browse files
committed
Remove ram protection support.
It is not tested at all and android emulator does not require this special ioctl any more.
1 parent 6eefff9 commit bb5ffbd

3 files changed

Lines changed: 3 additions & 174 deletions

File tree

include/linux/kvm_host.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,6 @@ struct kvm_memory_slot {
228228
u32 flags;
229229
short id;
230230
struct pmem_lock *pmem_lock;
231-
/* A link back to KVM for rp_bitmap */
232-
struct kvm *kvm;
233231
};
234232

235233
#define ALIGN(x, mask) (((x) + (mask - 1)) & ~(mask - 1))
@@ -308,8 +306,6 @@ struct kvm {
308306
PEPROCESS process;
309307
u64 vm_id;
310308
struct kvm_memslots *memslots[GVM_ADDRESS_SPACE_NUM];
311-
size_t *rp_bitmap;
312-
u64 rp_bitmap_size;
313309
struct kvm_vcpu *vcpus[GVM_MAX_VCPUS];
314310

315311
/*
@@ -392,20 +388,6 @@ static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
392388
return NULL;
393389
}
394390

395-
static inline struct kvm_vcpu *kvm_get_vcpu_by_thread(struct kvm *kvm,
396-
PETHREAD thread)
397-
{
398-
struct kvm_vcpu *vcpu = NULL;
399-
int i;
400-
401-
if (!thread < 0)
402-
return NULL;
403-
kvm_for_each_vcpu(i, vcpu, kvm)
404-
if (vcpu->thread == thread)
405-
return vcpu;
406-
return NULL;
407-
}
408-
409391
#define kvm_for_each_memslot(memslot, slots) \
410392
for (memslot = &slots->memslots[0]; \
411393
memslot < slots->memslots + GVM_MEM_SLOTS_NUM && memslot->npages;\

include/uapi/linux/kvm.h

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ struct kvm_irqchip {
8787
#define GVM_EXIT_EPR 23
8888
#define GVM_EXIT_SYSTEM_EVENT 24
8989
#define GVM_EXIT_IOAPIC_EOI 26
90-
#define GVM_EXIT_RAM_PROT 27
9190

9291
/* For GVM_EXIT_INTERNAL_ERROR */
9392
/* Emulate instruction failed. */
@@ -196,10 +195,6 @@ struct kvm_run {
196195
struct {
197196
__u8 vector;
198197
} eoi;
199-
/* GVM_EXIT_RAM_PROT */
200-
struct {
201-
__u64 gfn;
202-
} rp;
203198
/* Fix the size of the union. */
204199
char padding[256];
205200
};
@@ -470,15 +465,6 @@ struct kvm_msi {
470465
__u8 pad[12];
471466
};
472467

473-
#define RP_NOACCESS 0
474-
#define RP_RDWREX 7
475-
struct gvm_ram_protect {
476-
__u64 pa;
477-
__u64 size;
478-
__u32 flags;
479-
__u32 reserved;
480-
};
481-
482468
/*
483469
* ioctls for VM fds
484470
*/
@@ -498,7 +484,6 @@ struct gvm_ram_protect {
498484
#define GVM_SET_TSS_ADDR _IO(KVMIO, 0x47)
499485
#define GVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64)
500486
#define GVM_KICK_VCPU _IO(KVMIO, 0x49)
501-
#define GVM_RAM_PROTECT _IOW(KVMIO, 0x50, struct gvm_ram_protect)
502487

503488
/* Device model IOC */
504489
#define GVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)

virt/kvm/kvm_main.c

Lines changed: 3 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ static int kvm_init_mmu_notifier(struct kvm *kvm)
522522

523523
#endif /* CONFIG_MMU_NOTIFIER && GVM_ARCH_WANT_MMU_NOTIFIER */
524524

525-
static struct kvm_memslots *kvm_alloc_memslots(struct kvm *kvm)
525+
static struct kvm_memslots *kvm_alloc_memslots(void)
526526
{
527527
int i;
528528
struct kvm_memslots *slots;
@@ -536,10 +536,8 @@ static struct kvm_memslots *kvm_alloc_memslots(struct kvm *kvm)
536536
* code of handling generation number wrap-around.
537537
*/
538538
slots->generation = -150;
539-
for (i = 0; i < GVM_MEM_SLOTS_NUM; i++) {
539+
for (i = 0; i < GVM_MEM_SLOTS_NUM; i++)
540540
slots->id_to_index[i] = slots->memslots[i].id = i;
541-
slots->memslots[i].kvm = kvm;
542-
}
543541

544542
return slots;
545543
}
@@ -624,7 +622,7 @@ static struct kvm *kvm_create_vm(size_t type)
624622

625623
r = -ENOMEM;
626624
for (i = 0; i < GVM_ADDRESS_SPACE_NUM; i++) {
627-
kvm->memslots[i] = kvm_alloc_memslots(kvm);
625+
kvm->memslots[i] = kvm_alloc_memslots();
628626
if (!kvm->memslots[i])
629627
goto out_err_no_srcu;
630628
}
@@ -691,7 +689,6 @@ static void kvm_destroy_vm(struct kvm *kvm)
691689
kvm_arch_destroy_vm(kvm);
692690
for (i = 0; i < GVM_ADDRESS_SPACE_NUM; i++)
693691
kvm_free_memslots(kvm, kvm->memslots[i]);
694-
kfree(kvm->rp_bitmap);
695692
cleanup_srcu_struct(&kvm->irq_srcu);
696693
cleanup_srcu_struct(&kvm->srcu);
697694
kvm_arch_free_vm(kvm);
@@ -1299,25 +1296,6 @@ static int gvm_pin_user_memory(size_t addr, struct pmem_lock *pmem_lock)
12991296
return 0;
13001297
}
13011298

1302-
static int kvm_is_ram_prot(struct kvm* kvm, gfn_t gfn);
1303-
static int kvm_should_ram_prot_exit(struct kvm *kvm, gfn_t gfn)
1304-
{
1305-
struct kvm_vcpu* vcpu;
1306-
1307-
if (!kvm_is_ram_prot(kvm, gfn))
1308-
return 0;
1309-
1310-
/*
1311-
* We assume get user pages always run
1312-
* in the vcpu thread requesting that
1313-
* page.
1314-
*/
1315-
vcpu = kvm_get_vcpu_by_thread(kvm, PsGetCurrentThread());
1316-
vcpu->run->exit_reason = GVM_EXIT_RAM_PROT;
1317-
vcpu->run->rp.gfn = gfn;
1318-
return 1;
1319-
}
1320-
13211299
kvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn,
13221300
bool atomic, bool *async, bool write_fault,
13231301
bool *writable)
@@ -1346,9 +1324,6 @@ kvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn,
13461324
writable = NULL;
13471325
}
13481326

1349-
if (kvm_should_ram_prot_exit(slot->kvm, gfn))
1350-
return 0;
1351-
13521327
pmem_lock = &slot->pmem_lock[gfn - slot->base_gfn];
13531328
spin_lock(&pmem_lock->lock);
13541329
if (!pmem_lock->lock_mdl) {
@@ -1416,9 +1391,6 @@ int gfn_to_pfn_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn,
14161391
return 0;
14171392

14181393
for (i = 0; i < nr_pages; i++) {
1419-
if (kvm_should_ram_prot_exit(slot->kvm, gfn + i))
1420-
return 0;
1421-
14221394
pmem_lock = &slot->pmem_lock[gfn + i - slot->base_gfn];
14231395
spin_lock(&pmem_lock->lock);
14241396
if (!pmem_lock->lock_mdl) {
@@ -1936,109 +1908,6 @@ static int kvm_vm_ioctl_kick_vcpu(PDEVICE_OBJECT pDevObj, PIRP pIrp, void *arg)
19361908
return 0;
19371909
}
19381910

1939-
static bool kvm_is_valid_prot_flags(u32 flags)
1940-
{
1941-
return (flags == RP_NOACCESS || flags == RP_RDWREX);
1942-
}
1943-
1944-
static int kvm_adjust_rp_bitmap(struct kvm *kvm, u64 size)
1945-
{
1946-
int old_size, new_size;
1947-
size_t *old_bitmap, *new_bitmap;
1948-
1949-
if (kvm->rp_bitmap_size >= size)
1950-
return 0;
1951-
1952-
new_size = ALIGN(size, (u64)BITS_PER_LONG) / 8;
1953-
new_bitmap = kvm_kvzalloc(new_size);
1954-
if (!new_bitmap)
1955-
return -ENOMEM;
1956-
1957-
old_size = kvm->rp_bitmap_size;
1958-
old_bitmap = kvm->rp_bitmap;
1959-
1960-
memcpy(new_bitmap, old_bitmap, old_size);
1961-
1962-
kvm->rp_bitmap = new_bitmap;
1963-
kvm->rp_bitmap_size = new_size;
1964-
1965-
return 0;
1966-
}
1967-
1968-
/*
1969-
* For set bulk bitmap instead of looping set_bit
1970-
*/
1971-
static inline void set_bits_in_long(size_t *byte, int start, int nbits, bool set)
1972-
{
1973-
size_t mask;
1974-
1975-
BUG_ON(byte == NULL);
1976-
BUG_ON(start < 0 || start > BITS_PER_LONG);
1977-
BUG_ON(nbits < 0 || start + nbits > BITS_PER_LONG);
1978-
1979-
mask = ((1 << nbits) - 1) << start;
1980-
if (set)
1981-
*byte |= mask;
1982-
else
1983-
*byte &= ~mask;
1984-
}
1985-
1986-
static void set_bit_block(size_t *bitmap, u64 start, u64 nbits, bool set)
1987-
{
1988-
u64 first_long_index = start / BITS_PER_LONG;
1989-
u64 last_long_index = (start + nbits - 1) / BITS_PER_LONG;
1990-
u64 i;
1991-
int first_bit_index = (int)(start % BITS_PER_LONG);
1992-
int last_bit_index = (int)((start + nbits - 1) % BITS_PER_LONG);
1993-
1994-
if (first_long_index == last_long_index) {
1995-
set_bits_in_long(&bitmap[first_long_index], first_bit_index, (int)nbits,
1996-
set);
1997-
return;
1998-
}
1999-
2000-
set_bits_in_long(&bitmap[first_long_index], first_bit_index,
2001-
BITS_PER_LONG - first_bit_index, set);
2002-
for (i = first_long_index + 1; i < last_long_index; i++) {
2003-
bitmap[i] = set ? (size_t)-1 : 0;
2004-
}
2005-
set_bits_in_long(&bitmap[last_long_index], 0, last_bit_index + 1, set);
2006-
}
2007-
2008-
static int kvm_is_ram_prot(struct kvm *kvm, gfn_t gfn)
2009-
{
2010-
if (!kvm->rp_bitmap)
2011-
return 0;
2012-
2013-
return test_bit(gfn, kvm->rp_bitmap);
2014-
}
2015-
2016-
static int kvm_vm_ioctl_ram_prot(struct kvm *kvm, struct gvm_ram_protect *rp)
2017-
{
2018-
int r = -EFAULT;
2019-
gfn_t first_gfn = rp->pa >> PAGE_SHIFT;
2020-
gfn_t last_gfn = (rp->pa + rp->size - 1) >> PAGE_SHIFT;
2021-
2022-
if (!rp->reserved)
2023-
return -EINVAL;
2024-
2025-
if (!kvm_is_valid_prot_flags(rp->flags))
2026-
return -EINVAL;
2027-
2028-
r = kvm_adjust_rp_bitmap(kvm, last_gfn + 1);
2029-
if (r)
2030-
return r;
2031-
2032-
set_bit_block(kvm->rp_bitmap, first_gfn, last_gfn + 1 - first_gfn,
2033-
rp->flags == RP_NOACCESS);
2034-
2035-
/* only need flush shadow when page access right is lowered */
2036-
if (rp->flags == RP_NOACCESS)
2037-
kvm_arch_flush_shadow_all(kvm);
2038-
2039-
return 0;
2040-
}
2041-
20421911
NTSTATUS kvm_vcpu_ioctl(PDEVICE_OBJECT pDevObj, PIRP pIrp,
20431912
unsigned int ioctl)
20441913
{
@@ -2269,13 +2138,6 @@ NTSTATUS kvm_vm_ioctl(PDEVICE_OBJECT pDevObj, PIRP pIrp,
22692138
case GVM_KICK_VCPU:
22702139
r = kvm_vm_ioctl_kick_vcpu(pDevObj, pIrp, argp);
22712140
break;
2272-
case GVM_RAM_PROTECT:
2273-
struct gvm_ram_protect rp;
2274-
2275-
r = -EFAULT;
2276-
RtlCopyBytes(&rp, pIrp->AssociatedIrp.SystemBuffer, sizeof(rp));
2277-
r = kvm_vm_ioctl_ram_prot(kvm, &rp);
2278-
break;
22792141
#ifdef CONFIG_HAVE_GVM_MSI
22802142
case GVM_SIGNAL_MSI: {
22812143
struct kvm_msi msi;

0 commit comments

Comments
 (0)