KVM: Fix overlapping check for memory slots
When checking for overlapping slots on registration of a new one, kvm currently also considers zero-length (ie. deleted) slots and rejects requests incorrectly. This finally denies user space from joining slots. Fix the check by skipping deleted slots and advertise this via a KVM_CAP_JOIN_MEMORY_REGIONS_WORKS. Cc: stable@kernel.org Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
bf47a760f6
commit
4cd481f68d
2 changed files with 4 additions and 1 deletions
|
@ -409,6 +409,8 @@ struct kvm_trace_rec {
|
||||||
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
|
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
|
||||||
#define KVM_CAP_DEVICE_DEASSIGNMENT 27
|
#define KVM_CAP_DEVICE_DEASSIGNMENT 27
|
||||||
#endif
|
#endif
|
||||||
|
/* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */
|
||||||
|
#define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
|
||||||
|
|
||||||
#ifdef KVM_CAP_IRQ_ROUTING
|
#ifdef KVM_CAP_IRQ_ROUTING
|
||||||
|
|
||||||
|
|
|
@ -961,7 +961,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
|
||||||
for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
|
for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
|
||||||
struct kvm_memory_slot *s = &kvm->memslots[i];
|
struct kvm_memory_slot *s = &kvm->memslots[i];
|
||||||
|
|
||||||
if (s == memslot)
|
if (s == memslot || !s->npages)
|
||||||
continue;
|
continue;
|
||||||
if (!((base_gfn + npages <= s->base_gfn) ||
|
if (!((base_gfn + npages <= s->base_gfn) ||
|
||||||
(base_gfn >= s->base_gfn + s->npages)))
|
(base_gfn >= s->base_gfn + s->npages)))
|
||||||
|
@ -1983,6 +1983,7 @@ static long kvm_dev_ioctl_check_extension_generic(long arg)
|
||||||
switch (arg) {
|
switch (arg) {
|
||||||
case KVM_CAP_USER_MEMORY:
|
case KVM_CAP_USER_MEMORY:
|
||||||
case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
|
case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
|
||||||
|
case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS:
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef CONFIG_HAVE_KVM_IRQCHIP
|
#ifdef CONFIG_HAVE_KVM_IRQCHIP
|
||||||
case KVM_CAP_IRQ_ROUTING:
|
case KVM_CAP_IRQ_ROUTING:
|
||||||
|
|
Loading…
Reference in a new issue