* RFC/patch portability: split kvm_vm_ioctl
@ 2007-10-12 12:34 Carsten Otte
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-12 12:34 UTC (permalink / raw)
To: Avi Kivity; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
This patch splits kvm_vm_ioctl into archtecture independent parts, and
x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
Common ioctls for all architectures are:
KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG
I'd really like to see more commonalities, but all others did not fit
our needs. I would love to keep KVM_GET_DIRTY_LOG common, so that the
ingenious migration code does not need to care too much about different
architectures.
x86 specific ioctls are:
KVM_SET_MEMORY_REGION, KVM_SET_USER_MEMORY_REGION,
KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
While the pic/apic related functions are obviously x86 specific, some
other ioctls seem to be common at a first glance.
KVM_SET_(USER)_MEMORY_REGION for example. We've got a total different
address layout on s390: we cannot support multiple slots, and a user
memory range always equals the guest physical memory [guest_phys + vm
specific offset = host user address]. We don't have nor need dedicated
vmas for the guest memory, we just use what the memory managment has in
stock. This is true, because we reuse the page table for user and guest
mode.
Looks to me like the s390 might have a lot in common with a future AMD
nested page table implementation. If AMD choose to reuse the page table
too, we might share the same ioctl to set up guest addressing with them.
signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
reviewed-by: Christian Borntraeger <borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
reviewed-by: Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
---
Index: kvm/drivers/kvm/kvm.h
===================================================================
--- kvm.orig/drivers/kvm/kvm.h 2007-10-12 13:38:59.000000000 +0200
+++ kvm/drivers/kvm/kvm.h 2007-10-12 14:22:40.000000000 +0200
@@ -661,6 +661,9 @@
unsigned int ioctl, unsigned long arg);
long kvm_arch_vcpu_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg);
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg);
+void kvm_arch_destroy_vm(struct kvm *kvm);
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
Index: kvm/drivers/kvm/kvm_main.c
===================================================================
--- kvm.orig/drivers/kvm/kvm_main.c 2007-10-12 13:38:59.000000000 +0200
+++ kvm/drivers/kvm/kvm_main.c 2007-10-12 13:57:30.000000000 +0200
@@ -40,7 +40,6 @@
#include <linux/anon_inodes.h>
#include <linux/profile.h>
#include <linux/kvm_para.h>
-#include <linux/pagemap.h>
#include <asm/processor.h>
#include <asm/msr.h>
@@ -319,61 +318,6 @@
return kvm;
}
-static void kvm_free_userspace_physmem(struct kvm_memory_slot *free)
-{
- int i;
-
- for (i = 0; i < free->npages; ++i) {
- if (free->phys_mem[i]) {
- if (!PageReserved(free->phys_mem[i]))
- SetPageDirty(free->phys_mem[i]);
- page_cache_release(free->phys_mem[i]);
- }
- }
-}
-
-static void kvm_free_kernel_physmem(struct kvm_memory_slot *free)
-{
- int i;
-
- for (i = 0; i < free->npages; ++i)
- if (free->phys_mem[i])
- __free_page(free->phys_mem[i]);
-}
-
-/*
- * Free any memory in @free but not in @dont.
- */
-static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
- struct kvm_memory_slot *dont)
-{
- if (!dont || free->phys_mem != dont->phys_mem)
- if (free->phys_mem) {
- if (free->user_alloc)
- kvm_free_userspace_physmem(free);
- else
- kvm_free_kernel_physmem(free);
- vfree(free->phys_mem);
- }
- if (!dont || free->rmap != dont->rmap)
- vfree(free->rmap);
-
- if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
- vfree(free->dirty_bitmap);
-
- free->phys_mem = NULL;
- free->npages = 0;
- free->dirty_bitmap = NULL;
-}
-
-static void kvm_free_physmem(struct kvm *kvm)
-{
- int i;
-
- for (i = 0; i < kvm->nmemslots; ++i)
- kvm_free_physmem_slot(&kvm->memslots[i], NULL);
-}
-
static void free_pio_guest_pages(struct kvm_vcpu *vcpu)
{
int i;
@@ -421,7 +365,7 @@
kfree(kvm->vpic);
kfree(kvm->vioapic);
kvm_free_vcpus(kvm);
- kvm_free_physmem(kvm);
+ kvm_arch_destroy_vm(kvm);
kfree(kvm);
}
@@ -686,183 +630,6 @@
EXPORT_SYMBOL_GPL(fx_init);
/*
- * Allocate some memory and give it an address in the guest physical address
- * space.
- *
- * Discontiguous memory is allowed, mostly for framebuffers.
- */
-static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
- struct
- kvm_userspace_memory_region *mem,
- int user_alloc)
-{
- int r;
- gfn_t base_gfn;
- unsigned long npages;
- unsigned long i;
- struct kvm_memory_slot *memslot;
- struct kvm_memory_slot old, new;
-
- r = -EINVAL;
- /* General sanity checks */
- if (mem->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (mem->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (mem->slot >= KVM_MEMORY_SLOTS)
- goto out;
- if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
- goto out;
-
- memslot = &kvm->memslots[mem->slot];
- base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
- npages = mem->memory_size >> PAGE_SHIFT;
-
- if (!npages)
- mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
-
- mutex_lock(&kvm->lock);
-
- new = old = *memslot;
-
- new.base_gfn = base_gfn;
- new.npages = npages;
- new.flags = mem->flags;
-
- /* Disallow changing a memory slot's size. */
- r = -EINVAL;
- if (npages && old.npages && npages != old.npages)
- goto out_unlock;
-
- /* Check for overlaps */
- r = -EEXIST;
- for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
- struct kvm_memory_slot *s = &kvm->memslots[i];
-
- if (s == memslot)
- continue;
- if (!((base_gfn + npages <= s->base_gfn) ||
- (base_gfn >= s->base_gfn + s->npages)))
- goto out_unlock;
- }
-
- /* Deallocate if slot is being removed */
- if (!npages)
- new.phys_mem = NULL;
-
- /* Free page dirty bitmap if unneeded */
- if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
- new.dirty_bitmap = NULL;
-
- r = -ENOMEM;
-
- /* Allocate if a slot is being created */
- if (npages && !new.phys_mem) {
- new.phys_mem = vmalloc(npages * sizeof(struct page *));
-
- if (!new.phys_mem)
- goto out_unlock;
-
- new.rmap = vmalloc(npages * sizeof(struct page *));
-
- if (!new.rmap)
- goto out_unlock;
-
- memset(new.phys_mem, 0, npages * sizeof(struct page *));
- memset(new.rmap, 0, npages * sizeof(*new.rmap));
- if (user_alloc) {
- unsigned long pages_num;
-
- new.user_alloc = 1;
- down_read(¤t->mm->mmap_sem);
-
- pages_num = get_user_pages(current, current->mm,
- mem->userspace_addr,
- npages, 1, 0, new.phys_mem,
- NULL);
-
- up_read(¤t->mm->mmap_sem);
- if (pages_num != npages)
- goto out_unlock;
- } else {
- for (i = 0; i < npages; ++i) {
- new.phys_mem[i] = alloc_page(GFP_HIGHUSER
- | __GFP_ZERO);
- if (!new.phys_mem[i])
- goto out_unlock;
- }
- }
- }
-
- /* Allocate page dirty bitmap if needed */
- if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
- unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;
-
- new.dirty_bitmap = vmalloc(dirty_bytes);
- if (!new.dirty_bitmap)
- goto out_unlock;
- memset(new.dirty_bitmap, 0, dirty_bytes);
- }
-
- if (mem->slot >= kvm->nmemslots)
- kvm->nmemslots = mem->slot + 1;
-
- if (!kvm->n_requested_mmu_pages) {
- unsigned int n_pages;
-
- if (npages) {
- n_pages = npages * KVM_PERMILLE_MMU_PAGES / 1000;
- kvm_mmu_change_mmu_pages(kvm, kvm->n_alloc_mmu_pages +
- n_pages);
- } else {
- unsigned int nr_mmu_pages;
-
- n_pages = old.npages * KVM_PERMILLE_MMU_PAGES / 1000;
- nr_mmu_pages = kvm->n_alloc_mmu_pages - n_pages;
- nr_mmu_pages = max(nr_mmu_pages,
- (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);
- kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
- }
- }
-
- *memslot = new;
-
- kvm_mmu_slot_remove_write_access(kvm, mem->slot);
- kvm_flush_remote_tlbs(kvm);
-
- mutex_unlock(&kvm->lock);
-
- kvm_free_physmem_slot(&old, &new);
- return 0;
-
-out_unlock:
- mutex_unlock(&kvm->lock);
- kvm_free_physmem_slot(&new, &old);
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
- u32 kvm_nr_mmu_pages)
-{
- if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
- return -EINVAL;
-
- mutex_lock(&kvm->lock);
-
- kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
- kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
-
- mutex_unlock(&kvm->lock);
- return 0;
-}
-
-static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
-{
- return kvm->n_alloc_mmu_pages;
-}
-
-/*
* Get (and clear) the dirty memory log for a memory slot.
*/
static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
@@ -907,111 +674,6 @@
return r;
}
-/*
- * Set a new alias region. Aliases map a portion of physical memory into
- * another portion. This is useful for memory windows, for example the PC
- * VGA region.
- */
-static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
- struct kvm_memory_alias *alias)
-{
- int r, n;
- struct kvm_mem_alias *p;
-
- r = -EINVAL;
- /* General sanity checks */
- if (alias->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (alias->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (alias->slot >= KVM_ALIAS_SLOTS)
- goto out;
- if (alias->guest_phys_addr + alias->memory_size
- < alias->guest_phys_addr)
- goto out;
- if (alias->target_phys_addr + alias->memory_size
- < alias->target_phys_addr)
- goto out;
-
- mutex_lock(&kvm->lock);
-
- p = &kvm->aliases[alias->slot];
- p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
- p->npages = alias->memory_size >> PAGE_SHIFT;
- p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
-
- for (n = KVM_ALIAS_SLOTS; n > 0; --n)
- if (kvm->aliases[n - 1].npages)
- break;
- kvm->naliases = n;
-
- kvm_mmu_zap_all(kvm);
-
- mutex_unlock(&kvm->lock);
-
- return 0;
-
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[0],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[1],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(&chip->chip.ioapic,
- ioapic_irqchip(kvm),
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- return r;
-}
-
-static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&pic_irqchip(kvm)->pics[0],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&pic_irqchip(kvm)->pics[1],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(ioapic_irqchip(kvm),
- &chip->chip.ioapic,
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- kvm_pic_update_irq(pic_irqchip(kvm));
- return r;
-}
-
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
{
int i;
@@ -2923,7 +2585,7 @@
{
struct kvm *kvm = filp->private_data;
void __user *argp = (void __user *)arg;
- int r = -EINVAL;
+ int r;
switch (ioctl) {
case KVM_CREATE_VCPU:
@@ -2931,43 +2593,6 @@
if (r < 0)
goto out;
break;
- case KVM_SET_MEMORY_REGION: {
- struct kvm_memory_region kvm_mem;
- struct kvm_userspace_memory_region kvm_userspace_mem;
-
- r = -EFAULT;
- if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
- goto out;
- kvm_userspace_mem.slot = kvm_mem.slot;
- kvm_userspace_mem.flags = kvm_mem.flags;
- kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
- kvm_userspace_mem.memory_size = kvm_mem.memory_size;
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
- if (r)
- goto out;
- break;
- }
- case KVM_SET_USER_MEMORY_REGION: {
- struct kvm_userspace_memory_region kvm_userspace_mem;
-
- r = -EFAULT;
- if (copy_from_user(&kvm_userspace_mem, argp,
- sizeof kvm_userspace_mem))
- goto out;
-
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
- if (r)
- goto out;
- break;
- }
- case KVM_SET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
- if (r)
- goto out;
- break;
- case KVM_GET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
- break;
case KVM_GET_DIRTY_LOG: {
struct kvm_dirty_log log;
@@ -2979,87 +2604,8 @@
goto out;
break;
}
- case KVM_SET_MEMORY_ALIAS: {
- struct kvm_memory_alias alias;
-
- r = -EFAULT;
- if (copy_from_user(&alias, argp, sizeof alias))
- goto out;
- r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
- if (r)
- goto out;
- break;
- }
- case KVM_CREATE_IRQCHIP:
- r = -ENOMEM;
- kvm->vpic = kvm_create_pic(kvm);
- if (kvm->vpic) {
- r = kvm_ioapic_init(kvm);
- if (r) {
- kfree(kvm->vpic);
- kvm->vpic = NULL;
- goto out;
- }
- } else
- goto out;
- break;
- case KVM_IRQ_LINE: {
- struct kvm_irq_level irq_event;
-
- r = -EFAULT;
- if (copy_from_user(&irq_event, argp, sizeof irq_event))
- goto out;
- if (irqchip_in_kernel(kvm)) {
- mutex_lock(&kvm->lock);
- if (irq_event.irq < 16)
- kvm_pic_set_irq(pic_irqchip(kvm),
- irq_event.irq,
- irq_event.level);
- kvm_ioapic_set_irq(kvm->vioapic,
- irq_event.irq,
- irq_event.level);
- mutex_unlock(&kvm->lock);
- r = 0;
- }
- break;
- }
- case KVM_GET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = -EFAULT;
- if (copy_to_user(argp, &chip, sizeof chip))
- goto out;
- r = 0;
- break;
- }
- case KVM_SET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = 0;
- break;
- }
default:
- ;
+ return kvm_arch_vm_ioctl(filp, ioctl, arg);
}
out:
return r;
Index: kvm/drivers/kvm/x86.c
===================================================================
--- kvm.orig/drivers/kvm/x86.c 2007-10-12 13:38:59.000000000 +0200
+++ kvm/drivers/kvm/x86.c 2007-10-12 13:57:28.000000000 +0200
@@ -21,6 +21,7 @@
#include <linux/kvm.h>
#include <linux/fs.h>
#include <linux/vmalloc.h>
+#include <linux/pagemap.h>
#include <asm/uaccess.h>
@@ -300,6 +301,477 @@
return r;
}
+static void kvm_free_userspace_physmem(struct kvm_memory_slot *free)
+{
+ int i;
+
+ for (i = 0; i < free->npages; ++i) {
+ if (free->phys_mem[i]) {
+ if (!PageReserved(free->phys_mem[i]))
+ SetPageDirty(free->phys_mem[i]);
+ page_cache_release(free->phys_mem[i]);
+ }
+ }
+}
+
+static void kvm_free_kernel_physmem(struct kvm_memory_slot *free)
+{
+ int i;
+
+ for (i = 0; i < free->npages; ++i)
+ if (free->phys_mem[i])
+ __free_page(free->phys_mem[i]);
+}
+
+/*
+ * Free any memory in @free but not in @dont.
+ */
+static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
+ struct kvm_memory_slot *dont)
+{
+ if (!dont || free->phys_mem != dont->phys_mem)
+ if (free->phys_mem) {
+ if (free->user_alloc)
+ kvm_free_userspace_physmem(free);
+ else
+ kvm_free_kernel_physmem(free);
+ vfree(free->phys_mem);
+ }
+ if (!dont || free->rmap != dont->rmap)
+ vfree(free->rmap);
+
+ if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
+ vfree(free->dirty_bitmap);
+
+ free->phys_mem = NULL;
+ free->npages = 0;
+ free->dirty_bitmap = NULL;
+}
+
+static void kvm_free_physmem(struct kvm *kvm)
+{
+ int i;
+
+ for (i = 0; i < kvm->nmemslots; ++i)
+ kvm_free_physmem_slot(&kvm->memslots[i], NULL);
+}
+
+/*
+ * Allocate some memory and give it an address in the guest physical address
+ * space.
+ *
+ * Discontiguous memory is allowed, mostly for framebuffers.
+ */
+static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
+ struct
+ kvm_userspace_memory_region *mem,
+ int user_alloc)
+{
+ int r;
+ gfn_t base_gfn;
+ unsigned long npages;
+ unsigned long i;
+ struct kvm_memory_slot *memslot;
+ struct kvm_memory_slot old, new;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (mem->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (mem->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (mem->slot >= KVM_MEMORY_SLOTS)
+ goto out;
+ if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
+ goto out;
+
+ memslot = &kvm->memslots[mem->slot];
+ base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
+ npages = mem->memory_size >> PAGE_SHIFT;
+
+ if (!npages)
+ mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
+
+ mutex_lock(&kvm->lock);
+
+ new = old = *memslot;
+
+ new.base_gfn = base_gfn;
+ new.npages = npages;
+ new.flags = mem->flags;
+
+ /* Disallow changing a memory slot's size. */
+ r = -EINVAL;
+ if (npages && old.npages && npages != old.npages)
+ goto out_unlock;
+
+ /* Check for overlaps */
+ r = -EEXIST;
+ for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
+ struct kvm_memory_slot *s = &kvm->memslots[i];
+
+ if (s == memslot)
+ continue;
+ if (!((base_gfn + npages <= s->base_gfn) ||
+ (base_gfn >= s->base_gfn + s->npages)))
+ goto out_unlock;
+ }
+
+ /* Deallocate if slot is being removed */
+ if (!npages)
+ new.phys_mem = NULL;
+
+ /* Free page dirty bitmap if unneeded */
+ if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
+ new.dirty_bitmap = NULL;
+
+ r = -ENOMEM;
+
+ /* Allocate if a slot is being created */
+ if (npages && !new.phys_mem) {
+ new.phys_mem = vmalloc(npages * sizeof(struct page *));
+
+ if (!new.phys_mem)
+ goto out_unlock;
+
+ new.rmap = vmalloc(npages * sizeof(struct page *));
+
+ if (!new.rmap)
+ goto out_unlock;
+
+ memset(new.phys_mem, 0, npages * sizeof(struct page *));
+ memset(new.rmap, 0, npages * sizeof(*new.rmap));
+ if (user_alloc) {
+ unsigned long pages_num;
+
+ new.user_alloc = 1;
+ down_read(¤t->mm->mmap_sem);
+
+ pages_num = get_user_pages(current, current->mm,
+ mem->userspace_addr,
+ npages, 1, 0, new.phys_mem,
+ NULL);
+
+ up_read(¤t->mm->mmap_sem);
+ if (pages_num != npages)
+ goto out_unlock;
+ } else {
+ for (i = 0; i < npages; ++i) {
+ new.phys_mem[i] = alloc_page(GFP_HIGHUSER
+ | __GFP_ZERO);
+ if (!new.phys_mem[i])
+ goto out_unlock;
+ }
+ }
+ }
+
+ /* Allocate page dirty bitmap if needed */
+ if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
+ unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;
+
+ new.dirty_bitmap = vmalloc(dirty_bytes);
+ if (!new.dirty_bitmap)
+ goto out_unlock;
+ memset(new.dirty_bitmap, 0, dirty_bytes);
+ }
+
+ if (mem->slot >= kvm->nmemslots)
+ kvm->nmemslots = mem->slot + 1;
+
+ if (!kvm->n_requested_mmu_pages) {
+ unsigned int n_pages;
+
+ if (npages) {
+ n_pages = npages * KVM_PERMILLE_MMU_PAGES / 1000;
+ kvm_mmu_change_mmu_pages(kvm, kvm->n_alloc_mmu_pages +
+ n_pages);
+ } else {
+ unsigned int nr_mmu_pages;
+
+ n_pages = old.npages * KVM_PERMILLE_MMU_PAGES / 1000;
+ nr_mmu_pages = kvm->n_alloc_mmu_pages - n_pages;
+ nr_mmu_pages = max(nr_mmu_pages,
+ (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);
+ kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
+ }
+ }
+
+ *memslot = new;
+
+ kvm_mmu_slot_remove_write_access(kvm, mem->slot);
+ kvm_flush_remote_tlbs(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ kvm_free_physmem_slot(&old, &new);
+ return 0;
+
+out_unlock:
+ mutex_unlock(&kvm->lock);
+ kvm_free_physmem_slot(&new, &old);
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
+ u32 kvm_nr_mmu_pages)
+{
+ if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
+ return -EINVAL;
+
+ mutex_lock(&kvm->lock);
+
+ kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
+ kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
+
+ mutex_unlock(&kvm->lock);
+ return 0;
+}
+
+static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
+{
+ return kvm->n_alloc_mmu_pages;
+}
+
+/*
+ * Set a new alias region. Aliases map a portion of physical memory into
+ * another portion. This is useful for memory windows, for example the PC
+ * VGA region.
+ */
+static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
+ struct kvm_memory_alias *alias)
+{
+ int r, n;
+ struct kvm_mem_alias *p;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (alias->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->slot >= KVM_ALIAS_SLOTS)
+ goto out;
+ if (alias->guest_phys_addr + alias->memory_size
+ < alias->guest_phys_addr)
+ goto out;
+ if (alias->target_phys_addr + alias->memory_size
+ < alias->target_phys_addr)
+ goto out;
+
+ mutex_lock(&kvm->lock);
+
+ p = &kvm->aliases[alias->slot];
+ p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
+ p->npages = alias->memory_size >> PAGE_SHIFT;
+ p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
+
+ for (n = KVM_ALIAS_SLOTS; n > 0; --n)
+ if (kvm->aliases[n - 1].npages)
+ break;
+ kvm->naliases = n;
+
+ kvm_mmu_zap_all(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ return 0;
+
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[0],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[1],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(&chip->chip.ioapic,
+ ioapic_irqchip(kvm),
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ return r;
+}
+
+static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&pic_irqchip(kvm)->pics[0],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&pic_irqchip(kvm)->pics[1],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(ioapic_irqchip(kvm),
+ &chip->chip.ioapic,
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ kvm_pic_update_irq(pic_irqchip(kvm));
+ return r;
+}
+
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg)
+{
+ struct kvm *kvm = filp->private_data;
+ void __user *argp = (void __user *)arg;
+ int r = -EINVAL;
+
+ switch(ioctl) {
+ case KVM_SET_MEMORY_REGION: {
+ struct kvm_memory_region kvm_mem;
+ struct kvm_userspace_memory_region kvm_userspace_mem;
+
+ r = -EFAULT;
+ if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
+ goto out;
+ kvm_userspace_mem.slot = kvm_mem.slot;
+ kvm_userspace_mem.flags = kvm_mem.flags;
+ kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
+ kvm_userspace_mem.memory_size = kvm_mem.memory_size;
+ r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_SET_USER_MEMORY_REGION: {
+ struct kvm_userspace_memory_region kvm_userspace_mem;
+
+ r = -EFAULT;
+ if (copy_from_user(&kvm_userspace_mem, argp,
+ sizeof kvm_userspace_mem))
+ goto out;
+
+ r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_SET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
+ if (r)
+ goto out;
+ break;
+ case KVM_GET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
+ break;
+ case KVM_SET_MEMORY_ALIAS: {
+ struct kvm_memory_alias alias;
+
+ r = -EFAULT;
+ if (copy_from_user(&alias, argp, sizeof alias))
+ goto out;
+ r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_CREATE_IRQCHIP:
+ r = -ENOMEM;
+ kvm->vpic = kvm_create_pic(kvm);
+ if (kvm->vpic) {
+ r = kvm_ioapic_init(kvm);
+ if (r) {
+ kfree(kvm->vpic);
+ kvm->vpic = NULL;
+ goto out;
+ }
+ } else
+ goto out;
+ break;
+ case KVM_IRQ_LINE: {
+ struct kvm_irq_level irq_event;
+
+ r = -EFAULT;
+ if (copy_from_user(&irq_event, argp, sizeof irq_event))
+ goto out;
+ if (irqchip_in_kernel(kvm)) {
+ mutex_lock(&kvm->lock);
+ if (irq_event.irq < 16)
+ kvm_pic_set_irq(pic_irqchip(kvm),
+ irq_event.irq,
+ irq_event.level);
+ kvm_ioapic_set_irq(kvm->vioapic,
+ irq_event.irq,
+ irq_event.level);
+ mutex_unlock(&kvm->lock);
+ r = 0;
+ }
+ break;
+ }
+ case KVM_GET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = -EFAULT;
+ if (copy_to_user(argp, &chip, sizeof chip))
+ goto out;
+ r = 0;
+ break;
+ }
+ case KVM_SET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = 0;
+ break;
+ }
+ }
+out:
+ return r;
+}
+
+void kvm_arch_destroy_vm(struct kvm *kvm)
+{
+ kvm_free_physmem(kvm);
+}
+
static __init void kvm_init_msr_list(void)
{
u32 dummy[2];
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
@ 2007-10-12 13:37 ` Arnd Bergmann
[not found] ` <200710121537.09238.arnd-r2nGTMty4D4@public.gmane.org>
2007-10-12 15:08 ` Anthony Liguori
` (3 subsequent siblings)
4 siblings, 1 reply; 72+ messages in thread
From: Arnd Bergmann @ 2007-10-12 13:37 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f; +Cc: Carsten Otte, Avi Kivity
On Friday 12 October 2007, Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>
I assume the contents are ok, since you're just moving code around, but
please
> signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
> reviewed-by: Christian Borntraeger <borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
> reviewed-by: Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
write this 'Signed-off-by' and 'Reviewed-by' (capital letters), and
include a diffstat for any patch that doesn't fit on a few pages
of mail client screen space.
Arnd <><
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <200710121537.09238.arnd-r2nGTMty4D4@public.gmane.org>
@ 2007-10-12 13:47 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-12 13:47 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Avi Kivity
Am Freitag, den 12.10.2007, 15:37 +0200 schrieb Arnd Bergmann:
> I assume the contents are ok, since you're just moving code around, but
> please
> write this 'Signed-off-by' and 'Reviewed-by' (capital letters), and
> include a diffstat for any patch that doesn't fit on a few pages
> of mail client screen space.
The intend of an rfc is in general to review a patch, not to pick on
formalities.
Signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
Reviewed-by: Christian Borntraeger <borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
Reviewed-by: Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
---
kvm.h | 3
kvm_main.c | 460 -----------------------------------------------------------
x86.c | 472 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 478 insertions(+), 457 deletions(-)
Index: kvm/drivers/kvm/kvm.h
===================================================================
--- kvm.orig/drivers/kvm/kvm.h 2007-10-12 13:38:59.000000000 +0200
+++ kvm/drivers/kvm/kvm.h 2007-10-12 14:22:40.000000000 +0200
@@ -661,6 +661,9 @@
unsigned int ioctl, unsigned long arg);
long kvm_arch_vcpu_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg);
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg);
+void kvm_arch_destroy_vm(struct kvm *kvm);
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
Index: kvm/drivers/kvm/kvm_main.c
===================================================================
--- kvm.orig/drivers/kvm/kvm_main.c 2007-10-12 13:38:59.000000000 +0200
+++ kvm/drivers/kvm/kvm_main.c 2007-10-12 13:57:30.000000000 +0200
@@ -40,7 +40,6 @@
#include <linux/anon_inodes.h>
#include <linux/profile.h>
#include <linux/kvm_para.h>
-#include <linux/pagemap.h>
#include <asm/processor.h>
#include <asm/msr.h>
@@ -319,61 +318,6 @@
return kvm;
}
-static void kvm_free_userspace_physmem(struct kvm_memory_slot *free)
-{
- int i;
-
- for (i = 0; i < free->npages; ++i) {
- if (free->phys_mem[i]) {
- if (!PageReserved(free->phys_mem[i]))
- SetPageDirty(free->phys_mem[i]);
- page_cache_release(free->phys_mem[i]);
- }
- }
-}
-
-static void kvm_free_kernel_physmem(struct kvm_memory_slot *free)
-{
- int i;
-
- for (i = 0; i < free->npages; ++i)
- if (free->phys_mem[i])
- __free_page(free->phys_mem[i]);
-}
-
-/*
- * Free any memory in @free but not in @dont.
- */
-static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
- struct kvm_memory_slot *dont)
-{
- if (!dont || free->phys_mem != dont->phys_mem)
- if (free->phys_mem) {
- if (free->user_alloc)
- kvm_free_userspace_physmem(free);
- else
- kvm_free_kernel_physmem(free);
- vfree(free->phys_mem);
- }
- if (!dont || free->rmap != dont->rmap)
- vfree(free->rmap);
-
- if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
- vfree(free->dirty_bitmap);
-
- free->phys_mem = NULL;
- free->npages = 0;
- free->dirty_bitmap = NULL;
-}
-
-static void kvm_free_physmem(struct kvm *kvm)
-{
- int i;
-
- for (i = 0; i < kvm->nmemslots; ++i)
- kvm_free_physmem_slot(&kvm->memslots[i], NULL);
-}
-
static void free_pio_guest_pages(struct kvm_vcpu *vcpu)
{
int i;
@@ -421,7 +365,7 @@
kfree(kvm->vpic);
kfree(kvm->vioapic);
kvm_free_vcpus(kvm);
- kvm_free_physmem(kvm);
+ kvm_arch_destroy_vm(kvm);
kfree(kvm);
}
@@ -686,183 +630,6 @@
EXPORT_SYMBOL_GPL(fx_init);
/*
- * Allocate some memory and give it an address in the guest physical address
- * space.
- *
- * Discontiguous memory is allowed, mostly for framebuffers.
- */
-static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
- struct
- kvm_userspace_memory_region *mem,
- int user_alloc)
-{
- int r;
- gfn_t base_gfn;
- unsigned long npages;
- unsigned long i;
- struct kvm_memory_slot *memslot;
- struct kvm_memory_slot old, new;
-
- r = -EINVAL;
- /* General sanity checks */
- if (mem->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (mem->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (mem->slot >= KVM_MEMORY_SLOTS)
- goto out;
- if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
- goto out;
-
- memslot = &kvm->memslots[mem->slot];
- base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
- npages = mem->memory_size >> PAGE_SHIFT;
-
- if (!npages)
- mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
-
- mutex_lock(&kvm->lock);
-
- new = old = *memslot;
-
- new.base_gfn = base_gfn;
- new.npages = npages;
- new.flags = mem->flags;
-
- /* Disallow changing a memory slot's size. */
- r = -EINVAL;
- if (npages && old.npages && npages != old.npages)
- goto out_unlock;
-
- /* Check for overlaps */
- r = -EEXIST;
- for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
- struct kvm_memory_slot *s = &kvm->memslots[i];
-
- if (s == memslot)
- continue;
- if (!((base_gfn + npages <= s->base_gfn) ||
- (base_gfn >= s->base_gfn + s->npages)))
- goto out_unlock;
- }
-
- /* Deallocate if slot is being removed */
- if (!npages)
- new.phys_mem = NULL;
-
- /* Free page dirty bitmap if unneeded */
- if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
- new.dirty_bitmap = NULL;
-
- r = -ENOMEM;
-
- /* Allocate if a slot is being created */
- if (npages && !new.phys_mem) {
- new.phys_mem = vmalloc(npages * sizeof(struct page *));
-
- if (!new.phys_mem)
- goto out_unlock;
-
- new.rmap = vmalloc(npages * sizeof(struct page *));
-
- if (!new.rmap)
- goto out_unlock;
-
- memset(new.phys_mem, 0, npages * sizeof(struct page *));
- memset(new.rmap, 0, npages * sizeof(*new.rmap));
- if (user_alloc) {
- unsigned long pages_num;
-
- new.user_alloc = 1;
- down_read(¤t->mm->mmap_sem);
-
- pages_num = get_user_pages(current, current->mm,
- mem->userspace_addr,
- npages, 1, 0, new.phys_mem,
- NULL);
-
- up_read(¤t->mm->mmap_sem);
- if (pages_num != npages)
- goto out_unlock;
- } else {
- for (i = 0; i < npages; ++i) {
- new.phys_mem[i] = alloc_page(GFP_HIGHUSER
- | __GFP_ZERO);
- if (!new.phys_mem[i])
- goto out_unlock;
- }
- }
- }
-
- /* Allocate page dirty bitmap if needed */
- if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
- unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;
-
- new.dirty_bitmap = vmalloc(dirty_bytes);
- if (!new.dirty_bitmap)
- goto out_unlock;
- memset(new.dirty_bitmap, 0, dirty_bytes);
- }
-
- if (mem->slot >= kvm->nmemslots)
- kvm->nmemslots = mem->slot + 1;
-
- if (!kvm->n_requested_mmu_pages) {
- unsigned int n_pages;
-
- if (npages) {
- n_pages = npages * KVM_PERMILLE_MMU_PAGES / 1000;
- kvm_mmu_change_mmu_pages(kvm, kvm->n_alloc_mmu_pages +
- n_pages);
- } else {
- unsigned int nr_mmu_pages;
-
- n_pages = old.npages * KVM_PERMILLE_MMU_PAGES / 1000;
- nr_mmu_pages = kvm->n_alloc_mmu_pages - n_pages;
- nr_mmu_pages = max(nr_mmu_pages,
- (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);
- kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
- }
- }
-
- *memslot = new;
-
- kvm_mmu_slot_remove_write_access(kvm, mem->slot);
- kvm_flush_remote_tlbs(kvm);
-
- mutex_unlock(&kvm->lock);
-
- kvm_free_physmem_slot(&old, &new);
- return 0;
-
-out_unlock:
- mutex_unlock(&kvm->lock);
- kvm_free_physmem_slot(&new, &old);
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
- u32 kvm_nr_mmu_pages)
-{
- if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
- return -EINVAL;
-
- mutex_lock(&kvm->lock);
-
- kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
- kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
-
- mutex_unlock(&kvm->lock);
- return 0;
-}
-
-static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
-{
- return kvm->n_alloc_mmu_pages;
-}
-
-/*
* Get (and clear) the dirty memory log for a memory slot.
*/
static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
@@ -907,111 +674,6 @@
return r;
}
-/*
- * Set a new alias region. Aliases map a portion of physical memory into
- * another portion. This is useful for memory windows, for example the PC
- * VGA region.
- */
-static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
- struct kvm_memory_alias *alias)
-{
- int r, n;
- struct kvm_mem_alias *p;
-
- r = -EINVAL;
- /* General sanity checks */
- if (alias->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (alias->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (alias->slot >= KVM_ALIAS_SLOTS)
- goto out;
- if (alias->guest_phys_addr + alias->memory_size
- < alias->guest_phys_addr)
- goto out;
- if (alias->target_phys_addr + alias->memory_size
- < alias->target_phys_addr)
- goto out;
-
- mutex_lock(&kvm->lock);
-
- p = &kvm->aliases[alias->slot];
- p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
- p->npages = alias->memory_size >> PAGE_SHIFT;
- p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
-
- for (n = KVM_ALIAS_SLOTS; n > 0; --n)
- if (kvm->aliases[n - 1].npages)
- break;
- kvm->naliases = n;
-
- kvm_mmu_zap_all(kvm);
-
- mutex_unlock(&kvm->lock);
-
- return 0;
-
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[0],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[1],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(&chip->chip.ioapic,
- ioapic_irqchip(kvm),
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- return r;
-}
-
-static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&pic_irqchip(kvm)->pics[0],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&pic_irqchip(kvm)->pics[1],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(ioapic_irqchip(kvm),
- &chip->chip.ioapic,
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- kvm_pic_update_irq(pic_irqchip(kvm));
- return r;
-}
-
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
{
int i;
@@ -2923,7 +2585,7 @@
{
struct kvm *kvm = filp->private_data;
void __user *argp = (void __user *)arg;
- int r = -EINVAL;
+ int r;
switch (ioctl) {
case KVM_CREATE_VCPU:
@@ -2931,43 +2593,6 @@
if (r < 0)
goto out;
break;
- case KVM_SET_MEMORY_REGION: {
- struct kvm_memory_region kvm_mem;
- struct kvm_userspace_memory_region kvm_userspace_mem;
-
- r = -EFAULT;
- if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
- goto out;
- kvm_userspace_mem.slot = kvm_mem.slot;
- kvm_userspace_mem.flags = kvm_mem.flags;
- kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
- kvm_userspace_mem.memory_size = kvm_mem.memory_size;
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
- if (r)
- goto out;
- break;
- }
- case KVM_SET_USER_MEMORY_REGION: {
- struct kvm_userspace_memory_region kvm_userspace_mem;
-
- r = -EFAULT;
- if (copy_from_user(&kvm_userspace_mem, argp,
- sizeof kvm_userspace_mem))
- goto out;
-
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
- if (r)
- goto out;
- break;
- }
- case KVM_SET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
- if (r)
- goto out;
- break;
- case KVM_GET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
- break;
case KVM_GET_DIRTY_LOG: {
struct kvm_dirty_log log;
@@ -2979,87 +2604,8 @@
goto out;
break;
}
- case KVM_SET_MEMORY_ALIAS: {
- struct kvm_memory_alias alias;
-
- r = -EFAULT;
- if (copy_from_user(&alias, argp, sizeof alias))
- goto out;
- r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
- if (r)
- goto out;
- break;
- }
- case KVM_CREATE_IRQCHIP:
- r = -ENOMEM;
- kvm->vpic = kvm_create_pic(kvm);
- if (kvm->vpic) {
- r = kvm_ioapic_init(kvm);
- if (r) {
- kfree(kvm->vpic);
- kvm->vpic = NULL;
- goto out;
- }
- } else
- goto out;
- break;
- case KVM_IRQ_LINE: {
- struct kvm_irq_level irq_event;
-
- r = -EFAULT;
- if (copy_from_user(&irq_event, argp, sizeof irq_event))
- goto out;
- if (irqchip_in_kernel(kvm)) {
- mutex_lock(&kvm->lock);
- if (irq_event.irq < 16)
- kvm_pic_set_irq(pic_irqchip(kvm),
- irq_event.irq,
- irq_event.level);
- kvm_ioapic_set_irq(kvm->vioapic,
- irq_event.irq,
- irq_event.level);
- mutex_unlock(&kvm->lock);
- r = 0;
- }
- break;
- }
- case KVM_GET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = -EFAULT;
- if (copy_to_user(argp, &chip, sizeof chip))
- goto out;
- r = 0;
- break;
- }
- case KVM_SET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = 0;
- break;
- }
default:
- ;
+ return kvm_arch_vm_ioctl(filp, ioctl, arg);
}
out:
return r;
Index: kvm/drivers/kvm/x86.c
===================================================================
--- kvm.orig/drivers/kvm/x86.c 2007-10-12 13:38:59.000000000 +0200
+++ kvm/drivers/kvm/x86.c 2007-10-12 13:57:28.000000000 +0200
@@ -21,6 +21,7 @@
#include <linux/kvm.h>
#include <linux/fs.h>
#include <linux/vmalloc.h>
+#include <linux/pagemap.h>
#include <asm/uaccess.h>
@@ -300,6 +301,477 @@
return r;
}
+static void kvm_free_userspace_physmem(struct kvm_memory_slot *free)
+{
+ int i;
+
+ for (i = 0; i < free->npages; ++i) {
+ if (free->phys_mem[i]) {
+ if (!PageReserved(free->phys_mem[i]))
+ SetPageDirty(free->phys_mem[i]);
+ page_cache_release(free->phys_mem[i]);
+ }
+ }
+}
+
+static void kvm_free_kernel_physmem(struct kvm_memory_slot *free)
+{
+ int i;
+
+ for (i = 0; i < free->npages; ++i)
+ if (free->phys_mem[i])
+ __free_page(free->phys_mem[i]);
+}
+
+/*
+ * Free any memory in @free but not in @dont.
+ */
+static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
+ struct kvm_memory_slot *dont)
+{
+ if (!dont || free->phys_mem != dont->phys_mem)
+ if (free->phys_mem) {
+ if (free->user_alloc)
+ kvm_free_userspace_physmem(free);
+ else
+ kvm_free_kernel_physmem(free);
+ vfree(free->phys_mem);
+ }
+ if (!dont || free->rmap != dont->rmap)
+ vfree(free->rmap);
+
+ if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
+ vfree(free->dirty_bitmap);
+
+ free->phys_mem = NULL;
+ free->npages = 0;
+ free->dirty_bitmap = NULL;
+}
+
+static void kvm_free_physmem(struct kvm *kvm)
+{
+ int i;
+
+ for (i = 0; i < kvm->nmemslots; ++i)
+ kvm_free_physmem_slot(&kvm->memslots[i], NULL);
+}
+
+/*
+ * Allocate some memory and give it an address in the guest physical address
+ * space.
+ *
+ * Discontiguous memory is allowed, mostly for framebuffers.
+ */
+static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
+ struct
+ kvm_userspace_memory_region *mem,
+ int user_alloc)
+{
+ int r;
+ gfn_t base_gfn;
+ unsigned long npages;
+ unsigned long i;
+ struct kvm_memory_slot *memslot;
+ struct kvm_memory_slot old, new;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (mem->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (mem->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (mem->slot >= KVM_MEMORY_SLOTS)
+ goto out;
+ if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
+ goto out;
+
+ memslot = &kvm->memslots[mem->slot];
+ base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
+ npages = mem->memory_size >> PAGE_SHIFT;
+
+ if (!npages)
+ mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
+
+ mutex_lock(&kvm->lock);
+
+ new = old = *memslot;
+
+ new.base_gfn = base_gfn;
+ new.npages = npages;
+ new.flags = mem->flags;
+
+ /* Disallow changing a memory slot's size. */
+ r = -EINVAL;
+ if (npages && old.npages && npages != old.npages)
+ goto out_unlock;
+
+ /* Check for overlaps */
+ r = -EEXIST;
+ for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
+ struct kvm_memory_slot *s = &kvm->memslots[i];
+
+ if (s == memslot)
+ continue;
+ if (!((base_gfn + npages <= s->base_gfn) ||
+ (base_gfn >= s->base_gfn + s->npages)))
+ goto out_unlock;
+ }
+
+ /* Deallocate if slot is being removed */
+ if (!npages)
+ new.phys_mem = NULL;
+
+ /* Free page dirty bitmap if unneeded */
+ if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
+ new.dirty_bitmap = NULL;
+
+ r = -ENOMEM;
+
+ /* Allocate if a slot is being created */
+ if (npages && !new.phys_mem) {
+ new.phys_mem = vmalloc(npages * sizeof(struct page *));
+
+ if (!new.phys_mem)
+ goto out_unlock;
+
+ new.rmap = vmalloc(npages * sizeof(struct page *));
+
+ if (!new.rmap)
+ goto out_unlock;
+
+ memset(new.phys_mem, 0, npages * sizeof(struct page *));
+ memset(new.rmap, 0, npages * sizeof(*new.rmap));
+ if (user_alloc) {
+ unsigned long pages_num;
+
+ new.user_alloc = 1;
+ down_read(¤t->mm->mmap_sem);
+
+ pages_num = get_user_pages(current, current->mm,
+ mem->userspace_addr,
+ npages, 1, 0, new.phys_mem,
+ NULL);
+
+ up_read(¤t->mm->mmap_sem);
+ if (pages_num != npages)
+ goto out_unlock;
+ } else {
+ for (i = 0; i < npages; ++i) {
+ new.phys_mem[i] = alloc_page(GFP_HIGHUSER
+ | __GFP_ZERO);
+ if (!new.phys_mem[i])
+ goto out_unlock;
+ }
+ }
+ }
+
+ /* Allocate page dirty bitmap if needed */
+ if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
+ unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;
+
+ new.dirty_bitmap = vmalloc(dirty_bytes);
+ if (!new.dirty_bitmap)
+ goto out_unlock;
+ memset(new.dirty_bitmap, 0, dirty_bytes);
+ }
+
+ if (mem->slot >= kvm->nmemslots)
+ kvm->nmemslots = mem->slot + 1;
+
+ if (!kvm->n_requested_mmu_pages) {
+ unsigned int n_pages;
+
+ if (npages) {
+ n_pages = npages * KVM_PERMILLE_MMU_PAGES / 1000;
+ kvm_mmu_change_mmu_pages(kvm, kvm->n_alloc_mmu_pages +
+ n_pages);
+ } else {
+ unsigned int nr_mmu_pages;
+
+ n_pages = old.npages * KVM_PERMILLE_MMU_PAGES / 1000;
+ nr_mmu_pages = kvm->n_alloc_mmu_pages - n_pages;
+ nr_mmu_pages = max(nr_mmu_pages,
+ (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);
+ kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
+ }
+ }
+
+ *memslot = new;
+
+ kvm_mmu_slot_remove_write_access(kvm, mem->slot);
+ kvm_flush_remote_tlbs(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ kvm_free_physmem_slot(&old, &new);
+ return 0;
+
+out_unlock:
+ mutex_unlock(&kvm->lock);
+ kvm_free_physmem_slot(&new, &old);
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
+ u32 kvm_nr_mmu_pages)
+{
+ if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
+ return -EINVAL;
+
+ mutex_lock(&kvm->lock);
+
+ kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
+ kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
+
+ mutex_unlock(&kvm->lock);
+ return 0;
+}
+
+static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
+{
+ return kvm->n_alloc_mmu_pages;
+}
+
+/*
+ * Set a new alias region. Aliases map a portion of physical memory into
+ * another portion. This is useful for memory windows, for example the PC
+ * VGA region.
+ */
+static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
+ struct kvm_memory_alias *alias)
+{
+ int r, n;
+ struct kvm_mem_alias *p;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (alias->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->slot >= KVM_ALIAS_SLOTS)
+ goto out;
+ if (alias->guest_phys_addr + alias->memory_size
+ < alias->guest_phys_addr)
+ goto out;
+ if (alias->target_phys_addr + alias->memory_size
+ < alias->target_phys_addr)
+ goto out;
+
+ mutex_lock(&kvm->lock);
+
+ p = &kvm->aliases[alias->slot];
+ p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
+ p->npages = alias->memory_size >> PAGE_SHIFT;
+ p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
+
+ for (n = KVM_ALIAS_SLOTS; n > 0; --n)
+ if (kvm->aliases[n - 1].npages)
+ break;
+ kvm->naliases = n;
+
+ kvm_mmu_zap_all(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ return 0;
+
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[0],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[1],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(&chip->chip.ioapic,
+ ioapic_irqchip(kvm),
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ return r;
+}
+
+static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&pic_irqchip(kvm)->pics[0],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&pic_irqchip(kvm)->pics[1],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(ioapic_irqchip(kvm),
+ &chip->chip.ioapic,
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ kvm_pic_update_irq(pic_irqchip(kvm));
+ return r;
+}
+
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg)
+{
+ struct kvm *kvm = filp->private_data;
+ void __user *argp = (void __user *)arg;
+ int r = -EINVAL;
+
+ switch(ioctl) {
+ case KVM_SET_MEMORY_REGION: {
+ struct kvm_memory_region kvm_mem;
+ struct kvm_userspace_memory_region kvm_userspace_mem;
+
+ r = -EFAULT;
+ if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
+ goto out;
+ kvm_userspace_mem.slot = kvm_mem.slot;
+ kvm_userspace_mem.flags = kvm_mem.flags;
+ kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
+ kvm_userspace_mem.memory_size = kvm_mem.memory_size;
+ r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_SET_USER_MEMORY_REGION: {
+ struct kvm_userspace_memory_region kvm_userspace_mem;
+
+ r = -EFAULT;
+ if (copy_from_user(&kvm_userspace_mem, argp,
+ sizeof kvm_userspace_mem))
+ goto out;
+
+ r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_SET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
+ if (r)
+ goto out;
+ break;
+ case KVM_GET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
+ break;
+ case KVM_SET_MEMORY_ALIAS: {
+ struct kvm_memory_alias alias;
+
+ r = -EFAULT;
+ if (copy_from_user(&alias, argp, sizeof alias))
+ goto out;
+ r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_CREATE_IRQCHIP:
+ r = -ENOMEM;
+ kvm->vpic = kvm_create_pic(kvm);
+ if (kvm->vpic) {
+ r = kvm_ioapic_init(kvm);
+ if (r) {
+ kfree(kvm->vpic);
+ kvm->vpic = NULL;
+ goto out;
+ }
+ } else
+ goto out;
+ break;
+ case KVM_IRQ_LINE: {
+ struct kvm_irq_level irq_event;
+
+ r = -EFAULT;
+ if (copy_from_user(&irq_event, argp, sizeof irq_event))
+ goto out;
+ if (irqchip_in_kernel(kvm)) {
+ mutex_lock(&kvm->lock);
+ if (irq_event.irq < 16)
+ kvm_pic_set_irq(pic_irqchip(kvm),
+ irq_event.irq,
+ irq_event.level);
+ kvm_ioapic_set_irq(kvm->vioapic,
+ irq_event.irq,
+ irq_event.level);
+ mutex_unlock(&kvm->lock);
+ r = 0;
+ }
+ break;
+ }
+ case KVM_GET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = -EFAULT;
+ if (copy_to_user(argp, &chip, sizeof chip))
+ goto out;
+ r = 0;
+ break;
+ }
+ case KVM_SET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = 0;
+ break;
+ }
+ }
+out:
+ return r;
+}
+
+void kvm_arch_destroy_vm(struct kvm *kvm)
+{
+ kvm_free_physmem(kvm);
+}
+
static __init void kvm_init_msr_list(void)
{
u32 dummy[2];
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-12 13:37 ` Arnd Bergmann
@ 2007-10-12 15:08 ` Anthony Liguori
[not found] ` <470F8DFD.6030205-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
2007-10-13 4:08 ` Zhang, Xiantao
` (2 subsequent siblings)
4 siblings, 1 reply; 72+ messages in thread
From: Anthony Liguori @ 2007-10-12 15:08 UTC (permalink / raw)
To: Carsten Otte
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Avi Kivity
Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>
> Common ioctls for all architectures are:
> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG
>
> I'd really like to see more commonalities, but all others did not fit
> our needs. I would love to keep KVM_GET_DIRTY_LOG common, so that the
> ingenious migration code does not need to care too much about different
> architectures.
>
> x86 specific ioctls are:
> KVM_SET_MEMORY_REGION, KVM_SET_USER_MEMORY_REGION,
> KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
> KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
>
> While the pic/apic related functions are obviously x86 specific, some
> other ioctls seem to be common at a first glance.
> KVM_SET_(USER)_MEMORY_REGION for example. We've got a total different
> address layout on s390: we cannot support multiple slots, and a user
> memory range always equals the guest physical memory [guest_phys + vm
> specific offset = host user address]. We don't have nor need dedicated
> vmas for the guest memory, we just use what the memory managment has in
> stock. This is true, because we reuse the page table for user and guest
> mode.
>
You still need to tell the kernel about vm specific offset right? So
doesn't KVM_SET_USER_MEMORY_REGION for you just become that? There's
nothing wrong with s390 not supporting multiple memory slots, but
there's no reason the ioctl interface can't be the same.
Regards,
Anthony Liguori
> Looks to me like the s390 might have a lot in common with a future AMD
> nested page table implementation. If AMD choose to reuse the page table
> too, we might share the same ioctl to set up guest addressing with them.
>
> signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
> reviewed-by: Christian Borntraeger <borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
> reviewed-by: Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> ---
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-12 13:37 ` Arnd Bergmann
2007-10-12 15:08 ` Anthony Liguori
@ 2007-10-13 4:08 ` Zhang, Xiantao
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC808DB9-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-13 7:47 ` Avi Kivity
2007-10-25 15:48 ` RFC/patch portability: split kvm_vm_ioctl v2 Carsten Otte
4 siblings, 1 reply; 72+ messages in thread
From: Zhang, Xiantao @ 2007-10-13 4:08 UTC (permalink / raw)
To: Carsten Otte, Avi Kivity; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>
> Common ioctls for all architectures are:
> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG
>
> I'd really like to see more commonalities, but all others did not fit
> our needs. I would love to keep KVM_GET_DIRTY_LOG common, so that the
> ingenious migration code does not need to care too much about
> different architectures.
> x86 specific ioctls are:
> KVM_SET_MEMORY_REGION, KVM_SET_USER_MEMORY_REGION,
> KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
> KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
I don't know why we not put KVM_SET_MEMORY_REGION,
KVM_SET_USER_MEMORY_REGION as common, although
I have read the reasons you listed. I think they should work for most of
archs, although it is not very friendly with s390. If we put them
as arch-specific ones, we have to duplicate many copies for them in KVM
code.
One suggestion: Maybe we can comment out current memory allocation
logic in userspace for S390, and s390 use your apporach to get its
memory.
> While the pic/apic related functions are obviously x86 specific, some
> other ioctls seem to be common at a first glance.
> KVM_SET_(USER)_MEMORY_REGION for example. We've got a total different
> address layout on s390: we cannot support multiple slots, and a user
> memory range always equals the guest physical memory [guest_phys + vm
> specific offset = host user address]. We don't have nor need dedicated
> vmas for the guest memory, we just use what the memory managment has
> in
> stock. This is true, because we reuse the page table for user and
> guest
> mode.
> Looks to me like the s390 might have a lot in common with a future AMD
> nested page table implementation. If AMD choose to reuse the page
> table
> too, we might share the same ioctl to set up guest addressing with
> them.
>
------------------------------------------------------------------------
-
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems? Stop.
> Now Search log events and configuration files using AJAX and a
> browser. Download your FREE copy of Splunk now >>
> http://get.splunk.com/ _______________________________________________
> kvm-devel mailing list
> kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/kvm-devel
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <470F8DFD.6030205-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
@ 2007-10-13 7:31 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-13 7:31 UTC (permalink / raw)
To: Anthony Liguori
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Avi Kivity
Anthony Liguori wrote:
>> While the pic/apic related functions are obviously x86 specific, some
>> other ioctls seem to be common at a first glance.
>> KVM_SET_(USER)_MEMORY_REGION for example. We've got a total different
>> address layout on s390: we cannot support multiple slots, and a user
>> memory range always equals the guest physical memory [guest_phys + vm
>> specific offset = host user address]. We don't have nor need dedicated
>> vmas for the guest memory, we just use what the memory managment has in
>> stock. This is true, because we reuse the page table for user and guest
>> mode.
>>
>
> You still need to tell the kernel about vm specific offset right? So
> doesn't KVM_SET_USER_MEMORY_REGION for you just become that? There's
> nothing wrong with s390 not supporting multiple memory slots, but
> there's no reason the ioctl interface can't be the same.
I've though about that too. The thing is, the interface would really
do something different on s390. I think it's more confusing to
userland to have one interface that does two different things
depending on the architecture rather then having different interfaces
for different things.
You're right that KVM_SET_USER_MEMORY_REGION would cover our needs if
we return -EINVAL in case slot != 0 or guest start address != 0. I'll
talk it though with Martin on monday.
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC808DB9-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-13 7:38 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-13 7:38 UTC (permalink / raw)
To: Zhang, Xiantao; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Avi Kivity
Zhang, Xiantao wrote:
> I don't know why we not put KVM_SET_MEMORY_REGION,
> KVM_SET_USER_MEMORY_REGION as common, although
> I have read the reasons you listed. I think they should work for most of
> archs, although it is not very friendly with s390. If we put them
> as arch-specific ones, we have to duplicate many copies for them in KVM
> code.
On s390, we use regular userspace memory to back our guest. Our
architecture allows us to specify an offset and an address limit for
the guest, and we don't need to have shaddow page tables and other
tricks. We just use the userspace page table, and the guest memory is
swapable to disk.
> One suggestion: Maybe we can comment out current memory allocation
> logic in userspace for S390, and s390 use your apporach to get its
> memory.
Userspace will definetly need to do a special case for setting up the
guest memory anyway due to major architectural differences. Thus I
think it is fair to let it use two different ioctls for each case.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
` (2 preceding siblings ...)
2007-10-13 4:08 ` Zhang, Xiantao
@ 2007-10-13 7:47 ` Avi Kivity
[not found] ` <471077F9.8000703-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-25 15:48 ` RFC/patch portability: split kvm_vm_ioctl v2 Carsten Otte
4 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-13 7:47 UTC (permalink / raw)
To: Carsten Otte; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>
> Common ioctls for all architectures are:
> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG
>
> I'd really like to see more commonalities, but all others did not fit
> our needs. I would love to keep KVM_GET_DIRTY_LOG common, so that the
> ingenious migration code does not need to care too much about different
> architectures.
>
> x86 specific ioctls are:
> KVM_SET_MEMORY_REGION, KVM_SET_USER_MEMORY_REGION,
> KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
> KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
>
We need to distinguish between x86 specific (only x86 has this) and s390
special (everyone has it except s390). In the latter case it should
still be in common code to avoid duplication, with a guard to disable
compilation on s390.
KVM_SET_MEMORY_REGION is in theory applicable to non-s390 but I'd like
to deprecate it, so there's no point in implementing it on non-x86. The
rest are s390 special rather than x86 specific.
As related previously, KVM_SET_USER_MEMORY_REGION should work for s390
(with an extra check for the guest phsyical start address).
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <471077F9.8000703-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-13 7:52 ` Carsten Otte
2007-10-15 8:18 ` Carsten Otte
1 sibling, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-13 7:52 UTC (permalink / raw)
To: Avi Kivity; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Avi Kivity wrote:
> We need to distinguish between x86 specific (only x86 has this) and s390
> special (everyone has it except s390). In the latter case it should
> still be in common code to avoid duplication, with a guard to disable
> compilation on s390.
>
> KVM_SET_MEMORY_REGION is in theory applicable to non-s390 but I'd like
> to deprecate it, so there's no point in implementing it on non-x86. The
> rest are s390 special rather than x86 specific.
>
> As related previously, KVM_SET_USER_MEMORY_REGION should work for s390
> (with an extra check for the guest phsyical start address).
That sounds reasonable to me. I'll make a patch that does this three
way split on Monday. Let's see how it comes out.
KVM_SET_USER_MEMORY_REGION, and KVM_SET_MEMORY_REGION will go back to
common, the irq related ones to a third place.
thanks for reviewing,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <471077F9.8000703-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-13 7:52 ` Carsten Otte
@ 2007-10-15 8:18 ` Carsten Otte
[not found] ` <47132260.9030606-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-15 8:18 UTC (permalink / raw)
To: Avi Kivity; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Avi Kivity wrote:
> We need to distinguish between x86 specific (only x86 has this) and s390
> special (everyone has it except s390). In the latter case it should
> still be in common code to avoid duplication, with a guard to disable
> compilation on s390.
>
> KVM_SET_MEMORY_REGION is in theory applicable to non-s390 but I'd like
> to deprecate it, so there's no point in implementing it on non-x86. The
> rest are s390 special rather than x86 specific.
>
> As related previously, KVM_SET_USER_MEMORY_REGION should work for s390
> (with an extra check for the guest phsyical start address).
I thought about that all through the weekend. To me, it looks like I
want to eliminate "s390 special" as far as possible. In given case,
I'll follow Anthonys suggestion and support
KVM_SET_USER_MEMORY_REGION. KVM_SET_MEMORY_REGION will also go common,
and in case we're pushing the actual port before you deprecate that
call, we'll #ifdef CONFIG_ARCH_S390 around it.
As for the pic/apic part, I think it is x86 specific. Christian
Ehrhardt stated he believes ppc won't have that too.
Will create another patch on vm_ioctl that reflects this later today.
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <47132260.9030606-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-15 8:30 ` Christian Ehrhardt
2007-10-15 8:32 ` Avi Kivity
1 sibling, 0 replies; 72+ messages in thread
From: Christian Ehrhardt @ 2007-10-15 8:30 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Hollis Blanchard, Avi Kivity
Carsten Otte wrote:
>
> Avi Kivity wrote:
>> We need to distinguish between x86 specific (only x86 has this) and s390
>> special (everyone has it except s390). In the latter case it should
>> still be in common code to avoid duplication, with a guard to disable
>> compilation on s390.
>>
>> KVM_SET_MEMORY_REGION is in theory applicable to non-s390 but I'd like
>> to deprecate it, so there's no point in implementing it on non-x86. The
>> rest are s390 special rather than x86 specific.
>>
>> As related previously, KVM_SET_USER_MEMORY_REGION should work for s390
>> (with an extra check for the guest phsyical start address).
> I thought about that all through the weekend. To me, it looks like I
> want to eliminate "s390 special" as far as possible. In given case,
> I'll follow Anthonys suggestion and support
> KVM_SET_USER_MEMORY_REGION. KVM_SET_MEMORY_REGION will also go common,
> and in case we're pushing the actual port before you deprecate that
> call, we'll #ifdef CONFIG_ARCH_S390 around it.
>
> As for the pic/apic part, I think it is x86 specific. Christian
> Ehrhardt stated he believes ppc won't have that too.
At least not in that manner x86 has it atm (which would be enough for
splitting it per arch), since I'm unsure in that topic I set Hollis on cc
who should know it better with his larger power experience.
>
> Will create another patch on vm_ioctl that reflects this later today.
>
> so long,
> Carsten
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems? Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> _______________________________________________
> kvm-devel mailing list
> kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/kvm-devel
--
Grüsse / regards,
Christian Ehrhardt
IBM Linux Technology Center, Open Virtualization
+49 7031/16-3385
Ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org
Ehrhardt-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org
IBM Deutschland Entwicklung GmbH
Vorsitzender des Aufsichtsrats: Johann Weihen
Geschäftsführung: Herbert Kircher
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl
[not found] ` <47132260.9030606-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-15 8:30 ` Christian Ehrhardt
@ 2007-10-15 8:32 ` Avi Kivity
1 sibling, 0 replies; 72+ messages in thread
From: Avi Kivity @ 2007-10-15 8:32 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Carsten Otte wrote:
>
>
> Avi Kivity wrote:
>> We need to distinguish between x86 specific (only x86 has this) and s390
>> special (everyone has it except s390). In the latter case it should
>> still be in common code to avoid duplication, with a guard to disable
>> compilation on s390.
>>
>> KVM_SET_MEMORY_REGION is in theory applicable to non-s390 but I'd like
>> to deprecate it, so there's no point in implementing it on non-x86. The
>> rest are s390 special rather than x86 specific.
>>
>> As related previously, KVM_SET_USER_MEMORY_REGION should work for s390
>> (with an extra check for the guest phsyical start address).
> I thought about that all through the weekend. To me, it looks like I
> want to eliminate "s390 special" as far as possible. In given case,
> I'll follow Anthonys suggestion and support
> KVM_SET_USER_MEMORY_REGION. KVM_SET_MEMORY_REGION will also go common,
> and in case
While KVM_SET_MEMORY_REGION can be supported on other archs, there's no
reason to do so. It will be supported on x86 for backward compatibility
but newer ports need only support the newer APIs.
>
> As for the pic/apic part, I think it is x86 specific. Christian
> Ehrhardt stated he believes ppc won't have that too.
>
Yes, it's x86 specific.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
` (3 preceding siblings ...)
2007-10-13 7:47 ` Avi Kivity
@ 2007-10-25 15:48 ` Carsten Otte
[not found] ` <1193327325.8345.9.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
4 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-25 15:48 UTC (permalink / raw)
To: Avi Kivity, Zhang, Xiantao, Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
This patch splits kvm_vm_ioctl into archtecture independent parts, and
x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
Common ioctls for all architectures are:
KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
KVM_SET_USER_MEMORY_REGION is actually implemented in x86.c now, because
the code behind looks arch specific to me. The ioctl however is generic
as suggested by Avi's review feedback.
x86 specific ioctls are:
KVM_SET_MEMORY_REGION,
KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
Signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
kvm.h | 7 +
kvm_main.c | 402 -----------------------------------------------------------
x86.c | 415 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 426 insertions(+), 398 deletions(-)
---
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 08b5b21..a2f2536 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -610,6 +610,13 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg);
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
+int kvm_arch_vm_ioctl_set_memory_region(struct kvm *kvm,
+ struct kvm_userspace_memory_region
+ *mem,
+ int user_alloc);
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg);
+void kvm_arch_destroy_vm(struct kvm *kvm);
__init void kvm_arch_init(void);
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 6f7b31e..09a0826 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -42,7 +42,6 @@
#include <linux/profile.h>
#include <linux/kvm_para.h>
#include <linux/pagemap.h>
-#include <linux/mman.h>
#include <asm/processor.h>
#include <asm/msr.h>
@@ -301,31 +300,6 @@ static struct kvm *kvm_create_vm(void)
return kvm;
}
-/*
- * Free any memory in @free but not in @dont.
- */
-static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
- struct kvm_memory_slot *dont)
-{
- if (!dont || free->rmap != dont->rmap)
- vfree(free->rmap);
-
- if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
- vfree(free->dirty_bitmap);
-
- free->npages = 0;
- free->dirty_bitmap = NULL;
- free->rmap = NULL;
-}
-
-static void kvm_free_physmem(struct kvm *kvm)
-{
- int i;
-
- for (i = 0; i < kvm->nmemslots; ++i)
- kvm_free_physmem_slot(&kvm->memslots[i], NULL);
-}
-
static void free_pio_guest_pages(struct kvm_vcpu *vcpu)
{
int i;
@@ -373,7 +347,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
kfree(kvm->vpic);
kfree(kvm->vioapic);
kvm_free_vcpus(kvm);
- kvm_free_physmem(kvm);
+ kvm_arch_destroy_vm(kvm);
kfree(kvm);
}
@@ -638,166 +612,6 @@ void fx_init(struct kvm_vcpu *vcpu)
EXPORT_SYMBOL_GPL(fx_init);
/*
- * Allocate some memory and give it an address in the guest physical address
- * space.
- *
- * Discontiguous memory is allowed, mostly for framebuffers.
- */
-static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
- struct
- kvm_userspace_memory_region *mem,
- int user_alloc)
-{
- int r;
- gfn_t base_gfn;
- unsigned long npages;
- unsigned long i;
- struct kvm_memory_slot *memslot;
- struct kvm_memory_slot old, new;
-
- r = -EINVAL;
- /* General sanity checks */
- if (mem->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (mem->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (mem->slot >= KVM_MEMORY_SLOTS)
- goto out;
- if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
- goto out;
-
- memslot = &kvm->memslots[mem->slot];
- base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
- npages = mem->memory_size >> PAGE_SHIFT;
-
- if (!npages)
- mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
-
- mutex_lock(&kvm->lock);
-
- new = old = *memslot;
-
- new.base_gfn = base_gfn;
- new.npages = npages;
- new.flags = mem->flags;
-
- /* Disallow changing a memory slot's size. */
- r = -EINVAL;
- if (npages && old.npages && npages != old.npages)
- goto out_unlock;
-
- /* Check for overlaps */
- r = -EEXIST;
- for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
- struct kvm_memory_slot *s = &kvm->memslots[i];
-
- if (s == memslot)
- continue;
- if (!((base_gfn + npages <= s->base_gfn) ||
- (base_gfn >= s->base_gfn + s->npages)))
- goto out_unlock;
- }
-
- /* Free page dirty bitmap if unneeded */
- if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
- new.dirty_bitmap = NULL;
-
- r = -ENOMEM;
-
- /* Allocate if a slot is being created */
- if (npages && !new.rmap) {
- new.rmap = vmalloc(npages * sizeof(struct page *));
-
- if (!new.rmap)
- goto out_unlock;
-
- memset(new.rmap, 0, npages * sizeof(*new.rmap));
-
- if (user_alloc)
- new.userspace_addr = mem->userspace_addr;
- else {
- down_write(¤t->mm->mmap_sem);
- new.userspace_addr = do_mmap(NULL, 0,
- npages * PAGE_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_ANONYMOUS,
- 0);
- up_write(¤t->mm->mmap_sem);
-
- if (IS_ERR((void *)new.userspace_addr))
- goto out_unlock;
- }
- }
-
- /* Allocate page dirty bitmap if needed */
- if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
- unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;
-
- new.dirty_bitmap = vmalloc(dirty_bytes);
- if (!new.dirty_bitmap)
- goto out_unlock;
- memset(new.dirty_bitmap, 0, dirty_bytes);
- }
-
- if (mem->slot >= kvm->nmemslots)
- kvm->nmemslots = mem->slot + 1;
-
- if (!kvm->n_requested_mmu_pages) {
- unsigned int n_pages;
-
- if (npages) {
- n_pages = npages * KVM_PERMILLE_MMU_PAGES / 1000;
- kvm_mmu_change_mmu_pages(kvm, kvm->n_alloc_mmu_pages +
- n_pages);
- } else {
- unsigned int nr_mmu_pages;
-
- n_pages = old.npages * KVM_PERMILLE_MMU_PAGES / 1000;
- nr_mmu_pages = kvm->n_alloc_mmu_pages - n_pages;
- nr_mmu_pages = max(nr_mmu_pages,
- (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);
- kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
- }
- }
-
- *memslot = new;
-
- kvm_mmu_slot_remove_write_access(kvm, mem->slot);
- kvm_flush_remote_tlbs(kvm);
-
- mutex_unlock(&kvm->lock);
-
- kvm_free_physmem_slot(&old, &new);
- return 0;
-
-out_unlock:
- mutex_unlock(&kvm->lock);
- kvm_free_physmem_slot(&new, &old);
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
- u32 kvm_nr_mmu_pages)
-{
- if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
- return -EINVAL;
-
- mutex_lock(&kvm->lock);
-
- kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
- kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
-
- mutex_unlock(&kvm->lock);
- return 0;
-}
-
-static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
-{
- return kvm->n_alloc_mmu_pages;
-}
-
-/*
* Get (and clear) the dirty memory log for a memory slot.
*/
static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
@@ -842,111 +656,6 @@ out:
return r;
}
-/*
- * Set a new alias region. Aliases map a portion of physical memory into
- * another portion. This is useful for memory windows, for example the PC
- * VGA region.
- */
-static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
- struct kvm_memory_alias *alias)
-{
- int r, n;
- struct kvm_mem_alias *p;
-
- r = -EINVAL;
- /* General sanity checks */
- if (alias->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (alias->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (alias->slot >= KVM_ALIAS_SLOTS)
- goto out;
- if (alias->guest_phys_addr + alias->memory_size
- < alias->guest_phys_addr)
- goto out;
- if (alias->target_phys_addr + alias->memory_size
- < alias->target_phys_addr)
- goto out;
-
- mutex_lock(&kvm->lock);
-
- p = &kvm->aliases[alias->slot];
- p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
- p->npages = alias->memory_size >> PAGE_SHIFT;
- p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
-
- for (n = KVM_ALIAS_SLOTS; n > 0; --n)
- if (kvm->aliases[n - 1].npages)
- break;
- kvm->naliases = n;
-
- kvm_mmu_zap_all(kvm);
-
- mutex_unlock(&kvm->lock);
-
- return 0;
-
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[0],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[1],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(&chip->chip.ioapic,
- ioapic_irqchip(kvm),
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- return r;
-}
-
-static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&pic_irqchip(kvm)->pics[0],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&pic_irqchip(kvm)->pics[1],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(ioapic_irqchip(kvm),
- &chip->chip.ioapic,
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- kvm_pic_update_irq(pic_irqchip(kvm));
- return r;
-}
-
int is_error_page(struct page *page)
{
return page == bad_page;
@@ -2921,7 +2630,7 @@ static long kvm_vm_ioctl(struct file *filp,
{
struct kvm *kvm = filp->private_data;
void __user *argp = (void __user *)arg;
- int r = -EINVAL;
+ int r;
switch (ioctl) {
case KVM_CREATE_VCPU:
@@ -2929,22 +2638,6 @@ static long kvm_vm_ioctl(struct file *filp,
if (r < 0)
goto out;
break;
- case KVM_SET_MEMORY_REGION: {
- struct kvm_memory_region kvm_mem;
- struct kvm_userspace_memory_region kvm_userspace_mem;
-
- r = -EFAULT;
- if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
- goto out;
- kvm_userspace_mem.slot = kvm_mem.slot;
- kvm_userspace_mem.flags = kvm_mem.flags;
- kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
- kvm_userspace_mem.memory_size = kvm_mem.memory_size;
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
- if (r)
- goto out;
- break;
- }
case KVM_SET_USER_MEMORY_REGION: {
struct kvm_userspace_memory_region kvm_userspace_mem;
@@ -2953,19 +2646,11 @@ static long kvm_vm_ioctl(struct file *filp,
sizeof kvm_userspace_mem))
goto out;
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
+ r = kvm_arch_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
if (r)
goto out;
break;
}
- case KVM_SET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
- if (r)
- goto out;
- break;
- case KVM_GET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
- break;
case KVM_GET_DIRTY_LOG: {
struct kvm_dirty_log log;
@@ -2977,87 +2662,8 @@ static long kvm_vm_ioctl(struct file *filp,
goto out;
break;
}
- case KVM_SET_MEMORY_ALIAS: {
- struct kvm_memory_alias alias;
-
- r = -EFAULT;
- if (copy_from_user(&alias, argp, sizeof alias))
- goto out;
- r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
- if (r)
- goto out;
- break;
- }
- case KVM_CREATE_IRQCHIP:
- r = -ENOMEM;
- kvm->vpic = kvm_create_pic(kvm);
- if (kvm->vpic) {
- r = kvm_ioapic_init(kvm);
- if (r) {
- kfree(kvm->vpic);
- kvm->vpic = NULL;
- goto out;
- }
- } else
- goto out;
- break;
- case KVM_IRQ_LINE: {
- struct kvm_irq_level irq_event;
-
- r = -EFAULT;
- if (copy_from_user(&irq_event, argp, sizeof irq_event))
- goto out;
- if (irqchip_in_kernel(kvm)) {
- mutex_lock(&kvm->lock);
- if (irq_event.irq < 16)
- kvm_pic_set_irq(pic_irqchip(kvm),
- irq_event.irq,
- irq_event.level);
- kvm_ioapic_set_irq(kvm->vioapic,
- irq_event.irq,
- irq_event.level);
- mutex_unlock(&kvm->lock);
- r = 0;
- }
- break;
- }
- case KVM_GET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = -EFAULT;
- if (copy_to_user(argp, &chip, sizeof chip))
- goto out;
- r = 0;
- break;
- }
- case KVM_SET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = 0;
- break;
- }
default:
- ;
+ r = kvm_arch_vm_ioctl(filp, ioctl, arg);
}
out:
return r;
diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
index 1fe209d..4e786f6 100644
--- a/drivers/kvm/x86.c
+++ b/drivers/kvm/x86.c
@@ -21,6 +21,7 @@
#include <linux/kvm.h>
#include <linux/fs.h>
#include <linux/vmalloc.h>
+#include <linux/mman.h>
#include <asm/uaccess.h>
@@ -300,6 +301,420 @@ out:
return r;
}
+/*
+ * Free any memory in @free but not in @dont.
+ */
+static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
+ struct kvm_memory_slot *dont)
+{
+ if (!dont || free->rmap != dont->rmap)
+ vfree(free->rmap);
+
+ if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
+ vfree(free->dirty_bitmap);
+
+ free->npages = 0;
+ free->dirty_bitmap = NULL;
+ free->rmap = NULL;
+}
+
+static void kvm_free_physmem(struct kvm *kvm)
+{
+ int i;
+
+ for (i = 0; i < kvm->nmemslots; ++i)
+ kvm_free_physmem_slot(&kvm->memslots[i], NULL);
+}
+
+/*
+ * Allocate some memory and give it an address in the guest physical address
+ * space.
+ *
+ * Discontiguous memory is allowed, mostly for framebuffers.
+ */
+int kvm_arch_vm_ioctl_set_memory_region(struct kvm *kvm,
+ struct kvm_userspace_memory_region
+ *mem,
+ int user_alloc)
+{
+ int r;
+ gfn_t base_gfn;
+ unsigned long npages;
+ unsigned long i;
+ struct kvm_memory_slot *memslot;
+ struct kvm_memory_slot old, new;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (mem->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (mem->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (mem->slot >= KVM_MEMORY_SLOTS)
+ goto out;
+ if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
+ goto out;
+
+ memslot = &kvm->memslots[mem->slot];
+ base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
+ npages = mem->memory_size >> PAGE_SHIFT;
+
+ if (!npages)
+ mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
+
+ mutex_lock(&kvm->lock);
+
+ new = old = *memslot;
+
+ new.base_gfn = base_gfn;
+ new.npages = npages;
+ new.flags = mem->flags;
+
+ /* Disallow changing a memory slot's size. */
+ r = -EINVAL;
+ if (npages && old.npages && npages != old.npages)
+ goto out_unlock;
+
+ /* Check for overlaps */
+ r = -EEXIST;
+ for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
+ struct kvm_memory_slot *s = &kvm->memslots[i];
+
+ if (s == memslot)
+ continue;
+ if (!((base_gfn + npages <= s->base_gfn) ||
+ (base_gfn >= s->base_gfn + s->npages)))
+ goto out_unlock;
+ }
+
+ /* Free page dirty bitmap if unneeded */
+ if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
+ new.dirty_bitmap = NULL;
+
+ r = -ENOMEM;
+
+ /* Allocate if a slot is being created */
+ if (npages && !new.rmap) {
+ new.rmap = vmalloc(npages * sizeof(struct page *));
+
+ if (!new.rmap)
+ goto out_unlock;
+
+ memset(new.rmap, 0, npages * sizeof(*new.rmap));
+
+ if (user_alloc)
+ new.userspace_addr = mem->userspace_addr;
+ else {
+ down_write(¤t->mm->mmap_sem);
+ new.userspace_addr = do_mmap(NULL, 0,
+ npages * PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS,
+ 0);
+ up_write(¤t->mm->mmap_sem);
+
+ if (IS_ERR((void *)new.userspace_addr))
+ goto out_unlock;
+ }
+ }
+
+ /* Allocate page dirty bitmap if needed */
+ if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
+ unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;
+
+ new.dirty_bitmap = vmalloc(dirty_bytes);
+ if (!new.dirty_bitmap)
+ goto out_unlock;
+ memset(new.dirty_bitmap, 0, dirty_bytes);
+ }
+
+ if (mem->slot >= kvm->nmemslots)
+ kvm->nmemslots = mem->slot + 1;
+
+ if (!kvm->n_requested_mmu_pages) {
+ unsigned int n_pages;
+
+ if (npages) {
+ n_pages = npages * KVM_PERMILLE_MMU_PAGES / 1000;
+ kvm_mmu_change_mmu_pages(kvm, kvm->n_alloc_mmu_pages +
+ n_pages);
+ } else {
+ unsigned int nr_mmu_pages;
+
+ n_pages = old.npages * KVM_PERMILLE_MMU_PAGES / 1000;
+ nr_mmu_pages = kvm->n_alloc_mmu_pages - n_pages;
+ nr_mmu_pages = max(nr_mmu_pages,
+ (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);
+ kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
+ }
+ }
+
+ *memslot = new;
+
+ kvm_mmu_slot_remove_write_access(kvm, mem->slot);
+ kvm_flush_remote_tlbs(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ kvm_free_physmem_slot(&old, &new);
+ return 0;
+
+out_unlock:
+ mutex_unlock(&kvm->lock);
+ kvm_free_physmem_slot(&new, &old);
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
+ u32 kvm_nr_mmu_pages)
+{
+ if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
+ return -EINVAL;
+
+ mutex_lock(&kvm->lock);
+
+ kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
+ kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
+
+ mutex_unlock(&kvm->lock);
+ return 0;
+}
+
+static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
+{
+ return kvm->n_alloc_mmu_pages;
+}
+
+/*
+ * Set a new alias region. Aliases map a portion of physical memory into
+ * another portion. This is useful for memory windows, for example the PC
+ * VGA region.
+ */
+static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
+ struct kvm_memory_alias *alias)
+{
+ int r, n;
+ struct kvm_mem_alias *p;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (alias->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->slot >= KVM_ALIAS_SLOTS)
+ goto out;
+ if (alias->guest_phys_addr + alias->memory_size
+ < alias->guest_phys_addr)
+ goto out;
+ if (alias->target_phys_addr + alias->memory_size
+ < alias->target_phys_addr)
+ goto out;
+
+ mutex_lock(&kvm->lock);
+
+ p = &kvm->aliases[alias->slot];
+ p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
+ p->npages = alias->memory_size >> PAGE_SHIFT;
+ p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
+
+ for (n = KVM_ALIAS_SLOTS; n > 0; --n)
+ if (kvm->aliases[n - 1].npages)
+ break;
+ kvm->naliases = n;
+
+ kvm_mmu_zap_all(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ return 0;
+
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[0],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[1],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(&chip->chip.ioapic,
+ ioapic_irqchip(kvm),
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ return r;
+}
+
+static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&pic_irqchip(kvm)->pics[0],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&pic_irqchip(kvm)->pics[1],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(ioapic_irqchip(kvm),
+ &chip->chip.ioapic,
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ kvm_pic_update_irq(pic_irqchip(kvm));
+ return r;
+}
+
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg)
+{
+ struct kvm *kvm = filp->private_data;
+ void __user *argp = (void __user *)arg;
+ int r = -EINVAL;
+
+ switch (ioctl) {
+ case KVM_SET_MEMORY_REGION: {
+ struct kvm_memory_region kvm_mem;
+ struct kvm_userspace_memory_region kvm_userspace_mem;
+
+ r = -EFAULT;
+ if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
+ goto out;
+ kvm_userspace_mem.slot = kvm_mem.slot;
+ kvm_userspace_mem.flags = kvm_mem.flags;
+ kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
+ kvm_userspace_mem.memory_size = kvm_mem.memory_size;
+ r = kvm_arch_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_SET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
+ if (r)
+ goto out;
+ break;
+ case KVM_GET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
+ break;
+ case KVM_SET_MEMORY_ALIAS: {
+ struct kvm_memory_alias alias;
+
+ r = -EFAULT;
+ if (copy_from_user(&alias, argp, sizeof alias))
+ goto out;
+ r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_CREATE_IRQCHIP:
+ r = -ENOMEM;
+ kvm->vpic = kvm_create_pic(kvm);
+ if (kvm->vpic) {
+ r = kvm_ioapic_init(kvm);
+ if (r) {
+ kfree(kvm->vpic);
+ kvm->vpic = NULL;
+ goto out;
+ }
+ } else
+ goto out;
+ break;
+ case KVM_IRQ_LINE: {
+ struct kvm_irq_level irq_event;
+
+ r = -EFAULT;
+ if (copy_from_user(&irq_event, argp, sizeof irq_event))
+ goto out;
+ if (irqchip_in_kernel(kvm)) {
+ mutex_lock(&kvm->lock);
+ if (irq_event.irq < 16)
+ kvm_pic_set_irq(pic_irqchip(kvm),
+ irq_event.irq,
+ irq_event.level);
+ kvm_ioapic_set_irq(kvm->vioapic,
+ irq_event.irq,
+ irq_event.level);
+ mutex_unlock(&kvm->lock);
+ r = 0;
+ }
+ break;
+ }
+ case KVM_GET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = -EFAULT;
+ if (copy_to_user(argp, &chip, sizeof chip))
+ goto out;
+ r = 0;
+ break;
+ }
+ case KVM_SET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = 0;
+ break;
+ }
+ default:
+ ;
+ }
+out:
+ return r;
+}
+
+void kvm_arch_destroy_vm(struct kvm *kvm)
+{
+
+ kvm_free_physmem(kvm);
+}
+
static __init void kvm_init_msr_list(void)
{
u32 dummy[2];
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply related [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <1193327325.8345.9.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
@ 2007-10-25 15:48 ` Izik Eidus
[not found] ` <1193327326.3284.2.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
2007-10-26 1:05 ` Zhang, Xiantao
2007-10-26 12:01 ` RFC/patch portability: split kvm_vm_ioctl v3 Carsten Otte
2 siblings, 1 reply; 72+ messages in thread
From: Izik Eidus @ 2007-10-25 15:48 UTC (permalink / raw)
To: Carsten Otte
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Hollis Blanchard, Zhang, Xiantao, Avi Kivity
On Thu, 2007-10-25 at 17:48 +0200, Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>
> Common ioctls for all architectures are:
> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
>
> KVM_SET_USER_MEMORY_REGION is actually implemented in x86.c now, because
> the code behind looks arch specific to me.
i think it is much better just to split the parts that allocate the
rmap, and the part that set the number of shadow pages mmu,
beside this parts it seems to me that it isnt arch specific.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <1193327326.3284.2.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
@ 2007-10-25 16:22 ` Hollis Blanchard
2007-10-25 16:42 ` Izik Eidus
2007-10-25 22:12 ` Izik Eidus
0 siblings, 2 replies; 72+ messages in thread
From: Hollis Blanchard @ 2007-10-25 16:22 UTC (permalink / raw)
To: Izik Eidus
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Carsten Otte, kvm-ppc-devel, Avi Kivity, Zhang, Xiantao
On Thu, 2007-10-25 at 17:48 +0200, Izik Eidus wrote:
> On Thu, 2007-10-25 at 17:48 +0200, Carsten Otte wrote:
> > This patch splits kvm_vm_ioctl into archtecture independent parts, and
> > x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
> >
> > Common ioctls for all architectures are:
> > KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
> >
> > KVM_SET_USER_MEMORY_REGION is actually implemented in x86.c now, because
> > the code behind looks arch specific to me.
Reviewed-by: Hollis Blanchard <hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> i think it is much better just to split the parts that allocate the
> rmap, and the part that set the number of shadow pages mmu,
> beside this parts it seems to me that it isnt arch specific.
Carsten omitted the explanation about memslots he had in his original
patch. To quote that here:
> We've got a total different
> address layout on s390: we cannot support multiple slots, and a user
> memory range always equals the guest physical memory [guest_phys + vm
> specific offset = host user address]. We don't have nor need dedicated
> vmas for the guest memory, we just use what the memory managment has
> in stock. This is true, because we reuse the page table for user and
> guest mode.
Given that explanation, and that kvm_vm_ioctl_set_memory_region() is
entirely about memslots, I'm inclined to agree with this code movement.
--
Hollis Blanchard
IBM Linux Technology Center
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
2007-10-25 16:22 ` Hollis Blanchard
@ 2007-10-25 16:42 ` Izik Eidus
2007-10-25 22:12 ` Izik Eidus
1 sibling, 0 replies; 72+ messages in thread
From: Izik Eidus @ 2007-10-25 16:42 UTC (permalink / raw)
To: Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Carsten Otte, kvm-ppc-devel, Avi Kivity, Zhang, Xiantao
On Thu, 2007-10-25 at 11:22 -0500, Hollis Blanchard wrote:
> On Thu, 2007-10-25 at 17:48 +0200, Izik Eidus wrote:
> > On Thu, 2007-10-25 at 17:48 +0200, Carsten Otte wrote:
> > > This patch splits kvm_vm_ioctl into archtecture independent parts, and
> > > x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
> > >
> > > Common ioctls for all architectures are:
> > > KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
> > >
> > > KVM_SET_USER_MEMORY_REGION is actually implemented in x86.c now, because
> > > the code behind looks arch specific to me.
>
> Reviewed-by: Hollis Blanchard <hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
>
> > i think it is much better just to split the parts that allocate the
> > rmap, and the part that set the number of shadow pages mmu,
> > beside this parts it seems to me that it isnt arch specific.
>
> Carsten omitted the explanation about memslots he had in his original
> patch. To quote that here:
> > We've got a total different
> > address layout on s390: we cannot support multiple slots, and a user
> > memory range always equals the guest physical memory [guest_phys + vm
> > specific offset = host user address]. We don't have nor need dedicated
> > vmas for the guest memory, we just use what the memory managment has
> > in stock. This is true, because we reuse the page table for user and
> > guest mode.
>
> Given that explanation, and that kvm_vm_ioctl_set_memory_region() is
> entirely about memslots, I'm inclined to agree with this code movement.
>
after reading this, i agree.
sorry.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <472114B6.6080000-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-25 20:51 ` Hollis Blanchard
2007-10-25 22:58 ` Izik Eidus
2007-10-26 8:12 ` Avi Kivity
2007-10-26 8:28 ` Carsten Otte
1 sibling, 2 replies; 72+ messages in thread
From: Hollis Blanchard @ 2007-10-25 20:51 UTC (permalink / raw)
To: Izik Eidus
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Carsten Otte, kvm-ppc-devel, Zhang, Xiantao
On Fri, 2007-10-26 at 00:12 +0200, Izik Eidus wrote:
> ok i was thinking,
> maybe we can rewrite the way kvm hold memory so more code would be shared,
> lets say we throw away all the slots and arch depended stuff, and we let kvm
> just hold the userspace allocated memory address,
With that approach, how would you create a sparse (guest physical)
memory map in userspace? I guess you would need to use repeated
mmap(MAP_FIXED), and that's starting to look very brittle.
--
Hollis Blanchard
IBM Linux Technology Center
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
2007-10-25 16:22 ` Hollis Blanchard
2007-10-25 16:42 ` Izik Eidus
@ 2007-10-25 22:12 ` Izik Eidus
[not found] ` <472114B6.6080000-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Izik Eidus @ 2007-10-25 22:12 UTC (permalink / raw)
To: Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Carsten Otte, kvm-ppc-devel, Avi Kivity, Zhang, Xiantao
Hollis Blanchard wrote:
> On Thu, 2007-10-25 at 17:48 +0200, Izik Eidus wrote:
>
>> On Thu, 2007-10-25 at 17:48 +0200, Carsten Otte wrote:
>>
>>> This patch splits kvm_vm_ioctl into archtecture independent parts, and
>>> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>>>
>>> Common ioctls for all architectures are:
>>> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
>>>
>>> KVM_SET_USER_MEMORY_REGION is actually implemented in x86.c now, because
>>> the code behind looks arch specific to me.
>>>
>
> Reviewed-by: Hollis Blanchard <hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
>
>
>> i think it is much better just to split the parts that allocate the
>> rmap, and the part that set the number of shadow pages mmu,
>> beside this parts it seems to me that it isnt arch specific.
>>
>
> Carsten omitted the explanation about memslots he had in his original
> patch. To quote that here:
>
>> We've got a total different
>> address layout on s390: we cannot support multiple slots, and a user
>> memory range always equals the guest physical memory [guest_phys + vm
>> specific offset = host user address]. We don't have nor need dedicated
>> vmas for the guest memory, we just use what the memory managment has
>> in stock. This is true, because we reuse the page table for user and
>> guest mode.
>>
>
> Given that explanation, and that kvm_vm_ioctl_set_memory_region() is
> entirely about memslots, I'm inclined to agree with this code movement.
>
>
ok i was thinking,
maybe we can rewrite the way kvm hold memory so more code would be shared,
lets say we throw away all the slots and arch depended stuff, and we let kvm
just hold the userspace allocated memory address,
then we will will have to each arch "arch specific" functions that will
map the memory as it will need.
for example for x86 we will make gfn_to_page map on the fly how the
memory should look.
i think i will write patch to example this, but it might take me some time,
anyway what do you think about this idea?
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
2007-10-25 20:51 ` [kvm-ppc-devel] " Hollis Blanchard
@ 2007-10-25 22:58 ` Izik Eidus
[not found] ` <47211F86.1030504-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 8:12 ` Avi Kivity
1 sibling, 1 reply; 72+ messages in thread
From: Izik Eidus @ 2007-10-25 22:58 UTC (permalink / raw)
To: Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Carsten Otte, kvm-ppc-devel, Zhang, Xiantao
Hollis Blanchard wrote:
> On Fri, 2007-10-26 at 00:12 +0200, Izik Eidus wrote:
>
>> ok i was thinking,
>> maybe we can rewrite the way kvm hold memory so more code would be shared,
>> lets say we throw away all the slots and arch depended stuff, and we let kvm
>> just hold the userspace allocated memory address,
>>
>
> With that approach, how would you create a sparse (guest physical)
> memory map in userspace? I guess you would need to use repeated
> mmap(MAP_FIXED), and that's starting to look very brittle.
>
>
i would just allocate one single block of memory to kvm,
and then i will use ioctls to tell kvm how to map it.
after this the kernel will map back to the userspace the memory by the
mmap system call,
this would be infact the same mechanisem that would be used by gfn_to_page
(infact the mmap syscall will call gfn_to_page)
so accessing memory from the userspace would skip "holes"....
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <47211F86.1030504-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 0:19 ` Izik Eidus
[not found] ` <472132A4.604-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Izik Eidus @ 2007-10-26 0:19 UTC (permalink / raw)
To: Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Carsten Otte, kvm-ppc-devel, Zhang, Xiantao
Izik Eidus wrote:
> Hollis Blanchard wrote:
>> On Fri, 2007-10-26 at 00:12 +0200, Izik Eidus wrote:
>>
>>> ok i was thinking,
>>> maybe we can rewrite the way kvm hold memory so more code would be
>>> shared,
>>> lets say we throw away all the slots and arch depended stuff, and we
>>> let kvm
>>> just hold the userspace allocated memory address,
>>>
>>
>> With that approach, how would you create a sparse (guest physical)
>> memory map in userspace? I guess you would need to use repeated
>> mmap(MAP_FIXED), and that's starting to look very brittle.
>>
>>
btw, if you look at kvmctl, we already do it,
so it is good question if it better to leave this work to userspace
(like it do now)
or do the mapping to userspace from the kernel to userspace (using the
mmap syscall)
(i like the secoend option beacuse it would be easier to work with qemu
like this)
> i would just allocate one single block of memory to kvm,
> and then i will use ioctls to tell kvm how to map it.
>
> after this the kernel will map back to the userspace the memory by the
> mmap system call,
> this would be infact the same mechanisem that would be used by
> gfn_to_page
> (infact the mmap syscall will call gfn_to_page)
>
> so accessing memory from the userspace would skip "holes"....
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <1193327325.8345.9.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-25 15:48 ` Izik Eidus
@ 2007-10-26 1:05 ` Zhang, Xiantao
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC85FD78-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-26 12:01 ` RFC/patch portability: split kvm_vm_ioctl v3 Carsten Otte
2 siblings, 1 reply; 72+ messages in thread
From: Zhang, Xiantao @ 2007-10-26 1:05 UTC (permalink / raw)
To: Carsten Otte, Avi Kivity, Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>
> Common ioctls for all architectures are:
> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
>
> KVM_SET_USER_MEMORY_REGION is actually implemented in x86.c now,
Hi Carsten,
I don't think we can move the whole function to arch-specific part,
because it should work well (or with few issues) for most archs.
Basically, IA64 mostly can use it directly. If we move them as
arch-specific, it will introduces many duplicates. As you said, S390 has
quite difference about this side, but I think maybe we can use macros,
such as #ifndef CONFIG_S390 to comment out them, and S390 define it in
your arch-specific portions. Any other good ideas ?
Thanks
Xiantao
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
2007-10-25 20:51 ` [kvm-ppc-devel] " Hollis Blanchard
2007-10-25 22:58 ` Izik Eidus
@ 2007-10-26 8:12 ` Avi Kivity
[not found] ` <4721A185.1070808-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 8:12 UTC (permalink / raw)
To: Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Carsten Otte
Hollis Blanchard wrote:
> On Fri, 2007-10-26 at 00:12 +0200, Izik Eidus wrote:
>
>> ok i was thinking,
>> maybe we can rewrite the way kvm hold memory so more code would be shared,
>> lets say we throw away all the slots and arch depended stuff, and we let kvm
>> just hold the userspace allocated memory address,
>>
>
> With that approach, how would you create a sparse (guest physical)
> memory map in userspace? I guess you would need to use repeated
> mmap(MAP_FIXED), and that's starting to look very brittle.
>
>
It can't work on i386 due to the limited host virtual address space.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <472132A4.604-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 8:17 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 8:17 UTC (permalink / raw)
To: Izik Eidus
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Hollis Blanchard
Izik Eidus wrote:
> btw, if you look at kvmctl, we already do it,
> so it is good question if it better to leave this work to userspace
> (like it do now)
> or do the mapping to userspace from the kernel to userspace (using the
> mmap syscall)
>
> (i like the secoend option beacuse it would be easier to work with qemu
> like this)
I think we should leave it to userland. This was userland is free to
use whatever it wants:
- malloc() to get anonymous memory
- mmap() to get file backed memory
- posix or sysv shared memory
- hugetlbfs to save translation steps
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721A185.1070808-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 8:21 ` Carsten Otte
[not found] ` <4721A3A3.8020504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 8:21 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Hollis Blanchard
Avi Kivity wrote:
> Hollis Blanchard wrote:
>> On Fri, 2007-10-26 at 00:12 +0200, Izik Eidus wrote:
>>
>>> ok i was thinking,
>>> maybe we can rewrite the way kvm hold memory so more code would be shared,
>>> lets say we throw away all the slots and arch depended stuff, and we let kvm
>>> just hold the userspace allocated memory address,
>>>
>> With that approach, how would you create a sparse (guest physical)
>> memory map in userspace? I guess you would need to use repeated
>> mmap(MAP_FIXED), and that's starting to look very brittle.
>>
>>
>
> It can't work on i386 due to the limited host virtual address space.
That's why memory allocation/preparation needs to be arch dependent:
i386 needs a memory layout different from userspace page table due to
your argument, and s390 needs to use the userspace page table due to
hardware features we want to exploit.
As Xiantao pointed out, x86 and ia64 can share the same memory setup
code. But s390 and ppc don't. Therefore, I vote for putting it into
x86 for now, and come up with an approach to share between x86 and
ia64 later on.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <472114B6.6080000-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-25 20:51 ` [kvm-ppc-devel] " Hollis Blanchard
@ 2007-10-26 8:28 ` Carsten Otte
1 sibling, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 8:28 UTC (permalink / raw)
To: Izik Eidus
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Avi Kivity, Hollis Blanchard
Izik Eidus wrote:
> ok i was thinking,
> maybe we can rewrite the way kvm hold memory so more code would be shared,
> lets say we throw away all the slots and arch depended stuff, and we let kvm
> just hold the userspace allocated memory address,
>
> then we will will have to each arch "arch specific" functions that will
> map the memory as it will need.
> for example for x86 we will make gfn_to_page map on the fly how the
> memory should look.
> i think i will write patch to example this, but it might take me some time,
>
> anyway what do you think about this idea?
I do strongly vote for it. This way, we'd have memory handling common
over all architectures. For a sane end result of a real portably
hypervisor, this is very preferable over "have every arch to its own
thing". After reading your suggestion, I think memory allocation needs
more engineering work to be done until we find a proper arch split
then just move it to x86.c. Therefore, I'll modify the patch to leave
memory handling in common for now. This way, the rest of the patch can
be picked up for the time being.
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721A3A3.8020504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 8:41 ` Carsten Otte
[not found] ` <4721A82A.2040402-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 9:08 ` Avi Kivity
2007-10-26 14:35 ` Hollis Blanchard
2 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 8:41 UTC (permalink / raw)
To: carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Avi Kivity, Hollis Blanchard
Carsten Otte wrote:
> That's why memory allocation/preparation needs to be arch dependent:
> i386 needs a memory layout different from userspace page table due to
> your argument, and s390 needs to use the userspace page table due to
> hardware features we want to exploit.
> As Xiantao pointed out, x86 and ia64 can share the same memory setup
> code. But s390 and ppc don't. Therefore, I vote for putting it into
> x86 for now, and come up with an approach to share between x86 and
> ia64 later on.
After reading Izik's idea: Maybe we should go Izik's way, and have an
i386 special case that we can deprecate later on?
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721A3A3.8020504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 8:41 ` Carsten Otte
@ 2007-10-26 9:08 ` Avi Kivity
2007-10-26 14:35 ` Hollis Blanchard
2 siblings, 0 replies; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 9:08 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Hollis Blanchard, Zhang, Xiantao
Carsten Otte wrote:
> Avi Kivity wrote:
>
>> Hollis Blanchard wrote:
>>
>>> On Fri, 2007-10-26 at 00:12 +0200, Izik Eidus wrote:
>>>
>>>
>>>> ok i was thinking,
>>>> maybe we can rewrite the way kvm hold memory so more code would be shared,
>>>> lets say we throw away all the slots and arch depended stuff, and we let kvm
>>>> just hold the userspace allocated memory address,
>>>>
>>>>
>>> With that approach, how would you create a sparse (guest physical)
>>> memory map in userspace? I guess you would need to use repeated
>>> mmap(MAP_FIXED), and that's starting to look very brittle.
>>>
>>>
>>>
>> It can't work on i386 due to the limited host virtual address space.
>>
> That's why memory allocation/preparation needs to be arch dependent:
> i386 needs a memory layout different from userspace page table due to
> your argument, and s390 needs to use the userspace page table due to
> hardware features we want to exploit.
> As Xiantao pointed out, x86 and ia64 can share the same memory setup
> code. But s390 and ppc don't. Therefore, I vote for putting it into
> x86 for now, and come up with an approach to share between x86 and
> ia64 later on.
>
But can't s390 and ppc use a subset? If you limit the number of memory
slots to one, it's equivalent to base + limit.
No?
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721A82A.2040402-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 9:22 ` Avi Kivity
[not found] ` <4721B1ED.6040006-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 9:22 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, Zhang, Xiantao
Carsten Otte wrote:
> Carsten Otte wrote:
>
>> That's why memory allocation/preparation needs to be arch dependent:
>> i386 needs a memory layout different from userspace page table due to
>> your argument, and s390 needs to use the userspace page table due to
>> hardware features we want to exploit.
>> As Xiantao pointed out, x86 and ia64 can share the same memory setup
>> code. But s390 and ppc don't. Therefore, I vote for putting it into
>> x86 for now, and come up with an approach to share between x86 and
>> ia64 later on.
>>
> After reading Izik's idea: Maybe we should go Izik's way, and have an
> i386 special case that we can deprecate later on?
>
>
I don't really see a big difference between what we have now (sparse
userspace, sparse guest) and Izik's idea (contiguous userspace, sparse
guest). In both cases you need something like memory slots to describe
the different sections.
Moreover, on x86 you may want different properties for different
sections (4K pages for the framebuffer, large pages for main memory), so
you can't allocate memory in one big chunk.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721B1ED.6040006-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 10:30 ` Carsten Otte
[not found] ` <4721C1DB.3040207-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 10:30 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Zhang, Xiantao
Avi Kivity wrote:
> I don't really see a big difference between what we have now (sparse
> userspace, sparse guest) and Izik's idea (contiguous userspace, sparse
> guest). In both cases you need something like memory slots to describe
> the different sections.
We don't on s390: we receive a page fault by the guest once it
accesses a sparse hole in its address space. We check the user space's
VMA and either page it in or submit an addressing exception to the guest.
> Moreover, on x86 you may want different properties for different
> sections (4K pages for the framebuffer, large pages for main memory), so
> you can't allocate memory in one big chunk.
That's right. On s390, we can live with whatever properties a section
has with regard to page size, backing device and such. So memory may
well come to live by different alloations, and different allocation
methods. All we need is a permanent contiguous mapping of the guest
physical addresses to host user addresses. So Izik's idea would work
for us even if we have different sections.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721C1DB.3040207-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 10:36 ` Avi Kivity
[not found] ` <4721C330.3030302-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 10:36 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, Zhang, Xiantao
Carsten Otte wrote:
> Avi Kivity wrote:
>> I don't really see a big difference between what we have now (sparse
>> userspace, sparse guest) and Izik's idea (contiguous userspace,
>> sparse guest). In both cases you need something like memory slots to
>> describe the different sections.
> We don't on s390: we receive a page fault by the guest once it
> accesses a sparse hole in its address space. We check the user space's
> VMA and either page it in or submit an addressing exception to the guest.
I was talking about x86.
On x86, you need contiguous userspace, contiguous guest, but again,
what's the problem with one memory slot?
>
>> Moreover, on x86 you may want different properties for different
>> sections (4K pages for the framebuffer, large pages for main memory),
>> so you can't allocate memory in one big chunk.
> That's right. On s390, we can live with whatever properties a section
> has with regard to page size, backing device and such. So memory may
> well come to live by different alloations, and different allocation
> methods. All we need is a permanent contiguous mapping of the guest
> physical addresses to host user addresses. So Izik's idea would work
> for us even if we have different sections.
So would the current memory slot thing, no?
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721C330.3030302-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 10:42 ` Carsten Otte
[not found] ` <4721C47E.30800-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 10:42 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Zhang, Xiantao
Avi Kivity wrote:
> I was talking about x86.
>
> On x86, you need contiguous userspace, contiguous guest, but again,
> what's the problem with one memory slot?
There is no problem with one memory slot: it works. It's just that
Izik's idea gives us the opportunity to have common code for all four
architectures here.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721C47E.30800-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 10:45 ` Avi Kivity
[not found] ` <4721C53E.1070507-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 10:45 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, Zhang, Xiantao
Carsten Otte wrote:
> Avi Kivity wrote:
>> I was talking about x86.
>>
>> On x86, you need contiguous userspace, contiguous guest, but again,
>> what's the problem with one memory slot?
> There is no problem with one memory slot: it works. It's just that
> Izik's idea gives us the opportunity to have common code for all four
> architectures here.
Why aren't memory slots common too? Only their number is different,
while the implementation is the same.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721C53E.1070507-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 11:45 ` Carsten Otte
[not found] ` <4721D344.2020508-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 11:45 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Zhang, Xiantao
Avi Kivity wrote:
> Why aren't memory slots common too? Only their number is different,
> while the implementation is the same.
Your approach makes the meaning of memory slot somewhat useless on
s390, if that one may be sparse and may be result of different
allocations: On x86, there has to be one memory slot per allocation,
versus on s390 there has to be exactly one memory slot with multiple
allocations behind.
For userspace that means, with your approach it has to do total
different memory setup for different archs _if_ it wants to use
multiple allocations and/or sparse:
- on x86 it does allocations to random userspace address, and
registers each of them as memory slot
- on s390 it does allocations to a specific address layout similar to
the guest, and registers only one memory slot for the whole thing
With Izik's approach however, this is transparent to userspace: it has
multiple memory slots, one per allocation. Regardless of the CPU
architecture.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721D344.2020508-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 11:47 ` Avi Kivity
[not found] ` <4721D3C2.8090407-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 11:47 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, Zhang, Xiantao
Carsten Otte wrote:
> Avi Kivity wrote:
>> Why aren't memory slots common too? Only their number is different,
>> while the implementation is the same.
> Your approach makes the meaning of memory slot somewhat useless on
> s390, if that one may be sparse and may be result of different
> allocations: On x86, there has to be one memory slot per allocation,
> versus on s390 there has to be exactly one memory slot with multiple
> allocations behind.
No, a memory slot can span multiple backing stores. But it must be
contiguous in both the host userspace and guest physical address spaces.
>
> For userspace that means, with your approach it has to do total
> different memory setup for different archs _if_ it wants to use
> multiple allocations and/or sparse:
> - on x86 it does allocations to random userspace address, and
> registers each of them as memory slot
> - on s390 it does allocations to a specific address layout similar to
> the guest, and registers only one memory slot for the whole thing
>
> With Izik's approach however, this is transparent to userspace: it has
> multiple memory slots, one per allocation. Regardless of the CPU
> architecture.
You can do this with the current memory slots as well. Although I'm
feeling that I misunderstood Izik's idea. I'll go talk to him.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <1193327325.8345.9.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-25 15:48 ` Izik Eidus
2007-10-26 1:05 ` Zhang, Xiantao
@ 2007-10-26 12:01 ` Carsten Otte
[not found] ` <1193400099.10970.8.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 12:01 UTC (permalink / raw)
To: Avi Kivity, Zhang, Xiantao, Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
This patch splits kvm_vm_ioctl into archtecture independent parts, and
x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
The patch has been updated to current git, and it leaves out memory slot
registration work which is currently subject to a detailed discussion.
Common ioctls for all architectures are:
KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
KVM_SET_USER_MEMORY_REGION implementation is no longer moved to x86.c.
It seems to me that more fine-grained refinement then just moving the
code is required here.
x86 specific ioctls are:
KVM_SET_MEMORY_REGION,
KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
KVM_SET_TSS_ADDR
KVM_SET_TSS_ADDR has been added to the list of x86 specifics, as Izik's
commit states it is used for emulating real mode on intel.
kvm.h | 7 +
kvm_main.c | 255
+-----------------------------------------------------------
x86.c | 258
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 271 insertions(+), 249 deletions(-)
Signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
---
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index b08fc9e..438d4a9 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -621,6 +621,13 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg);
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
+int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
+ struct
+ kvm_userspace_memory_region *mem,
+ int user_alloc);
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg);
+void kvm_arch_destroy_vm(struct kvm *kvm);
__init void kvm_arch_init(void);
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 9a3d663..7a85be9 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -792,36 +792,16 @@ out:
}
EXPORT_SYMBOL_GPL(kvm_set_memory_region);
-static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
- struct
- kvm_userspace_memory_region *mem,
- int user_alloc)
+int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
+ struct
+ kvm_userspace_memory_region *mem,
+ int user_alloc)
{
if (mem->slot >= KVM_MEMORY_SLOTS)
return -EINVAL;
return kvm_set_memory_region(kvm, mem, user_alloc);
}
-static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
- u32 kvm_nr_mmu_pages)
-{
- if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
- return -EINVAL;
-
- mutex_lock(&kvm->lock);
-
- kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
- kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
-
- mutex_unlock(&kvm->lock);
- return 0;
-}
-
-static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
-{
- return kvm->n_alloc_mmu_pages;
-}
-
/*
* Get (and clear) the dirty memory log for a memory slot.
*/
@@ -867,111 +847,6 @@ out:
return r;
}
-/*
- * Set a new alias region. Aliases map a portion of physical memory into
- * another portion. This is useful for memory windows, for example the PC
- * VGA region.
- */
-static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
- struct kvm_memory_alias *alias)
-{
- int r, n;
- struct kvm_mem_alias *p;
-
- r = -EINVAL;
- /* General sanity checks */
- if (alias->memory_size & (PAGE_SIZE - 1))
- goto out;
- if (alias->guest_phys_addr & (PAGE_SIZE - 1))
- goto out;
- if (alias->slot >= KVM_ALIAS_SLOTS)
- goto out;
- if (alias->guest_phys_addr + alias->memory_size
- < alias->guest_phys_addr)
- goto out;
- if (alias->target_phys_addr + alias->memory_size
- < alias->target_phys_addr)
- goto out;
-
- mutex_lock(&kvm->lock);
-
- p = &kvm->aliases[alias->slot];
- p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
- p->npages = alias->memory_size >> PAGE_SHIFT;
- p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
-
- for (n = KVM_ALIAS_SLOTS; n > 0; --n)
- if (kvm->aliases[n - 1].npages)
- break;
- kvm->naliases = n;
-
- kvm_mmu_zap_all(kvm);
-
- mutex_unlock(&kvm->lock);
-
- return 0;
-
-out:
- return r;
-}
-
-static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[0],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&chip->chip.pic,
- &pic_irqchip(kvm)->pics[1],
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(&chip->chip.ioapic,
- ioapic_irqchip(kvm),
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- return r;
-}
-
-static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
- int r;
-
- r = 0;
- switch (chip->chip_id) {
- case KVM_IRQCHIP_PIC_MASTER:
- memcpy(&pic_irqchip(kvm)->pics[0],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_PIC_SLAVE:
- memcpy(&pic_irqchip(kvm)->pics[1],
- &chip->chip.pic,
- sizeof(struct kvm_pic_state));
- break;
- case KVM_IRQCHIP_IOAPIC:
- memcpy(ioapic_irqchip(kvm),
- &chip->chip.ioapic,
- sizeof(struct kvm_ioapic_state));
- break;
- default:
- r = -EINVAL;
- break;
- }
- kvm_pic_update_irq(pic_irqchip(kvm));
- return r;
-}
-
int is_error_page(struct page *page)
{
return page == bad_page;
@@ -2669,16 +2544,6 @@ static int create_vcpu_fd(struct kvm_vcpu *vcpu)
return fd;
}
-static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
-{
- int ret;
-
- if (addr > (unsigned int)(-3 * PAGE_SIZE))
- return -1;
- ret = kvm_x86_ops->set_tss_addr(kvm, addr);
- return ret;
-}
-
/*
* Creates some virtual cpus. Good luck creating more than one.
*/
@@ -2972,35 +2837,14 @@ static long kvm_vm_ioctl(struct file *filp,
{
struct kvm *kvm = filp->private_data;
void __user *argp = (void __user *)arg;
- int r = -EINVAL;
+ int r;
switch (ioctl) {
- case KVM_SET_TSS_ADDR:
- r = kvm_vm_ioctl_set_tss_addr(kvm, arg);
- if (r < 0)
- goto out;
- break;
case KVM_CREATE_VCPU:
r = kvm_vm_ioctl_create_vcpu(kvm, arg);
if (r < 0)
goto out;
break;
- case KVM_SET_MEMORY_REGION: {
- struct kvm_memory_region kvm_mem;
- struct kvm_userspace_memory_region kvm_userspace_mem;
-
- r = -EFAULT;
- if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
- goto out;
- kvm_userspace_mem.slot = kvm_mem.slot;
- kvm_userspace_mem.flags = kvm_mem.flags;
- kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
- kvm_userspace_mem.memory_size = kvm_mem.memory_size;
- r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
- if (r)
- goto out;
- break;
- }
case KVM_SET_USER_MEMORY_REGION: {
struct kvm_userspace_memory_region kvm_userspace_mem;
@@ -3014,14 +2858,6 @@ static long kvm_vm_ioctl(struct file *filp,
goto out;
break;
}
- case KVM_SET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
- if (r)
- goto out;
- break;
- case KVM_GET_NR_MMU_PAGES:
- r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
- break;
case KVM_GET_DIRTY_LOG: {
struct kvm_dirty_log log;
@@ -3033,87 +2869,8 @@ static long kvm_vm_ioctl(struct file *filp,
goto out;
break;
}
- case KVM_SET_MEMORY_ALIAS: {
- struct kvm_memory_alias alias;
-
- r = -EFAULT;
- if (copy_from_user(&alias, argp, sizeof alias))
- goto out;
- r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
- if (r)
- goto out;
- break;
- }
- case KVM_CREATE_IRQCHIP:
- r = -ENOMEM;
- kvm->vpic = kvm_create_pic(kvm);
- if (kvm->vpic) {
- r = kvm_ioapic_init(kvm);
- if (r) {
- kfree(kvm->vpic);
- kvm->vpic = NULL;
- goto out;
- }
- } else
- goto out;
- break;
- case KVM_IRQ_LINE: {
- struct kvm_irq_level irq_event;
-
- r = -EFAULT;
- if (copy_from_user(&irq_event, argp, sizeof irq_event))
- goto out;
- if (irqchip_in_kernel(kvm)) {
- mutex_lock(&kvm->lock);
- if (irq_event.irq < 16)
- kvm_pic_set_irq(pic_irqchip(kvm),
- irq_event.irq,
- irq_event.level);
- kvm_ioapic_set_irq(kvm->vioapic,
- irq_event.irq,
- irq_event.level);
- mutex_unlock(&kvm->lock);
- r = 0;
- }
- break;
- }
- case KVM_GET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = -EFAULT;
- if (copy_to_user(argp, &chip, sizeof chip))
- goto out;
- r = 0;
- break;
- }
- case KVM_SET_IRQCHIP: {
- /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- struct kvm_irqchip chip;
-
- r = -EFAULT;
- if (copy_from_user(&chip, argp, sizeof chip))
- goto out;
- r = -ENXIO;
- if (!irqchip_in_kernel(kvm))
- goto out;
- r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
- if (r)
- goto out;
- r = 0;
- break;
- }
default:
- ;
+ r = kvm_arch_vm_ioctl(filp, ioctl, arg);
}
out:
return r;
diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
index 1fe209d..b84cb67 100644
--- a/drivers/kvm/x86.c
+++ b/drivers/kvm/x86.c
@@ -300,6 +300,264 @@ out:
return r;
}
+static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
+{
+ int ret;
+
+ if (addr > (unsigned int)(-3 * PAGE_SIZE))
+ return -1;
+ ret = kvm_x86_ops->set_tss_addr(kvm, addr);
+ return ret;
+}
+
+static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
+ u32 kvm_nr_mmu_pages)
+{
+ if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
+ return -EINVAL;
+
+ mutex_lock(&kvm->lock);
+
+ kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
+ kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
+
+ mutex_unlock(&kvm->lock);
+ return 0;
+}
+
+static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
+{
+ return kvm->n_alloc_mmu_pages;
+}
+
+/*
+ * Set a new alias region. Aliases map a portion of physical memory into
+ * another portion. This is useful for memory windows, for example the PC
+ * VGA region.
+ */
+static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
+ struct kvm_memory_alias *alias)
+{
+ int r, n;
+ struct kvm_mem_alias *p;
+
+ r = -EINVAL;
+ /* General sanity checks */
+ if (alias->memory_size & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->guest_phys_addr & (PAGE_SIZE - 1))
+ goto out;
+ if (alias->slot >= KVM_ALIAS_SLOTS)
+ goto out;
+ if (alias->guest_phys_addr + alias->memory_size
+ < alias->guest_phys_addr)
+ goto out;
+ if (alias->target_phys_addr + alias->memory_size
+ < alias->target_phys_addr)
+ goto out;
+
+ mutex_lock(&kvm->lock);
+
+ p = &kvm->aliases[alias->slot];
+ p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
+ p->npages = alias->memory_size >> PAGE_SHIFT;
+ p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
+
+ for (n = KVM_ALIAS_SLOTS; n > 0; --n)
+ if (kvm->aliases[n - 1].npages)
+ break;
+ kvm->naliases = n;
+
+ kvm_mmu_zap_all(kvm);
+
+ mutex_unlock(&kvm->lock);
+
+ return 0;
+
+out:
+ return r;
+}
+
+static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[0],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&chip->chip.pic,
+ &pic_irqchip(kvm)->pics[1],
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(&chip->chip.ioapic,
+ ioapic_irqchip(kvm),
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ return r;
+}
+
+static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+ int r;
+
+ r = 0;
+ switch (chip->chip_id) {
+ case KVM_IRQCHIP_PIC_MASTER:
+ memcpy(&pic_irqchip(kvm)->pics[0],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_PIC_SLAVE:
+ memcpy(&pic_irqchip(kvm)->pics[1],
+ &chip->chip.pic,
+ sizeof(struct kvm_pic_state));
+ break;
+ case KVM_IRQCHIP_IOAPIC:
+ memcpy(ioapic_irqchip(kvm),
+ &chip->chip.ioapic,
+ sizeof(struct kvm_ioapic_state));
+ break;
+ default:
+ r = -EINVAL;
+ break;
+ }
+ kvm_pic_update_irq(pic_irqchip(kvm));
+ return r;
+}
+
+long kvm_arch_vm_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg)
+{
+ struct kvm *kvm = filp->private_data;
+ void __user *argp = (void __user *)arg;
+ int r = -EINVAL;
+
+ switch (ioctl) {
+ case KVM_SET_TSS_ADDR:
+ r = kvm_vm_ioctl_set_tss_addr(kvm, arg);
+ if (r < 0)
+ goto out;
+ break;
+ case KVM_SET_MEMORY_REGION: {
+ struct kvm_memory_region kvm_mem;
+ struct kvm_userspace_memory_region kvm_userspace_mem;
+
+ r = -EFAULT;
+ if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
+ goto out;
+ kvm_userspace_mem.slot = kvm_mem.slot;
+ kvm_userspace_mem.flags = kvm_mem.flags;
+ kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
+ kvm_userspace_mem.memory_size = kvm_mem.memory_size;
+ r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_SET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
+ if (r)
+ goto out;
+ break;
+ case KVM_GET_NR_MMU_PAGES:
+ r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
+ break;
+ case KVM_SET_MEMORY_ALIAS: {
+ struct kvm_memory_alias alias;
+
+ r = -EFAULT;
+ if (copy_from_user(&alias, argp, sizeof alias))
+ goto out;
+ r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
+ if (r)
+ goto out;
+ break;
+ }
+ case KVM_CREATE_IRQCHIP:
+ r = -ENOMEM;
+ kvm->vpic = kvm_create_pic(kvm);
+ if (kvm->vpic) {
+ r = kvm_ioapic_init(kvm);
+ if (r) {
+ kfree(kvm->vpic);
+ kvm->vpic = NULL;
+ goto out;
+ }
+ } else
+ goto out;
+ break;
+ case KVM_IRQ_LINE: {
+ struct kvm_irq_level irq_event;
+
+ r = -EFAULT;
+ if (copy_from_user(&irq_event, argp, sizeof irq_event))
+ goto out;
+ if (irqchip_in_kernel(kvm)) {
+ mutex_lock(&kvm->lock);
+ if (irq_event.irq < 16)
+ kvm_pic_set_irq(pic_irqchip(kvm),
+ irq_event.irq,
+ irq_event.level);
+ kvm_ioapic_set_irq(kvm->vioapic,
+ irq_event.irq,
+ irq_event.level);
+ mutex_unlock(&kvm->lock);
+ r = 0;
+ }
+ break;
+ }
+ case KVM_GET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = -EFAULT;
+ if (copy_to_user(argp, &chip, sizeof chip))
+ goto out;
+ r = 0;
+ break;
+ }
+ case KVM_SET_IRQCHIP: {
+ /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+ struct kvm_irqchip chip;
+
+ r = -EFAULT;
+ if (copy_from_user(&chip, argp, sizeof chip))
+ goto out;
+ r = -ENXIO;
+ if (!irqchip_in_kernel(kvm))
+ goto out;
+ r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
+ if (r)
+ goto out;
+ r = 0;
+ break;
+ }
+ default:
+ ;
+ }
+out:
+ return r;
+}
+
static __init void kvm_init_msr_list(void)
{
u32 dummy[2];
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply related [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721D3C2.8090407-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-26 12:23 ` Carsten Otte
[not found] ` <4721DC5D.702-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 12:23 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Zhang, Xiantao, Hollis Blanchard
Avi Kivity wrote:
> Carsten Otte wrote:
>> Avi Kivity wrote:
>>> Why aren't memory slots common too? Only their number is different,
>>> while the implementation is the same.
>> Your approach makes the meaning of memory slot somewhat useless on
>> s390, if that one may be sparse and may be result of different
>> allocations: On x86, there has to be one memory slot per allocation,
>> versus on s390 there has to be exactly one memory slot with multiple
>> allocations behind.
>
> No, a memory slot can span multiple backing stores. But it must be
> contiguous in both the host userspace and guest physical address spaces.
I was not preceise enough: I meant to state that x86 demands one
memory slot per contiguous allocation. But with your "s390 has only
one memory slot" idea, this introduces a severe restriction for us:
our "single memory slot" does not need to be contiguous, neither in
guest physical nor in host userspace. All we need, is a certain
1:1+offset relationship between guest physical and host user. Page
size, backing, sparse are all variable.
Izik's idea, at least how I understood him, makes the best of both
worlds: we keep above addressing relationship intact, and have
multiple memory slots for all architectures.
>> For userspace that means, with your approach it has to do total
>> different memory setup for different archs _if_ it wants to use
>> multiple allocations and/or sparse:
>> - on x86 it does allocations to random userspace address, and
>> registers each of them as memory slot
>> - on s390 it does allocations to a specific address layout similar to
>> the guest, and registers only one memory slot for the whole thing
>>
>> With Izik's approach however, this is transparent to userspace: it has
>> multiple memory slots, one per allocation. Regardless of the CPU
>> architecture.
>
> You can do this with the current memory slots as well. Although I'm
> feeling that I misunderstood Izik's idea. I'll go talk to him.
No we can't: because current memory slots don't have a permanent
relationship between user and guest physical addresses that we do need
on s390. We cannot guarantee that over multiple slots, and we cannot
keep the guest from addressing memory around the memory slots unless
we refuse to use more than only one slot which has to start at guest
physical zero.
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721DC5D.702-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 12:31 ` Avi Kivity
0 siblings, 0 replies; 72+ messages in thread
From: Avi Kivity @ 2007-10-26 12:31 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, Zhang, Xiantao
Carsten Otte wrote:
> Avi Kivity wrote:
>
>> Carsten Otte wrote:
>>
>>> Avi Kivity wrote:
>>>
>>>> Why aren't memory slots common too? Only their number is different,
>>>> while the implementation is the same.
>>>>
>>> Your approach makes the meaning of memory slot somewhat useless on
>>> s390, if that one may be sparse and may be result of different
>>> allocations: On x86, there has to be one memory slot per allocation,
>>> versus on s390 there has to be exactly one memory slot with multiple
>>> allocations behind.
>>>
>> No, a memory slot can span multiple backing stores. But it must be
>> contiguous in both the host userspace and guest physical address spaces.
>>
> I was not preceise enough: I meant to state that x86 demands one
> memory slot per contiguous allocation. But with your "s390 has only
> one memory slot" idea, this introduces a severe restriction for us:
> our "single memory slot" does not need to be contiguous, neither in
> guest physical nor in host userspace. All we need, is a certain
> 1:1+offset relationship between guest physical and host user. Page
> size, backing, sparse are all variable.
>
Well, a slot may be sparse (though I don't think that's supported now).
To me, a slot is exactly a guest offset, size, and host offset. How the
memory is populated (or not) is up to the user.
> Izik's idea, at least how I understood him, makes the best of both
> worlds: we keep above addressing relationship intact, and have
> multiple memory slots for all architectures.
>
Can you explain the idea again. Izik's not here so I can't ask him.
>
>>> For userspace that means, with your approach it has to do total
>>> different memory setup for different archs _if_ it wants to use
>>> multiple allocations and/or sparse:
>>> - on x86 it does allocations to random userspace address, and
>>> registers each of them as memory slot
>>> - on s390 it does allocations to a specific address layout similar to
>>> the guest, and registers only one memory slot for the whole thing
>>>
>>> With Izik's approach however, this is transparent to userspace: it has
>>> multiple memory slots, one per allocation. Regardless of the CPU
>>> architecture.
>>>
>> You can do this with the current memory slots as well. Although I'm
>> feeling that I misunderstood Izik's idea. I'll go talk to him.
>>
> No we can't: because current memory slots don't have a permanent
> relationship between user and guest physical addresses that we do need
> on s390. We cannot guarantee that over multiple slots, and we cannot
> keep the guest from addressing memory around the memory slots unless
> we refuse to use more than only one slot which has to start at guest
> physical zero.
>
Well, you could allow multiple slots and return -EINVAL if they don't
fit the "host = guest + offset formula". I'm not sure how that's
different from one big, possibly sparse, slot.
But again, I don't think I understood Izik's idea, so I'm not sure
what's the alternative.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721A3A3.8020504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 8:41 ` Carsten Otte
2007-10-26 9:08 ` Avi Kivity
@ 2007-10-26 14:35 ` Hollis Blanchard
2007-10-26 14:43 ` Carsten Otte
2007-10-27 7:59 ` Avi Kivity
2 siblings, 2 replies; 72+ messages in thread
From: Hollis Blanchard @ 2007-10-26 14:35 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Avi Kivity
On Fri, 2007-10-26 at 10:21 +0200, Carsten Otte wrote:
>
> As Xiantao pointed out, x86 and ia64 can share the same memory setup
> code. But s390 and ppc don't. Therefore, I vote for putting it into
> x86 for now, and come up with an approach to share between x86 and
> ia64 later on.
The only thing in the current ioctl code that doesn't make sense for
PowerPC is the rmap stuff. The concept of "slots" as memory extents is
just fine.
Originally, I think the only question was how to register the slots on
the kernel side. Today that is done with separate
KVM_SET_USER_MEMORY_REGION ioctls, one for each guest physical region.
Izik's idea (as I understand it) is to have one ioctl registering all of
RAM, and then multiple "configure slot" ioctls that tell the kernel how
to divide that area into the guest physical address space. That seems
more awkward to me and I don't seem a benefit.
--
Hollis Blanchard
IBM Linux Technology Center
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
2007-10-26 14:35 ` Hollis Blanchard
@ 2007-10-26 14:43 ` Carsten Otte
[not found] ` <4721FD2A.6070504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-27 7:59 ` Avi Kivity
1 sibling, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 14:43 UTC (permalink / raw)
To: Hollis Blanchard
Cc: carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao, Avi Kivity
Hollis Blanchard wrote:
> Izik's idea (as I understand it) is to have one ioctl registering all of
> RAM, and then multiple "configure slot" ioctls that tell the kernel how
> to divide that area into the guest physical address space. That seems
> more awkward to me and I don't seem a benefit.
I think we need to wait for Izik to explain more. In this
interpretation it really does'nt make sense for s390 as well. My
interpretation of Izik's idea was just like memory slots are today.
Avi clarified my misunderstanding of memory slots on x86.
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC85FD78-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-26 14:53 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-26 14:53 UTC (permalink / raw)
To: Zhang, Xiantao
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Hollis Blanchard, Avi Kivity
Zhang, Xiantao wrote:
> I don't think we can move the whole function to arch-specific part,
> because it should work well (or with few issues) for most archs.
> Basically, IA64 mostly can use it directly. If we move them as
> arch-specific, it will introduces many duplicates. As you said, S390 has
> quite difference about this side, but I think maybe we can use macros,
> such as #ifndef CONFIG_S390 to comment out them, and S390 define it in
> your arch-specific portions. Any other good ideas ?
I really dislike CONFIG_ARCH sections. They are usually a strong
indication that proper interfaces between arch dependent and arch
independent code have not been found just yet. If you look at old
subsystems where lots of engineers had time to optimize the code, like
memory management for example, you rarely find #ifdefs at all. I think
that should be our goal.
As for KVM_SET_USER_MEMORY_REGION, the function you pointed at, I've
left it in common for now in patch version 3.
thanks for your review,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <1193400099.10970.8.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
@ 2007-10-26 18:32 ` Hollis Blanchard
2007-10-30 10:51 ` Dong, Eddie
1 sibling, 0 replies; 72+ messages in thread
From: Hollis Blanchard @ 2007-10-26 18:32 UTC (permalink / raw)
To: Carsten Otte
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Zhang, Xiantao, Avi Kivity
Acked-by: Hollis Blanchard <hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
On Fri, 2007-10-26 at 14:01 +0200, Carsten Otte wrote:
> This patch splits kvm_vm_ioctl into archtecture independent parts, and
> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
> The patch has been updated to current git, and it leaves out memory slot
> registration work which is currently subject to a detailed discussion.
>
> Common ioctls for all architectures are:
> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
>
> KVM_SET_USER_MEMORY_REGION implementation is no longer moved to x86.c.
> It seems to me that more fine-grained refinement then just moving the
> code is required here.
>
> x86 specific ioctls are:
> KVM_SET_MEMORY_REGION,
> KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
> KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
> KVM_SET_TSS_ADDR
>
> KVM_SET_TSS_ADDR has been added to the list of x86 specifics, as Izik's
> commit states it is used for emulating real mode on intel.
>
>
> kvm.h | 7 +
> kvm_main.c | 255
> +-----------------------------------------------------------
> x86.c | 258
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 271 insertions(+), 249 deletions(-)
> Signed-off-by: Carsten Otte <cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
> ---
> diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
> index b08fc9e..438d4a9 100644
> --- a/drivers/kvm/kvm.h
> +++ b/drivers/kvm/kvm.h
> @@ -621,6 +621,13 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
> unsigned int ioctl, unsigned long arg);
> void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
> void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
> +int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
> + struct
> + kvm_userspace_memory_region *mem,
> + int user_alloc);
> +long kvm_arch_vm_ioctl(struct file *filp,
> + unsigned int ioctl, unsigned long arg);
> +void kvm_arch_destroy_vm(struct kvm *kvm);
>
> __init void kvm_arch_init(void);
>
> diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
> index 9a3d663..7a85be9 100644
> --- a/drivers/kvm/kvm_main.c
> +++ b/drivers/kvm/kvm_main.c
> @@ -792,36 +792,16 @@ out:
> }
> EXPORT_SYMBOL_GPL(kvm_set_memory_region);
>
> -static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
> - struct
> - kvm_userspace_memory_region *mem,
> - int user_alloc)
> +int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
> + struct
> + kvm_userspace_memory_region *mem,
> + int user_alloc)
> {
> if (mem->slot >= KVM_MEMORY_SLOTS)
> return -EINVAL;
> return kvm_set_memory_region(kvm, mem, user_alloc);
> }
>
> -static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
> - u32 kvm_nr_mmu_pages)
> -{
> - if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
> - return -EINVAL;
> -
> - mutex_lock(&kvm->lock);
> -
> - kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
> - kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
> -
> - mutex_unlock(&kvm->lock);
> - return 0;
> -}
> -
> -static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
> -{
> - return kvm->n_alloc_mmu_pages;
> -}
> -
> /*
> * Get (and clear) the dirty memory log for a memory slot.
> */
> @@ -867,111 +847,6 @@ out:
> return r;
> }
>
> -/*
> - * Set a new alias region. Aliases map a portion of physical memory into
> - * another portion. This is useful for memory windows, for example the PC
> - * VGA region.
> - */
> -static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
> - struct kvm_memory_alias *alias)
> -{
> - int r, n;
> - struct kvm_mem_alias *p;
> -
> - r = -EINVAL;
> - /* General sanity checks */
> - if (alias->memory_size & (PAGE_SIZE - 1))
> - goto out;
> - if (alias->guest_phys_addr & (PAGE_SIZE - 1))
> - goto out;
> - if (alias->slot >= KVM_ALIAS_SLOTS)
> - goto out;
> - if (alias->guest_phys_addr + alias->memory_size
> - < alias->guest_phys_addr)
> - goto out;
> - if (alias->target_phys_addr + alias->memory_size
> - < alias->target_phys_addr)
> - goto out;
> -
> - mutex_lock(&kvm->lock);
> -
> - p = &kvm->aliases[alias->slot];
> - p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
> - p->npages = alias->memory_size >> PAGE_SHIFT;
> - p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
> -
> - for (n = KVM_ALIAS_SLOTS; n > 0; --n)
> - if (kvm->aliases[n - 1].npages)
> - break;
> - kvm->naliases = n;
> -
> - kvm_mmu_zap_all(kvm);
> -
> - mutex_unlock(&kvm->lock);
> -
> - return 0;
> -
> -out:
> - return r;
> -}
> -
> -static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
> -{
> - int r;
> -
> - r = 0;
> - switch (chip->chip_id) {
> - case KVM_IRQCHIP_PIC_MASTER:
> - memcpy(&chip->chip.pic,
> - &pic_irqchip(kvm)->pics[0],
> - sizeof(struct kvm_pic_state));
> - break;
> - case KVM_IRQCHIP_PIC_SLAVE:
> - memcpy(&chip->chip.pic,
> - &pic_irqchip(kvm)->pics[1],
> - sizeof(struct kvm_pic_state));
> - break;
> - case KVM_IRQCHIP_IOAPIC:
> - memcpy(&chip->chip.ioapic,
> - ioapic_irqchip(kvm),
> - sizeof(struct kvm_ioapic_state));
> - break;
> - default:
> - r = -EINVAL;
> - break;
> - }
> - return r;
> -}
> -
> -static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
> -{
> - int r;
> -
> - r = 0;
> - switch (chip->chip_id) {
> - case KVM_IRQCHIP_PIC_MASTER:
> - memcpy(&pic_irqchip(kvm)->pics[0],
> - &chip->chip.pic,
> - sizeof(struct kvm_pic_state));
> - break;
> - case KVM_IRQCHIP_PIC_SLAVE:
> - memcpy(&pic_irqchip(kvm)->pics[1],
> - &chip->chip.pic,
> - sizeof(struct kvm_pic_state));
> - break;
> - case KVM_IRQCHIP_IOAPIC:
> - memcpy(ioapic_irqchip(kvm),
> - &chip->chip.ioapic,
> - sizeof(struct kvm_ioapic_state));
> - break;
> - default:
> - r = -EINVAL;
> - break;
> - }
> - kvm_pic_update_irq(pic_irqchip(kvm));
> - return r;
> -}
> -
> int is_error_page(struct page *page)
> {
> return page == bad_page;
> @@ -2669,16 +2544,6 @@ static int create_vcpu_fd(struct kvm_vcpu *vcpu)
> return fd;
> }
>
> -static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
> -{
> - int ret;
> -
> - if (addr > (unsigned int)(-3 * PAGE_SIZE))
> - return -1;
> - ret = kvm_x86_ops->set_tss_addr(kvm, addr);
> - return ret;
> -}
> -
> /*
> * Creates some virtual cpus. Good luck creating more than one.
> */
> @@ -2972,35 +2837,14 @@ static long kvm_vm_ioctl(struct file *filp,
> {
> struct kvm *kvm = filp->private_data;
> void __user *argp = (void __user *)arg;
> - int r = -EINVAL;
> + int r;
>
> switch (ioctl) {
> - case KVM_SET_TSS_ADDR:
> - r = kvm_vm_ioctl_set_tss_addr(kvm, arg);
> - if (r < 0)
> - goto out;
> - break;
> case KVM_CREATE_VCPU:
> r = kvm_vm_ioctl_create_vcpu(kvm, arg);
> if (r < 0)
> goto out;
> break;
> - case KVM_SET_MEMORY_REGION: {
> - struct kvm_memory_region kvm_mem;
> - struct kvm_userspace_memory_region kvm_userspace_mem;
> -
> - r = -EFAULT;
> - if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
> - goto out;
> - kvm_userspace_mem.slot = kvm_mem.slot;
> - kvm_userspace_mem.flags = kvm_mem.flags;
> - kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
> - kvm_userspace_mem.memory_size = kvm_mem.memory_size;
> - r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
> - if (r)
> - goto out;
> - break;
> - }
> case KVM_SET_USER_MEMORY_REGION: {
> struct kvm_userspace_memory_region kvm_userspace_mem;
>
> @@ -3014,14 +2858,6 @@ static long kvm_vm_ioctl(struct file *filp,
> goto out;
> break;
> }
> - case KVM_SET_NR_MMU_PAGES:
> - r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
> - if (r)
> - goto out;
> - break;
> - case KVM_GET_NR_MMU_PAGES:
> - r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
> - break;
> case KVM_GET_DIRTY_LOG: {
> struct kvm_dirty_log log;
>
> @@ -3033,87 +2869,8 @@ static long kvm_vm_ioctl(struct file *filp,
> goto out;
> break;
> }
> - case KVM_SET_MEMORY_ALIAS: {
> - struct kvm_memory_alias alias;
> -
> - r = -EFAULT;
> - if (copy_from_user(&alias, argp, sizeof alias))
> - goto out;
> - r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
> - if (r)
> - goto out;
> - break;
> - }
> - case KVM_CREATE_IRQCHIP:
> - r = -ENOMEM;
> - kvm->vpic = kvm_create_pic(kvm);
> - if (kvm->vpic) {
> - r = kvm_ioapic_init(kvm);
> - if (r) {
> - kfree(kvm->vpic);
> - kvm->vpic = NULL;
> - goto out;
> - }
> - } else
> - goto out;
> - break;
> - case KVM_IRQ_LINE: {
> - struct kvm_irq_level irq_event;
> -
> - r = -EFAULT;
> - if (copy_from_user(&irq_event, argp, sizeof irq_event))
> - goto out;
> - if (irqchip_in_kernel(kvm)) {
> - mutex_lock(&kvm->lock);
> - if (irq_event.irq < 16)
> - kvm_pic_set_irq(pic_irqchip(kvm),
> - irq_event.irq,
> - irq_event.level);
> - kvm_ioapic_set_irq(kvm->vioapic,
> - irq_event.irq,
> - irq_event.level);
> - mutex_unlock(&kvm->lock);
> - r = 0;
> - }
> - break;
> - }
> - case KVM_GET_IRQCHIP: {
> - /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
> - struct kvm_irqchip chip;
> -
> - r = -EFAULT;
> - if (copy_from_user(&chip, argp, sizeof chip))
> - goto out;
> - r = -ENXIO;
> - if (!irqchip_in_kernel(kvm))
> - goto out;
> - r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
> - if (r)
> - goto out;
> - r = -EFAULT;
> - if (copy_to_user(argp, &chip, sizeof chip))
> - goto out;
> - r = 0;
> - break;
> - }
> - case KVM_SET_IRQCHIP: {
> - /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
> - struct kvm_irqchip chip;
> -
> - r = -EFAULT;
> - if (copy_from_user(&chip, argp, sizeof chip))
> - goto out;
> - r = -ENXIO;
> - if (!irqchip_in_kernel(kvm))
> - goto out;
> - r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
> - if (r)
> - goto out;
> - r = 0;
> - break;
> - }
> default:
> - ;
> + r = kvm_arch_vm_ioctl(filp, ioctl, arg);
> }
> out:
> return r;
> diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
> index 1fe209d..b84cb67 100644
> --- a/drivers/kvm/x86.c
> +++ b/drivers/kvm/x86.c
> @@ -300,6 +300,264 @@ out:
> return r;
> }
>
> +static int kvm_vm_ioctl_set_tss_addr(struct kvm *kvm, unsigned long addr)
> +{
> + int ret;
> +
> + if (addr > (unsigned int)(-3 * PAGE_SIZE))
> + return -1;
> + ret = kvm_x86_ops->set_tss_addr(kvm, addr);
> + return ret;
> +}
> +
> +static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
> + u32 kvm_nr_mmu_pages)
> +{
> + if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES)
> + return -EINVAL;
> +
> + mutex_lock(&kvm->lock);
> +
> + kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
> + kvm->n_requested_mmu_pages = kvm_nr_mmu_pages;
> +
> + mutex_unlock(&kvm->lock);
> + return 0;
> +}
> +
> +static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm)
> +{
> + return kvm->n_alloc_mmu_pages;
> +}
> +
> +/*
> + * Set a new alias region. Aliases map a portion of physical memory into
> + * another portion. This is useful for memory windows, for example the PC
> + * VGA region.
> + */
> +static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm,
> + struct kvm_memory_alias *alias)
> +{
> + int r, n;
> + struct kvm_mem_alias *p;
> +
> + r = -EINVAL;
> + /* General sanity checks */
> + if (alias->memory_size & (PAGE_SIZE - 1))
> + goto out;
> + if (alias->guest_phys_addr & (PAGE_SIZE - 1))
> + goto out;
> + if (alias->slot >= KVM_ALIAS_SLOTS)
> + goto out;
> + if (alias->guest_phys_addr + alias->memory_size
> + < alias->guest_phys_addr)
> + goto out;
> + if (alias->target_phys_addr + alias->memory_size
> + < alias->target_phys_addr)
> + goto out;
> +
> + mutex_lock(&kvm->lock);
> +
> + p = &kvm->aliases[alias->slot];
> + p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT;
> + p->npages = alias->memory_size >> PAGE_SHIFT;
> + p->target_gfn = alias->target_phys_addr >> PAGE_SHIFT;
> +
> + for (n = KVM_ALIAS_SLOTS; n > 0; --n)
> + if (kvm->aliases[n - 1].npages)
> + break;
> + kvm->naliases = n;
> +
> + kvm_mmu_zap_all(kvm);
> +
> + mutex_unlock(&kvm->lock);
> +
> + return 0;
> +
> +out:
> + return r;
> +}
> +
> +static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
> +{
> + int r;
> +
> + r = 0;
> + switch (chip->chip_id) {
> + case KVM_IRQCHIP_PIC_MASTER:
> + memcpy(&chip->chip.pic,
> + &pic_irqchip(kvm)->pics[0],
> + sizeof(struct kvm_pic_state));
> + break;
> + case KVM_IRQCHIP_PIC_SLAVE:
> + memcpy(&chip->chip.pic,
> + &pic_irqchip(kvm)->pics[1],
> + sizeof(struct kvm_pic_state));
> + break;
> + case KVM_IRQCHIP_IOAPIC:
> + memcpy(&chip->chip.ioapic,
> + ioapic_irqchip(kvm),
> + sizeof(struct kvm_ioapic_state));
> + break;
> + default:
> + r = -EINVAL;
> + break;
> + }
> + return r;
> +}
> +
> +static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
> +{
> + int r;
> +
> + r = 0;
> + switch (chip->chip_id) {
> + case KVM_IRQCHIP_PIC_MASTER:
> + memcpy(&pic_irqchip(kvm)->pics[0],
> + &chip->chip.pic,
> + sizeof(struct kvm_pic_state));
> + break;
> + case KVM_IRQCHIP_PIC_SLAVE:
> + memcpy(&pic_irqchip(kvm)->pics[1],
> + &chip->chip.pic,
> + sizeof(struct kvm_pic_state));
> + break;
> + case KVM_IRQCHIP_IOAPIC:
> + memcpy(ioapic_irqchip(kvm),
> + &chip->chip.ioapic,
> + sizeof(struct kvm_ioapic_state));
> + break;
> + default:
> + r = -EINVAL;
> + break;
> + }
> + kvm_pic_update_irq(pic_irqchip(kvm));
> + return r;
> +}
> +
> +long kvm_arch_vm_ioctl(struct file *filp,
> + unsigned int ioctl, unsigned long arg)
> +{
> + struct kvm *kvm = filp->private_data;
> + void __user *argp = (void __user *)arg;
> + int r = -EINVAL;
> +
> + switch (ioctl) {
> + case KVM_SET_TSS_ADDR:
> + r = kvm_vm_ioctl_set_tss_addr(kvm, arg);
> + if (r < 0)
> + goto out;
> + break;
> + case KVM_SET_MEMORY_REGION: {
> + struct kvm_memory_region kvm_mem;
> + struct kvm_userspace_memory_region kvm_userspace_mem;
> +
> + r = -EFAULT;
> + if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem))
> + goto out;
> + kvm_userspace_mem.slot = kvm_mem.slot;
> + kvm_userspace_mem.flags = kvm_mem.flags;
> + kvm_userspace_mem.guest_phys_addr = kvm_mem.guest_phys_addr;
> + kvm_userspace_mem.memory_size = kvm_mem.memory_size;
> + r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 0);
> + if (r)
> + goto out;
> + break;
> + }
> + case KVM_SET_NR_MMU_PAGES:
> + r = kvm_vm_ioctl_set_nr_mmu_pages(kvm, arg);
> + if (r)
> + goto out;
> + break;
> + case KVM_GET_NR_MMU_PAGES:
> + r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
> + break;
> + case KVM_SET_MEMORY_ALIAS: {
> + struct kvm_memory_alias alias;
> +
> + r = -EFAULT;
> + if (copy_from_user(&alias, argp, sizeof alias))
> + goto out;
> + r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
> + if (r)
> + goto out;
> + break;
> + }
> + case KVM_CREATE_IRQCHIP:
> + r = -ENOMEM;
> + kvm->vpic = kvm_create_pic(kvm);
> + if (kvm->vpic) {
> + r = kvm_ioapic_init(kvm);
> + if (r) {
> + kfree(kvm->vpic);
> + kvm->vpic = NULL;
> + goto out;
> + }
> + } else
> + goto out;
> + break;
> + case KVM_IRQ_LINE: {
> + struct kvm_irq_level irq_event;
> +
> + r = -EFAULT;
> + if (copy_from_user(&irq_event, argp, sizeof irq_event))
> + goto out;
> + if (irqchip_in_kernel(kvm)) {
> + mutex_lock(&kvm->lock);
> + if (irq_event.irq < 16)
> + kvm_pic_set_irq(pic_irqchip(kvm),
> + irq_event.irq,
> + irq_event.level);
> + kvm_ioapic_set_irq(kvm->vioapic,
> + irq_event.irq,
> + irq_event.level);
> + mutex_unlock(&kvm->lock);
> + r = 0;
> + }
> + break;
> + }
> + case KVM_GET_IRQCHIP: {
> + /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
> + struct kvm_irqchip chip;
> +
> + r = -EFAULT;
> + if (copy_from_user(&chip, argp, sizeof chip))
> + goto out;
> + r = -ENXIO;
> + if (!irqchip_in_kernel(kvm))
> + goto out;
> + r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
> + if (r)
> + goto out;
> + r = -EFAULT;
> + if (copy_to_user(argp, &chip, sizeof chip))
> + goto out;
> + r = 0;
> + break;
> + }
> + case KVM_SET_IRQCHIP: {
> + /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
> + struct kvm_irqchip chip;
> +
> + r = -EFAULT;
> + if (copy_from_user(&chip, argp, sizeof chip))
> + goto out;
> + r = -ENXIO;
> + if (!irqchip_in_kernel(kvm))
> + goto out;
> + r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
> + if (r)
> + goto out;
> + r = 0;
> + break;
> + }
> + default:
> + ;
> + }
> +out:
> + return r;
> +}
> +
> static __init void kvm_init_msr_list(void)
> {
> u32 dummy[2];
>
>
--
Hollis Blanchard
IBM Linux Technology Center
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4721FD2A.6070504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-26 19:05 ` Izik Eidus
[not found] ` <47223A85.5020409-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Izik Eidus @ 2007-10-26 19:05 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Avi Kivity, Zhang, Xiantao, Hollis Blanchard
Carsten Otte wrote:
> Hollis Blanchard wrote:
>
>> Izik's idea (as I understand it) is to have one ioctl registering all of
>> RAM, and then multiple "configure slot" ioctls that tell the kernel how
>> to divide that area into the guest physical address space. That seems
>> more awkward to me and I don't seem a benefit.
>>
> I think we need to wait for Izik to explain more. In this
> interpretation it really does'nt make sense for s390 as well. My
> interpretation of Izik's idea was just like memory slots are today.
> Avi clarified my misunderstanding of memory slots on x86.
>
my idea was to let kvm register userspace memory that will hold the
guest memory,
and then much like qemu do with its cpu_register_physical_memory
function, run ioctls
that will tell the kernel how to map this memory,
what i wanted to achieved is making the memory allocation code shared,
but still
let each arch to use any kind of "arch depended" mapping rules it want,
but after reading the last posts it seems like you can use the normal
memslots, so it is kind of useless i guess and i will
give up the idea of writing patch to make this, unless you still have
problem with the memslots?
thanks.
> so long,
> Carsten
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems? Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> _______________________________________________
> kvm-devel mailing list
> kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/kvm-devel
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
2007-10-26 14:35 ` Hollis Blanchard
2007-10-26 14:43 ` Carsten Otte
@ 2007-10-27 7:59 ` Avi Kivity
[not found] ` <4722EFE1.9060609-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-27 7:59 UTC (permalink / raw)
To: Hollis Blanchard
Cc: carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
kvm-ppc-devel, Zhang, Xiantao
Hollis Blanchard wrote:
> On Fri, 2007-10-26 at 10:21 +0200, Carsten Otte wrote:
>
>> As Xiantao pointed out, x86 and ia64 can share the same memory setup
>> code. But s390 and ppc don't. Therefore, I vote for putting it into
>> x86 for now, and come up with an approach to share between x86 and
>> ia64 later on.
>>
>
> The only thing in the current ioctl code that doesn't make sense for
> PowerPC is the rmap stuff. The concept of "slots" as memory extents is
> just fine.
>
> Originally, I think the only question was how to register the slots on
> the kernel side. Today that is done with separate
> KVM_SET_USER_MEMORY_REGION ioctls, one for each guest physical region.
>
Wht about aliases? Aliases allow you go have two different physical
addresses for the same page. This is useful for mapping the framebuffer
on x86 (both at the pci region and at 0xa0000, the traditional ISA
location).
Are they useful for ia64?
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <4722EFE1.9060609-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-28 7:39 ` Zhang, Xiantao
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC8B512C-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Zhang, Xiantao @ 2007-10-28 7:39 UTC (permalink / raw)
To: Avi Kivity, Hollis Blanchard
Cc: carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, kvm-ppc-devel
Avi Kivity wrote:
> Hollis Blanchard wrote:
>> On Fri, 2007-10-26 at 10:21 +0200, Carsten Otte wrote:
>>
>>> As Xiantao pointed out, x86 and ia64 can share the same memory setup
>>> code. But s390 and ppc don't. Therefore, I vote for putting it into
>>> x86 for now, and come up with an approach to share between x86 and
>>> ia64 later on.
>>>
>>
>> The only thing in the current ioctl code that doesn't make sense for
>> PowerPC is the rmap stuff. The concept of "slots" as memory extents
>> is just fine.
>>
>> Originally, I think the only question was how to register the slots
>> on the kernel side. Today that is done with separate
>> KVM_SET_USER_MEMORY_REGION ioctls, one for each guest physical
>> region.
>>
>
> Wht about aliases? Aliases allow you go have two different physical
> addresses for the same page. This is useful for mapping the
> framebuffer on x86 (both at the pci region and at 0xa0000, the
> traditional ISA location).
>
> Are they useful for ia64?
Sure, it also should benefit IA64 side :)
thanks
Xiantao
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC8B512C-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-28 9:57 ` Avi Kivity
[not found] ` <47245D27.5030105-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-28 9:57 UTC (permalink / raw)
To: Zhang, Xiantao
Cc: carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, kvm-ppc-devel,
Hollis Blanchard
Zhang, Xiantao wrote:
> Avi Kivity wrote:
>
>> Hollis Blanchard wrote:
>>
>>> On Fri, 2007-10-26 at 10:21 +0200, Carsten Otte wrote:
>>>
>>>
>>>> As Xiantao pointed out, x86 and ia64 can share the same memory setup
>>>> code. But s390 and ppc don't. Therefore, I vote for putting it into
>>>> x86 for now, and come up with an approach to share between x86 and
>>>> ia64 later on.
>>>>
>>>>
>>> The only thing in the current ioctl code that doesn't make sense for
>>> PowerPC is the rmap stuff. The concept of "slots" as memory extents
>>> is just fine.
>>>
>>> Originally, I think the only question was how to register the slots
>>> on the kernel side. Today that is done with separate
>>> KVM_SET_USER_MEMORY_REGION ioctls, one for each guest physical
>>> region.
>>>
>>>
>> Wht about aliases? Aliases allow you go have two different physical
>> addresses for the same page. This is useful for mapping the
>> framebuffer on x86 (both at the pci region and at 0xa0000, the
>> traditional ISA location).
>>
>> Are they useful for ia64?
>>
>
> Sure, it also should benefit IA64 side :)
>
Actually, thinking about it, regular memory slots support this too.
Simply create a new memory slot to that memory. So aliases can be x86
specific (for compatibility reasons).
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <47245D27.5030105-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-29 8:01 ` Carsten Otte
[not found] ` <47259352.3010109-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-29 8:01 UTC (permalink / raw)
To: Avi Kivity
Cc: carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, kvm-ppc-devel,
Hollis Blanchard, Zhang, Xiantao
Avi Kivity wrote:
> Zhang, Xiantao wrote:
>> Avi Kivity wrote:
>>> Wht about aliases? Aliases allow you go have two different physical
>>> addresses for the same page. This is useful for mapping the
>>> framebuffer on x86 (both at the pci region and at 0xa0000, the
>>> traditional ISA location).
>>>
>>> Are they useful for ia64?
>>>
>>
>> Sure, it also should benefit IA64 side :)
>>
>
> Actually, thinking about it, regular memory slots support this too.
> Simply create a new memory slot to that memory. So aliases can be x86
> specific (for compatibility reasons).
Memory slots turn out to be surprisingly flexible :-).
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <47259352.3010109-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-29 8:03 ` Izik Eidus
[not found] ` <1193644998.4484.8.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Izik Eidus @ 2007-10-29 8:03 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, kvm-ppc-devel,
Zhang, Xiantao, Hollis Blanchard, Avi Kivity
On Mon, 2007-10-29 at 09:01 +0100, Carsten Otte wrote:
> Avi Kivity wrote:
> > Zhang, Xiantao wrote:
> >> Avi Kivity wrote:
> >>> Wht about aliases? Aliases allow you go have two different physical
> >>> addresses for the same page. This is useful for mapping the
> >>> framebuffer on x86 (both at the pci region and at 0xa0000, the
> >>> traditional ISA location).
> >>>
> >>> Are they useful for ia64?
> >>>
> >>
> >> Sure, it also should benefit IA64 side :)
> >>
> >
> > Actually, thinking about it, regular memory slots support this too.
> > Simply create a new memory slot to that memory. So aliases can be x86
> > specific (for compatibility reasons).
>
> Memory slots turn out to be surprisingly flexible :-).
yep,
another cleanup is needed for:
the rmap part, and the mmu cache size setting that found it way to the
memory slot allocation function.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <47223A85.5020409-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-29 8:04 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-29 8:04 UTC (permalink / raw)
To: Izik Eidus
Cc: kvm-ppc-devel, Hollis Blanchard, carsteno-tA70FqPdS9bQT0dZR+AlfA,
Avi Kivity,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Zhang, Xiantao
Izik Eidus wrote:
> my idea was to let kvm register userspace memory that will hold the
> guest memory,
> and then much like qemu do with its cpu_register_physical_memory
> function, run ioctls
> that will tell the kernel how to map this memory,
> what i wanted to achieved is making the memory allocation code shared,
> but still
> let each arch to use any kind of "arch depended" mapping rules it want,
> but after reading the last posts it seems like you can use the normal
> memslots, so it is kind of useless i guess and i will
> give up the idea of writing patch to make this, unless you still have
> problem with the memslots?
Looks like we shared the same misunderstanding about the current
memslot implementation *shaking hands*. After being educated on
memslots by Avi, I agree that memslots do the right thing.
cheers,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: [kvm-ppc-devel] RFC/patch portability: split kvm_vm_ioctl v2
[not found] ` <1193644998.4484.8.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
@ 2007-10-29 8:16 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-29 8:16 UTC (permalink / raw)
To: Izik Eidus
Cc: kvm-ppc-devel, carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
Hollis Blanchard, kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
Avi Kivity, Zhang, Xiantao
Izik Eidus wrote:
> yep,
> another cleanup is needed for:
> the rmap part, and the mmu cache size setting that found it way to the
> memory slot allocation function.
That's true, but can be subject of one of the next portability paches.
I want to keep each of them trivial and easily reviewable.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <1193400099.10970.8.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-26 18:32 ` Hollis Blanchard
@ 2007-10-30 10:51 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC4D-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Dong, Eddie @ 2007-10-30 10:51 UTC (permalink / raw)
To: Carsten Otte, Avi Kivity, Zhang, Xiantao, Hollis Blanchard
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
[-- Attachment #1: Type: text/plain, Size: 1489 bytes --]
>-----Original Message-----
>From: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>[mailto:kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org] On Behalf Of
>Carsten Otte
>Sent: 2007年10月26日 20:02
>To: Avi Kivity; Zhang, Xiantao; Hollis Blanchard
>Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>Subject: Re: [kvm-devel] RFC/patch portability: split kvm_vm_ioctl v3
>
>This patch splits kvm_vm_ioctl into archtecture independent parts, and
>x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>The patch has been updated to current git, and it leaves out
>memory slot
>registration work which is currently subject to a detailed discussion.
>
>Common ioctls for all architectures are:
>KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
>
>KVM_SET_USER_MEMORY_REGION implementation is no longer moved to x86.c.
>It seems to me that more fine-grained refinement then just moving the
>code is required here.
>
>x86 specific ioctls are:
>KVM_SET_MEMORY_REGION,
>KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
>KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
>KVM_SET_TSS_ADDR
>
>KVM_SET_TSS_ADDR has been added to the list of x86 specifics, as Izik's
>commit states it is used for emulating real mode on intel.
>
Why KVM_IRQ_LINE is X86b specific? The original idea are based on ACPI spec which
I assume to be generic though S390 may not take.
thx,eddie
[-- Attachment #2: Type: text/plain, Size: 314 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
[-- Attachment #3: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC4D-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-30 11:03 ` Avi Kivity
[not found] ` <47270F9E.5080007-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-30 11:29 ` Carsten Otte
1 sibling, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-30 11:03 UTC (permalink / raw)
To: Dong, Eddie
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Carsten Otte,
Hollis Blanchard, Zhang, Xiantao
[-- Attachment #1: Type: text/plain, Size: 1805 bytes --]
Dong, Eddie wrote:
>
>
>
>> -----Original Message-----
>> From: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>> [mailto:kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org] On Behalf Of
>> Carsten Otte
>> Sent: 2007年10月26日 20:02
>> To: Avi Kivity; Zhang, Xiantao; Hollis Blanchard
>> Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>> Subject: Re: [kvm-devel] RFC/patch portability: split kvm_vm_ioctl v3
>>
>> This patch splits kvm_vm_ioctl into archtecture independent parts, and
>> x86 specific parts which go to kvm_arch_vcpu_ioctl in x86.c.
>> The patch has been updated to current git, and it leaves out
>> memory slot
>> registration work which is currently subject to a detailed discussion.
>>
>> Common ioctls for all architectures are:
>> KVM_CREATE_VCPU, KVM_GET_DIRTY_LOG, KVM_SET_USER_MEMORY_REGION
>>
>> KVM_SET_USER_MEMORY_REGION implementation is no longer moved to x86.c.
>> It seems to me that more fine-grained refinement then just moving the
>> code is required here.
>>
>> x86 specific ioctls are:
>> KVM_SET_MEMORY_REGION,
>> KVM_GET/SET_NR_MMU_PAGES, KVM_SET_MEMORY_ALIAS, KVM_CREATE_IRQCHIP,
>> KVM_CREATE_IRQ_LINE, KVM_GET/SET_IRQCHIP
>> KVM_SET_TSS_ADDR
>>
>> KVM_SET_TSS_ADDR has been added to the list of x86 specifics, as Izik's
>> commit states it is used for emulating real mode on intel.
>>
>>
> Why KVM_IRQ_LINE is X86b specific? The original idea are based on ACPI spec which
> I assume to be generic though S390 may not take.
>
>
ia64 can probably share much. ppc will probably want KVM_IRQ_LINE with
with different parameters. s390, as far as I understand, will not.
--
Any sufficiently difficult bug is indistinguishable from a feature.
[-- Attachment #2: Type: text/plain, Size: 314 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
[-- Attachment #3: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47270F9E.5080007-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-30 11:27 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC54-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-30 11:44 ` Carsten Otte
1 sibling, 1 reply; 72+ messages in thread
From: Dong, Eddie @ 2007-10-30 11:27 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Carsten Otte,
Hollis Blanchard, Zhang, Xiantao
>> Why KVM_IRQ_LINE is X86b specific? The original idea are
>based on ACPI spec which
>> I assume to be generic though S390 may not take.
>>
>>
>
>ia64 can probably share much. ppc will probably want KVM_IRQ_LINE with
>with different parameters. s390, as far as I understand, will not.
>
How does PPC use different parameter? Current approach use gsi irq line
#
as parameter, though the comments says something related to APIC/PIC.
It is OK for PPC to map gsi irq line to its internal signal, but the API
itself
can be same.
Yes, S390 is very special (even no PCI), since it is special, Carsten
probably
can handle it in special way, or just not use it :-)
BTW, how S390 user/kernel interrupt signal is communicated?
thx,eddie
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC4D-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-30 11:03 ` Avi Kivity
@ 2007-10-30 11:29 ` Carsten Otte
[not found] ` <472715A9.4050201-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 11:29 UTC (permalink / raw)
To: Dong, Eddie
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
Zhang, Xiantao, Avi Kivity
Dong, Eddie wrote:
> Why KVM_IRQ_LINE is X86b specific? The original idea are based on ACPI spec which
> I assume to be generic though S390 may not take.
ACPI is not present on s390 and ppc. In fact, I doubt it is present on
any architecture except those two intel ones: at least my mips router
and my arm pda don't have it either. It's kind of based on the idea of
having a bios alike code.
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <472715A9.4050201-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-30 11:35 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC59-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Dong, Eddie @ 2007-10-30 11:35 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
Zhang, Xiantao, Avi Kivity
[-- Attachment #1: Type: text/plain, Size: 846 bytes --]
OK, so how can a device inform kernel for an IRQ in S390?
>-----Original Message-----
>From: Carsten Otte [mailto:cotte-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org]
>Sent: 2007年10月30日 19:30
>To: Dong, Eddie
>Cc: Avi Kivity; Zhang, Xiantao; Hollis Blanchard;
>kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
>Subject: Re: [kvm-devel] RFC/patch portability: split kvm_vm_ioctl v3
>
>Dong, Eddie wrote:
>> Why KVM_IRQ_LINE is X86b specific? The original idea are
>based on ACPI spec which
>> I assume to be generic though S390 may not take.
>ACPI is not present on s390 and ppc. In fact, I doubt it is present on
>any architecture except those two intel ones: at least my mips router
>and my arm pda don't have it either. It's kind of based on the idea of
>having a bios alike code.
>
>so long,
>Carsten
>
[-- Attachment #2: Type: text/plain, Size: 314 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
[-- Attachment #3: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47270F9E.5080007-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-30 11:27 ` Dong, Eddie
@ 2007-10-30 11:44 ` Carsten Otte
[not found] ` <47271927.9060602-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 11:44 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
Zhang, Xiantao
Avi Kivity wrote:
>> Why KVM_IRQ_LINE is X86b specific? The original idea are based on ACPI spec which
>> I assume to be generic though S390 may not take.
>>
>>
>
> ia64 can probably share much. ppc will probably want KVM_IRQ_LINE with
> with different parameters. s390, as far as I understand, will not.
I think we'll have to come up with a more modular approach later on:
various aspects are of interest to various architectures and/or
platforms. The generic kernel has CONFIG_FEATURE toggles for that.
The portability patches are not intended to split kvm into components
at this stage, I believe that is something that we will have to come
up when actual ports are being integrated. In my optinion, a
reasonable next-step refinement here would be to come up with a
generic interrupt injection call that can inject an interrupt on any
architecture and platform. After userspace has adopted to use that
one, we can keep the old call for backward compatibility reasons in a
deprecated state for some time before removing it.
For now, my goal is to seperate what is generic in a way that it is a
functionality that a portable user space program that uses kvm can
expect to work the same way on all architectures and platforms.
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47271927.9060602-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-30 11:52 ` Avi Kivity
0 siblings, 0 replies; 72+ messages in thread
From: Avi Kivity @ 2007-10-30 11:52 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
Zhang, Xiantao
Carsten Otte wrote:
> I think we'll have to come up with a more modular approach later on:
> various aspects are of interest to various architectures and/or
> platforms. The generic kernel has CONFIG_FEATURE toggles for that.
> The portability patches are not intended to split kvm into components
> at this stage, I believe that is something that we will have to come
> up when actual ports are being integrated. In my optinion, a
> reasonable next-step refinement here would be to come up with a
> generic interrupt injection call that can inject an interrupt on any
> architecture and platform. After userspace has adopted to use that
> one, we can keep the old call for backward compatibility reasons in a
> deprecated state for some time before removing it.
> For now, my goal is to seperate what is generic in a way that it is a
> functionality that a portable user space program that uses kvm can
> expect to work the same way on all architectures and platforms.
>
We have to be careful not to force too much portability on the code.
After all, the instruction set is different and some of the hardware
philosophy is different. You will never be able to run the same guest
on different archs, or have exactly the same virtual devices. The
differences are real, and the goal is not portability at any cost; it is
to share as much as possible, but not more.
Architectures which have interrupt request lines that are edge-triggered
or level-triggered and emulate the interrupt controller in the kernel
can share the KVM_IRQ_LINE API in some way; architectures that don't
will need another method.
--
Any sufficiently difficult bug is indistinguishable from a feature.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC54-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-30 11:59 ` Carsten Otte
[not found] ` <47271C9B.1050804-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 11:59 UTC (permalink / raw)
To: Dong, Eddie
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
Zhang, Xiantao, Avi Kivity
Dong, Eddie wrote:
> BTW, how S390 user/kernel interrupt signal is communicated?
Our s90host prototype does inject it from userspace, so there is no
need to have a call for that.
Nevertheless, I really love the lightweight exits that kvm has
invented and I want to use it on s390 with kvm too. In that case,
we'll have an interrupt facility in the kernel that is in terms of
functionality close to the pic/lapic work for x86.
For that, I think we could encode an interrupt number in an __u64 that
has a platform specific helper function in userspace to generate that
interrupt number: for x86 that would just equal the irq line, for s390
that would be more complex. The common kvm code can then take that
__u64 number and call an architecture specific callback that injects
the interrupt.
In addition, I would love to be able to specify which target CPUs may
receive that interrupt because our IPI equivalent comes out just like
a regular interrupt on just one target CPU.
That boils down to something like this:
struct kvm_interrupt_data {
__u64 interrupt_number;
cpuset_t possible_target_cpus;
}
and an KVM_INJECT_INTERRUPT common ioctl for the vm to provide this.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47271C9B.1050804-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-30 12:15 ` Avi Kivity
[not found] ` <4727204E.6000606-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-30 12:15 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
Zhang, Xiantao
Carsten Otte wrote:
> Dong, Eddie wrote:
>> BTW, how S390 user/kernel interrupt signal is communicated?
> Our s90host prototype does inject it from userspace, so there is no
> need to have a call for that.
>
> Nevertheless, I really love the lightweight exits that kvm has
> invented and I want to use it on s390 with kvm too.
It originated as a Xen hvm thing which Eddie & co. ported over.
> In that case, we'll have an interrupt facility in the kernel that is
> in terms of functionality close to the pic/lapic work for x86.
>
> For that, I think we could encode an interrupt number in an __u64 that
> has a platform specific helper function in userspace to generate that
> interrupt number: for x86 that would just equal the irq line, for s390
> that would be more complex. The common kvm code can then take that
> __u64 number and call an architecture specific callback that injects
> the interrupt.
>
But that doesn't make the code portable. The s390 userspace has to know
how to encode the number, and x86 will do it differently.
If it's really different, let's keep it different. Unless you can push
the encoding so far back it's transparent to userspace (e.g. qemu).
> In addition, I would love to be able to specify which target CPUs may
> receive that interrupt because our IPI equivalent comes out just like
> a regular interrupt on just one target CPU.
>
> That boils down to something like this:
> struct kvm_interrupt_data {
> __u64 interrupt_number;
> cpuset_t possible_target_cpus;
> }
> and an KVM_INJECT_INTERRUPT common ioctl for the vm to provide this.
Are cpusets exported to userspace?
x86 has something similar (IPI to a set of cpus) but it's handled 100%
in the kernel these days.
--
Any sufficiently difficult bug is indistinguishable from a feature.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC59-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-30 12:18 ` Carsten Otte
0 siblings, 0 replies; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 12:18 UTC (permalink / raw)
To: Dong, Eddie
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Hollis Blanchard, Avi Kivity
Dong, Eddie wrote:
> OK, so how can a device inform kernel for an IRQ in S390?
Oooh, that is a looong explanation. If you want to peek at it, see
http://publibz.boulder.ibm.com/epubs/pdf/a2278324.pdf . Chapter 6
covers Interruptions. I'd recommend to start with reading external
interruptions, because that is the one we'll be primarily be using
with kvm. External interruptions are used for things like timers,
hypercalls, and IPIs. The "Program Interruption Coditions" are also
worth reading, they cover things similar to general protection fault
on x86. Chapter 11 covers a different type of Interruptions, such as
error detection of hardware failures and hot-standby component
failover. Chapter 16 is also of interrest, it covers I/O interruptions.
Whenever you see me in person (next kvm forum maybe?), you are invited
to a lot of beer: I'll bring pen and paper and try to give you an
overview while we get drunk :-).
so long,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <4727204E.6000606-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-30 12:31 ` Carsten Otte
[not found] ` <47272410.9020502-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 12:31 UTC (permalink / raw)
To: Avi Kivity
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Hollis Blanchard
Avi Kivity wrote:
> But that doesn't make the code portable. The s390 userspace has to know
> how to encode the number, and x86 will do it differently.
>
> If it's really different, let's keep it different. Unless you can push
> the encoding so far back it's transparent to userspace (e.g. qemu).
I agree that we should keep it seperate unless it makes sense to have
commonality.
A paravirt driver for example could make use of this abstraction: it
could request an interrupt, and hand the __u64 that it got back to a
function that actually sends the interrupt over.
But for now, I agree we should keep it seperate. I am just thinking
loud here.
>> In addition, I would love to be able to specify which target CPUs may
>> receive that interrupt because our IPI equivalent comes out just like
>> a regular interrupt on just one target CPU.
>>
>> That boils down to something like this:
>> struct kvm_interrupt_data {
>> __u64 interrupt_number;
>> cpuset_t possible_target_cpus;
>> }
>> and an KVM_INJECT_INTERRUPT common ioctl for the vm to provide this.
>
> Are cpusets exported to userspace?
>
> x86 has something similar (IPI to a set of cpus) but it's handled 100%
> in the kernel these days.
>
No they are'nt. We'd need to come up with a different data structure
for that. Does IPI have an interrupt number too?
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47272410.9020502-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-30 12:36 ` Avi Kivity
[not found] ` <47272556.1030901-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Avi Kivity @ 2007-10-30 12:36 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Hollis Blanchard
Carsten Otte wrote:
>
>>> In addition, I would love to be able to specify which target CPUs
>>> may receive that interrupt because our IPI equivalent comes out just
>>> like a regular interrupt on just one target CPU.
>>>
>>> That boils down to something like this:
>>> struct kvm_interrupt_data {
>>> __u64 interrupt_number;
>>> cpuset_t possible_target_cpus;
>>> }
>>> and an KVM_INJECT_INTERRUPT common ioctl for the vm to provide this.
>>
>> Are cpusets exported to userspace?
>>
>> x86 has something similar (IPI to a set of cpus) but it's handled
>> 100% in the kernel these days.
>>
> No they are'nt. We'd need to come up with a different data structure
> for that.
A bitmap would do it, but what size? Expandable ones are messy.
> Does IPI have an interrupt number too?
No, it's a command (mmio) to the APIC, you tell it which vector you want
and to which cpus you want it delivered. So you can have many IPI
interrupt vectors.
--
Any sufficiently difficult bug is indistinguishable from a feature.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47272556.1030901-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-10-30 13:09 ` Carsten Otte
[not found] ` <47272D08.9080501-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 13:09 UTC (permalink / raw)
To: Avi Kivity
Cc: carsteno-tA70FqPdS9bQT0dZR+AlfA,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Hollis Blanchard
Avi Kivity wrote:
> A bitmap would do it, but what size? Expandable ones are messy.
We could have a #define KVM_CPU_BITMAP_SIZE in the arch specific
header files that go to include/asm/. For s390, we have one of our
rocket science virtualization accelerating facilities that limits us
to 64 cpus per guest. This may well be extended later on, but for now
that would be sufficient. Thinking about Christoph Lameter with his 4k
CPU boxes, I believe ia64 would want faaaar more than that.
> No, it's a command (mmio) to the APIC, you tell it which vector you want
> and to which cpus you want it delivered. So you can have many IPI
> interrupt vectors.
I see. But the interrupt vector can be encoded in __u64?
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47272D08.9080501-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-30 13:50 ` Avi Kivity
2007-10-30 15:02 ` Dong, Eddie
1 sibling, 0 replies; 72+ messages in thread
From: Avi Kivity @ 2007-10-30 13:50 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Hollis Blanchard
Carsten Otte wrote:
> Avi Kivity wrote:
>> A bitmap would do it, but what size? Expandable ones are messy.
> We could have a #define KVM_CPU_BITMAP_SIZE in the arch specific
> header files that go to include/asm/. For s390, we have one of our
> rocket science virtualization accelerating facilities that limits us
> to 64 cpus per guest. This may well be extended later on, but for now
> that would be sufficient. Thinking about Christoph Lameter with his 4k
> CPU boxes, I believe ia64 would want faaaar more than that.
>
If there's a single variable length array (which is the case here) it
can be tucked on at the end:
struct kvm_ipi {
__u64 vector;
__u32 size; /* bytes, must be multiple of 8 */
__u32 pad;
__u64 cpuset[0];
};
We have this in a few places. Not pretty, but serviceable.
>> No, it's a command (mmio) to the APIC, you tell it which vector you
>> want and to which cpus you want it delivered. So you can have many
>> IPI interrupt vectors.
> I see. But the interrupt vector can be encoded in __u64?
>
The vector is just a u8.
The x86 interrupt path looks like this:
[devices] -- irq --> [interrupt controllers] ---- vector ---> [processor]
The interrupt controllers translate irq lines into vectors, which the
processor consumes. Before kvm-irqchip, the API taked about vectors
since the interrupt controller was in userspace. Nowadays userspace
talks irq lines to the kernel, which converts them into vectors.
If I uderstand correctly, s390 is interrupt vector oriented, no?
--
Any sufficiently difficult bug is indistinguishable from a feature.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47272D08.9080501-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 13:50 ` Avi Kivity
@ 2007-10-30 15:02 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CECA8-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
1 sibling, 1 reply; 72+ messages in thread
From: Dong, Eddie @ 2007-10-30 15:02 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA, Avi Kivity
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Hollis Blanchard,
Zhang, Xiantao
kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org wrote:
> Avi Kivity wrote:
>> A bitmap would do it, but what size? Expandable ones are messy.
> We could have a #define KVM_CPU_BITMAP_SIZE in the arch specific
> header files that go to include/asm/. For s390, we have one of our
> rocket science virtualization accelerating facilities that limits us
> to 64 cpus per guest. This may well be extended later on, but for now
> that would be sufficient. Thinking about Christoph Lameter with his 4k
> CPU boxes, I believe ia64 would want faaaar more than that.
>
IA64/KVM will handle interrupt in kernel including IPI IMO, so what
user level need to tell kernel is which platform IRQ pin is set/cleared.
Can't S390 do in similar way? From platform point of view, each
irq can have a unique # and the device itself doesn;t need to know
which CPU will receive it. Are talking about having your interrupt
controller in user space? or I missed something.
Love to study the spec later :-)
Eddie
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CECA8-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-30 15:57 ` Carsten Otte
[not found] ` <47275450.5010205-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-10-30 15:57 UTC (permalink / raw)
To: Dong, Eddie
Cc: carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Hollis Blanchard,
carsteno-tA70FqPdS9bQT0dZR+AlfA, Avi Kivity,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Zhang, Xiantao
Dong, Eddie wrote:
> IA64/KVM will handle interrupt in kernel including IPI IMO, so what
> user level need to tell kernel is which platform IRQ pin is set/cleared.
>
> Can't S390 do in similar way? From platform point of view, each
> irq can have a unique # and the device itself doesn;t need to know
> which CPU will receive it. Are talking about having your interrupt
> controller in user space? or I missed something.
We don't have interrupt controllers in the first place, and therefore
we don't need to emulate them. We want to handle IPI inside the kernel
too, and we also need to be able to inject interrupts from userspace.
Would you be able to encode your interrupt related information into an
__u64 data type? Do all CPUs have the same interrupts pending, or is
the information per-cpu? Does the data structure that Avi suggested
fit your interrupt injection needs?
struct kvm_interrupt {
__u64 vector;
__u32 size; /* bytes, must be multiple of 8 */
__u32 pad;
__u64 cpuset[0];
};
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <47275450.5010205-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-10-30 23:10 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CECF4-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Dong, Eddie @ 2007-10-30 23:10 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Hollis Blanchard,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Avi Kivity
Carsten Otte wrote:
> Dong, Eddie wrote:
>> IA64/KVM will handle interrupt in kernel including IPI IMO, so what
>> user level need to tell kernel is which platform IRQ pin is
>> set/cleared.
>>
>> Can't S390 do in similar way? From platform point of view, each
>> irq can have a unique # and the device itself doesn;t need to know
>> which CPU will receive it. Are talking about having your interrupt
>> controller in user space? or I missed something.
> We don't have interrupt controllers in the first place, and therefore
> we don't need to emulate them. We want to handle IPI inside the kernel
> too, and we also need to be able to inject interrupts from userspace.
> Would you be able to encode your interrupt related information into an
> __u64 data type? Do all CPUs have the same interrupts pending, or is
> the information per-cpu? Does the data structure that Avi suggested
> fit your interrupt injection needs?
>
> struct kvm_interrupt {
> __u64 vector;
> __u32 size; /* bytes, must be multiple of 8 */
> __u32 pad; __u64 cpuset[0];
> };
Since IA64 & X86 doesn't carry CPU info in the KVM_IRQ_LINE,
only irq # is carried, so a u32 is enough, but definitely structure like
above can be too.
BTW, why we use vector here? shouldn't it be irq_line or irq_no?
Eddie
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CECF4-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-10-31 14:21 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A0250D495-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Dong, Eddie @ 2007-10-31 14:21 UTC (permalink / raw)
To: Dong, Eddie, carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Hollis Blanchard, Avi Kivity
> BTW, why we use vector here? shouldn't it be irq_line or irq_no?
Maybe you mean the Channel Subsystem (1st piece of knowledge and
surprise known from s390 doc) are emulated in Qemu, correct?
Eddie
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <10EA09EFD8728347A513008B6B0DA77A0250D495-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-11-05 9:00 ` Carsten Otte
[not found] ` <472EDBAF.30000-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-11-05 9:00 UTC (permalink / raw)
To: Dong, Eddie
Cc: carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Hollis Blanchard,
carsteno-tA70FqPdS9bQT0dZR+AlfA, Avi Kivity,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Zhang, Xiantao
Dong, Eddie wrote:
>> BTW, why we use vector here? shouldn't it be irq_line or irq_no?
>
> Maybe you mean the Channel Subsystem (1st piece of knowledge and
> surprise known from s390 doc) are emulated in Qemu, correct?
The vector field was introduced by Avi's comment. I just copied that
over.
On s390, we only have irq numbers, no vectors. For now, we don't want
to emulate the channel subsystem, just paravirt. Technically, we could
do a passthrough in the long term just like pci devices can be
dedicated to a guest using an iommu in the memory mapped I/O world.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <472EDBAF.30000-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-11-05 9:31 ` Arnd Bergmann
[not found] ` <200711051031.10846.arnd-r2nGTMty4D4@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Arnd Bergmann @ 2007-11-05 9:31 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Zhang, Xiantao,
Avi Kivity, Hollis Blanchard
On Monday 05 November 2007, Carsten Otte wrote:
> Dong, Eddie wrote:
> >> BTW, why we use vector here? shouldn't it be irq_line or irq_no?
> >
> > Maybe you mean the Channel Subsystem (1st piece of knowledge and
> > surprise known from s390 doc) are emulated in Qemu, correct?
> The vector field was introduced by Avi's comment. I just copied that
> over.
> On s390, we only have irq numbers, no vectors.
Actually, you have neither irq numbers nor vectors on s390 right now.
I/O subchannels are do not fit into the IRQ handling in Linux at
all, and external interrupts are sufficiently different that you
should not treat them as IRQ lines in Linux.
However, I would suggest that you use either one external interrupt or
the "thin" interrupt as an event source for an interrupt controller for
all the virtio devices, and use the generic IRQ subsystem for that,
including interrupt lines and vectors.
In case of the thin interrupt, your virtual interrupt controller would
more or less just consist of one lowcore address from which you can
read the pending interrupt vector after an interrupt has been caused,
as well as a single hcall that does a 'acknowledge interrupt, get
next pending irq vector into lowcore and tell me whether there was
one' operation.
You'll also need an operation to associate a virtio device with an
interrupt vector, but that belongs into virtio.
Arnd <><
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <200711051031.10846.arnd-r2nGTMty4D4@public.gmane.org>
@ 2007-11-05 9:46 ` Carsten Otte
[not found] ` <472EE682.9000202-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Carsten Otte @ 2007-11-05 9:46 UTC (permalink / raw)
To: Arnd Bergmann
Cc: carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Christian Borntraeger,
Hollis Blanchard, kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
Avi Kivity, carsteno-tA70FqPdS9bQT0dZR+AlfA, Martin Schwidefsky,
Zhang, Xiantao
Arnd Bergmann wrote:
> On Monday 05 November 2007, Carsten Otte wrote:
>> Dong, Eddie wrote:
>>>> BTW, why we use vector here? shouldn't it be irq_line or irq_no?
>>> Maybe you mean the Channel Subsystem (1st piece of knowledge and
>>> surprise known from s390 doc) are emulated in Qemu, correct?
>> The vector field was introduced by Avi's comment. I just copied that
>> over.
>> On s390, we only have irq numbers, no vectors.
>
> Actually, you have neither irq numbers nor vectors on s390 right now.
> I/O subchannels are do not fit into the IRQ handling in Linux at
> all, and external interrupts are sufficiently different that you
> should not treat them as IRQ lines in Linux.
We're not emulating the I/O subsystem, and thus no I/O subchannels.
> However, I would suggest that you use either one external interrupt or
> the "thin" interrupt as an event source for an interrupt controller for
> all the virtio devices, and use the generic IRQ subsystem for that,
> including interrupt lines and vectors.
>
> In case of the thin interrupt, your virtual interrupt controller would
> more or less just consist of one lowcore address from which you can
> read the pending interrupt vector after an interrupt has been caused,
> as well as a single hcall that does a 'acknowledge interrupt, get
> next pending irq vector into lowcore and tell me whether there was
> one' operation.
>
> You'll also need an operation to associate a virtio device with an
> interrupt vector, but that belongs into virtio.
The irq subsystem does not fit the external interrupt model, and you'd
definitely want to argue with Martin before suggesting to introduce
the IRQ subsystem on s390. "Only over my dead body" was the last
statement I do remember.
Plus I don't see a benefit from pretending to have an interrupt
controller: virtio abstracts from this, and can well be implemented
over extint and hypercall like Christian has done it. What's the
problem you're trying to solve?
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <472EE682.9000202-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
@ 2007-11-05 10:03 ` Arnd Bergmann
[not found] ` <200711051104.01061.arnd-r2nGTMty4D4@public.gmane.org>
0 siblings, 1 reply; 72+ messages in thread
From: Arnd Bergmann @ 2007-11-05 10:03 UTC (permalink / raw)
To: carsteno-tA70FqPdS9bQT0dZR+AlfA
Cc: carsteno-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8, Hollis Blanchard,
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Avi Kivity,
Christian Borntraeger, Martin Schwidefsky, Zhang, Xiantao
On Monday 05 November 2007, Carsten Otte wrote:
> > Actually, you have neither irq numbers nor vectors on s390 right now.
> > I/O subchannels are do not fit into the IRQ handling in Linux at
> > all, and external interrupts are sufficiently different that you
> > should not treat them as IRQ lines in Linux.
<snip>
> The irq subsystem does not fit the external interrupt model, and you'd
> definitely want to argue with Martin before suggesting to introduce
> the IRQ subsystem on s390. "Only over my dead body" was the last
> statement I do remember.
Read again what I wrote above. I'm suggesting to have just one external
interrupt for virtio and use the generic IRQ abstraction to handle
everything that comes below that.
> Plus I don't see a benefit from pretending to have an interrupt
> controller: virtio abstracts from this, and can well be implemented
> over extint and hypercall like Christian has done it. What's the
> problem you're trying to solve?
Sorry, I can't find Christian's code right now, do you have a pointer
to the patches?
I suspect that he has done exactly what I was trying to explain, except
that the implementation is not using the generic IRQ layer, which means
you're duplicating some of the code.
Arnd <><
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
* Re: RFC/patch portability: split kvm_vm_ioctl v3
[not found] ` <200711051104.01061.arnd-r2nGTMty4D4@public.gmane.org>
@ 2007-11-05 10:31 ` Christian Borntraeger
0 siblings, 0 replies; 72+ messages in thread
From: Christian Borntraeger @ 2007-11-05 10:31 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
cotte-tA70FqPdS9bQT0dZR+AlfA
Cc: Martin Schwidefsky, Avi Kivity, Zhang, Xiantao, Hollis Blanchard
Am Montag, 5. November 2007 schrieb Arnd Bergmann:
> Read again what I wrote above. I'm suggesting to have just one external
> interrupt for virtio and use the generic IRQ abstraction to handle
> everything that comes below that.
So you basically suggest to implement wrapper code around extint and lowcore
memory to be able to use request_irq/free_irq?
> > Plus I don't see a benefit from pretending to have an interrupt
> > controller: virtio abstracts from this, and can well be implemented
> > over extint and hypercall like Christian has done it. What's the
> > problem you're trying to solve?
>
> Sorry, I can't find Christian's code right now, do you have a pointer
> to the patches?
The code was only used for our prototype hypervisor. I never posted these
virtio patches as Rusty was quicker in changing virtio than I was able to
re-add them to our prototype code. ;-)
> I suspect that he has done exactly what I was trying to explain, except
> that the implementation is not using the generic IRQ layer, which means
> you're duplicating some of the code.
I used one external interrupt and I reserved an area in lowcore for a 64bit
extint parameter. (I use the same address as z/VM for the PFAULT token). I
defined a hypercall in which the guest could specify this 64bit value for a
given virtqueue. That allowed me to get the virtqueue pointer without looking
it up in the list of (maybe many) virtqueues.
Christian
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
^ permalink raw reply [flat|nested] 72+ messages in thread
end of thread, other threads:[~2007-11-05 10:31 UTC | newest]
Thread overview: 72+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-12 12:34 RFC/patch portability: split kvm_vm_ioctl Carsten Otte
[not found] ` <1192192452.7630.16.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-12 13:37 ` Arnd Bergmann
[not found] ` <200710121537.09238.arnd-r2nGTMty4D4@public.gmane.org>
2007-10-12 13:47 ` Carsten Otte
2007-10-12 15:08 ` Anthony Liguori
[not found] ` <470F8DFD.6030205-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
2007-10-13 7:31 ` Carsten Otte
2007-10-13 4:08 ` Zhang, Xiantao
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC808DB9-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-13 7:38 ` Carsten Otte
2007-10-13 7:47 ` Avi Kivity
[not found] ` <471077F9.8000703-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-13 7:52 ` Carsten Otte
2007-10-15 8:18 ` Carsten Otte
[not found] ` <47132260.9030606-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-15 8:30 ` Christian Ehrhardt
2007-10-15 8:32 ` Avi Kivity
2007-10-25 15:48 ` RFC/patch portability: split kvm_vm_ioctl v2 Carsten Otte
[not found] ` <1193327325.8345.9.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-25 15:48 ` Izik Eidus
[not found] ` <1193327326.3284.2.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
2007-10-25 16:22 ` Hollis Blanchard
2007-10-25 16:42 ` Izik Eidus
2007-10-25 22:12 ` Izik Eidus
[not found] ` <472114B6.6080000-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-25 20:51 ` [kvm-ppc-devel] " Hollis Blanchard
2007-10-25 22:58 ` Izik Eidus
[not found] ` <47211F86.1030504-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 0:19 ` Izik Eidus
[not found] ` <472132A4.604-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 8:17 ` Carsten Otte
2007-10-26 8:12 ` Avi Kivity
[not found] ` <4721A185.1070808-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 8:21 ` Carsten Otte
[not found] ` <4721A3A3.8020504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 8:41 ` Carsten Otte
[not found] ` <4721A82A.2040402-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 9:22 ` Avi Kivity
[not found] ` <4721B1ED.6040006-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 10:30 ` Carsten Otte
[not found] ` <4721C1DB.3040207-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 10:36 ` Avi Kivity
[not found] ` <4721C330.3030302-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 10:42 ` Carsten Otte
[not found] ` <4721C47E.30800-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 10:45 ` Avi Kivity
[not found] ` <4721C53E.1070507-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 11:45 ` Carsten Otte
[not found] ` <4721D344.2020508-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 11:47 ` Avi Kivity
[not found] ` <4721D3C2.8090407-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-26 12:23 ` Carsten Otte
[not found] ` <4721DC5D.702-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 12:31 ` Avi Kivity
2007-10-26 9:08 ` Avi Kivity
2007-10-26 14:35 ` Hollis Blanchard
2007-10-26 14:43 ` Carsten Otte
[not found] ` <4721FD2A.6070504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-26 19:05 ` Izik Eidus
[not found] ` <47223A85.5020409-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-29 8:04 ` Carsten Otte
2007-10-27 7:59 ` Avi Kivity
[not found] ` <4722EFE1.9060609-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-28 7:39 ` Zhang, Xiantao
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC8B512C-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-28 9:57 ` Avi Kivity
[not found] ` <47245D27.5030105-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-29 8:01 ` Carsten Otte
[not found] ` <47259352.3010109-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-29 8:03 ` Izik Eidus
[not found] ` <1193644998.4484.8.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
2007-10-29 8:16 ` Carsten Otte
2007-10-26 8:28 ` Carsten Otte
2007-10-26 1:05 ` Zhang, Xiantao
[not found] ` <42DFA526FC41B1429CE7279EF83C6BDC85FD78-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-26 14:53 ` Carsten Otte
2007-10-26 12:01 ` RFC/patch portability: split kvm_vm_ioctl v3 Carsten Otte
[not found] ` <1193400099.10970.8.camel-WIxn4w2hgUz3YA32ykw5MLlKpX0K8NHHQQ4Iyu8u01E@public.gmane.org>
2007-10-26 18:32 ` Hollis Blanchard
2007-10-30 10:51 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC4D-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-30 11:03 ` Avi Kivity
[not found] ` <47270F9E.5080007-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-30 11:27 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC54-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-30 11:59 ` Carsten Otte
[not found] ` <47271C9B.1050804-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 12:15 ` Avi Kivity
[not found] ` <4727204E.6000606-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-30 12:31 ` Carsten Otte
[not found] ` <47272410.9020502-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 12:36 ` Avi Kivity
[not found] ` <47272556.1030901-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-30 13:09 ` Carsten Otte
[not found] ` <47272D08.9080501-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 13:50 ` Avi Kivity
2007-10-30 15:02 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CECA8-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-30 15:57 ` Carsten Otte
[not found] ` <47275450.5010205-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 23:10 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CECF4-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-31 14:21 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A0250D495-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-11-05 9:00 ` Carsten Otte
[not found] ` <472EDBAF.30000-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-11-05 9:31 ` Arnd Bergmann
[not found] ` <200711051031.10846.arnd-r2nGTMty4D4@public.gmane.org>
2007-11-05 9:46 ` Carsten Otte
[not found] ` <472EE682.9000202-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-11-05 10:03 ` Arnd Bergmann
[not found] ` <200711051104.01061.arnd-r2nGTMty4D4@public.gmane.org>
2007-11-05 10:31 ` Christian Borntraeger
2007-10-30 11:44 ` Carsten Otte
[not found] ` <47271927.9060602-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 11:52 ` Avi Kivity
2007-10-30 11:29 ` Carsten Otte
[not found] ` <472715A9.4050201-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-30 11:35 ` Dong, Eddie
[not found] ` <10EA09EFD8728347A513008B6B0DA77A024CEC59-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-30 12:18 ` Carsten Otte
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox