diff options
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/kvm_main.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 777fe533cfe7..48d5e697bf44 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -85,6 +85,8 @@ static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl, | |||
85 | 85 | ||
86 | static bool kvm_rebooting; | 86 | static bool kvm_rebooting; |
87 | 87 | ||
88 | static bool largepages_enabled = true; | ||
89 | |||
88 | #ifdef KVM_CAP_DEVICE_ASSIGNMENT | 90 | #ifdef KVM_CAP_DEVICE_ASSIGNMENT |
89 | static struct kvm_assigned_dev_kernel *kvm_find_assigned_dev(struct list_head *head, | 91 | static struct kvm_assigned_dev_kernel *kvm_find_assigned_dev(struct list_head *head, |
90 | int assigned_dev_id) | 92 | int assigned_dev_id) |
@@ -1174,9 +1176,11 @@ int __kvm_set_memory_region(struct kvm *kvm, | |||
1174 | ugfn = new.userspace_addr >> PAGE_SHIFT; | 1176 | ugfn = new.userspace_addr >> PAGE_SHIFT; |
1175 | /* | 1177 | /* |
1176 | * If the gfn and userspace address are not aligned wrt each | 1178 | * If the gfn and userspace address are not aligned wrt each |
1177 | * other, disable large page support for this slot | 1179 | * other, or if explicitly asked to, disable large page |
1180 | * support for this slot | ||
1178 | */ | 1181 | */ |
1179 | if ((base_gfn ^ ugfn) & (KVM_PAGES_PER_HPAGE - 1)) | 1182 | if ((base_gfn ^ ugfn) & (KVM_PAGES_PER_HPAGE - 1) || |
1183 | !largepages_enabled) | ||
1180 | for (i = 0; i < largepages; ++i) | 1184 | for (i = 0; i < largepages; ++i) |
1181 | new.lpage_info[i].write_count = 1; | 1185 | new.lpage_info[i].write_count = 1; |
1182 | } | 1186 | } |
@@ -1291,6 +1295,12 @@ out: | |||
1291 | return r; | 1295 | return r; |
1292 | } | 1296 | } |
1293 | 1297 | ||
1298 | void kvm_disable_largepages(void) | ||
1299 | { | ||
1300 | largepages_enabled = false; | ||
1301 | } | ||
1302 | EXPORT_SYMBOL_GPL(kvm_disable_largepages); | ||
1303 | |||
1294 | int is_error_page(struct page *page) | 1304 | int is_error_page(struct page *page) |
1295 | { | 1305 | { |
1296 | return page == bad_page; | 1306 | return page == bad_page; |