public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Cc: kvm-devel <kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
Subject: Re: [patch] kvmctl.c: allow custom memory setup.
Date: Thu, 18 Oct 2007 13:06:09 +0200	[thread overview]
Message-ID: <47173E21.3010502@redhat.com> (raw)
In-Reply-To: <471737E8.6000708-atKUWr5tajBWk0Htik3J/w@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 1963 bytes --]

Avi Kivity wrote:
> Izik Eidus wrote:
>> On Thu, 2007-10-18 at 12:18 +0200, Gerd Hoffmann wrote:
>> 
>>>>> I don't see how I can pass a pointer to
>>>>> kvm_create_userspace_memory() via kvm_create() without
>>>>> breaking the libkvm interface.  There is no flags field or
>>>>> similar which could be used to signal "vm_mem is a valid 
>>>>> pointer, please use that instead of mmap()'ing anonymous
>>>>> memory".
>>>>> 
>>>> There is no need to keep binary compat to libkvm as long as it
>>>> is linked statically.

>> anyone who use kvmctl, should not call kvm_create_userspace_memory 
>> directly, instead should call kvm_create()...

I'm talking about the kvm_create() interface, dammit.  Sure I can modify
kvm_create_userspace_memory() without breaking anyone as this isn't part
of the public (kvmctl.h) interface.  That doesn't buy us much though.
I'd have to pass the pointer to kvm_create() somehow so it can be passed
down to kvm_create_userspace_memory().  I can't without breaking the
public library interface though.

> Why not have an API for creating memory slots?  It allows much more 
> flexibility and is more in line with what qemu wants.

This *is* what the patch does.  It adds a function to add a
userspace-memory-backed memory slot: kvm_register_userspace_phys_mem().

That alone doesn't cut it though as there are some more constrains:

 * kvm_create() builds a standard memory layout, which I want be able
   to skip.
 * kvm_create() fails to create a vcpu in case no memory is available,
   which makes simple approach to just ask kvm_create() for 0 bytes
   physical memory for the guest unusable.

Thats why I went the route to additionally split the job kvm_create()
does into multiple, individually callable pieces.  So I can first create
the vm, then create my custom memory slots (instead of the standard
setup built by kvm_create_userspace_memory()), then create the vcpu.

cheers,
  Gerd

ps: patch attached again for reference.

[-- Attachment #2: kvm-user-memory.diff --]
[-- Type: text/x-patch, Size: 3997 bytes --]

* split kvm_create() into smaller pieces which can be individually
  called if needed.
* add kvm_register_userspace_phys_mem() function.
---
 user/kvmctl.c |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 user/kvmctl.h |    8 +++++++
 2 files changed, 64 insertions(+), 5 deletions(-)

Index: kvm-46/user/kvmctl.c
===================================================================
--- kvm-46.orig/user/kvmctl.c
+++ kvm-46/user/kvmctl.c
@@ -427,12 +427,9 @@ int kvm_alloc_userspace_memory(kvm_conte
 	return 0;
 }
 
-int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
+int kvm_create_vm(kvm_context_t kvm)
 {
-	unsigned long memory = (phys_mem_bytes + PAGE_SIZE - 1) & PAGE_MASK;
 	int fd = kvm->fd;
-	int zfd;
-	int r;
 
 	kvm->vcpu_fd[0] = -1;
 
@@ -442,6 +439,15 @@ int kvm_create(kvm_context_t kvm, unsign
 		return -1;
 	}
 	kvm->vm_fd = fd;
+	return 0;
+}
+
+int kvm_create_default_phys_mem(kvm_context_t kvm, unsigned long phys_mem_bytes,
+				void **vm_mem)
+{
+	unsigned long memory = (phys_mem_bytes + PAGE_SIZE - 1) & PAGE_MASK;
+	int zfd;
+	int r;
 
 	r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY);
 	if (r > 0)
@@ -457,18 +463,37 @@ int kvm_create(kvm_context_t kvm, unsign
         close(zfd);
 
 	kvm->physical_memory = *vm_mem;
+	return 0;
+}
+
+void kvm_create_irqchip(kvm_context_t kvm)
+{
+	int r;
 
 	kvm->irqchip_in_kernel = 0;
 	if (!kvm->no_irqchip_creation) {
 		r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_IRQCHIP);
 		if (r > 0) {	/* kernel irqchip supported */
-			r = ioctl(fd, KVM_CREATE_IRQCHIP);
+			r = ioctl(kvm->vm_fd, KVM_CREATE_IRQCHIP);
 			if (r >= 0)
 				kvm->irqchip_in_kernel = 1;
 			else
 				printf("Create kernel PIC irqchip failed\n");
 		}
 	}
+}
+
+int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
+{
+	int r;
+
+	r = kvm_create_vm(kvm);
+	if (r < 0)
+		return r;
+	r = kvm_create_default_phys_mem(kvm, phys_mem_bytes, vm_mem);
+	if (r < 0)
+		return r;
+	kvm_create_irqchip(kvm);
 	r = kvm_create_vcpu(kvm, 0);
 	if (r < 0)
 		return r;
@@ -558,6 +583,32 @@ void *kvm_create_phys_mem(kvm_context_t 
 								log, writable);
 }
 
+int kvm_register_userspace_phys_mem(kvm_context_t kvm,
+			unsigned long phys_start, void *userspace_addr,
+			unsigned long len, int slot, int log)
+{
+	struct kvm_userspace_memory_region memory = {
+		.slot = slot,
+		.memory_size = len,
+		.guest_phys_addr = phys_start,
+		.userspace_addr = (intptr_t)userspace_addr,
+		.flags = log ? KVM_MEM_LOG_DIRTY_PAGES : 0,
+	};
+	int r;
+
+	if (!kvm->physical_memory)
+		kvm->physical_memory = userspace_addr - phys_start;
+
+	r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &memory);
+	if (r == -1) {
+		fprintf(stderr, "create_userspace_phys_mem: %s", strerror(errno));
+		return -1;
+	}
+
+	kvm_userspace_memory_region_save_params(kvm, &memory);
+        return 0;
+}
+
 /* destroy/free a whole slot.
  * phys_start, len and slot are the params passed to kvm_create_phys_mem()
  */
Index: kvm-46/user/kvmctl.h
===================================================================
--- kvm-46.orig/user/kvmctl.h
+++ kvm-46/user/kvmctl.h
@@ -137,6 +137,11 @@ int kvm_get_shadow_pages(kvm_context_t k
 int kvm_create(kvm_context_t kvm,
 	       unsigned long phys_mem_bytes,
 	       void **phys_mem);
+int kvm_create_vm(kvm_context_t kvm);
+int kvm_create_default_phys_mem(kvm_context_t kvm, unsigned long phys_mem_bytes,
+				void **vm_mem);
+void kvm_create_irqchip(kvm_context_t kvm);
+
 /*!
  * \brief Create a new virtual cpu
  *
@@ -404,6 +409,9 @@ void *kvm_create_phys_mem(kvm_context_t,
 			  unsigned long len, int slot, int log, int writable);
 void kvm_destroy_phys_mem(kvm_context_t, unsigned long phys_start, 
 			  unsigned long len, int slot);
+int kvm_register_userspace_phys_mem(kvm_context_t kvm,
+			unsigned long phys_start, void *userspace_addr,
+			unsigned long len, int slot, int log);
 int kvm_get_dirty_pages(kvm_context_t, int slot, void *buf);
 
 

[-- Attachment #3: 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 #4: 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

  parent reply	other threads:[~2007-10-18 11:06 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-10  8:28 [ANNOUNCE] kvm-46 release Avi Kivity
     [not found] ` <470C8D28.2060408-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10  8:39   ` Jun Koi
     [not found]     ` <fdaac4d50710100139v204e0e1du21efc51df95f77e7-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-10-10  8:41       ` Avi Kivity
     [not found]         ` <470C9034.2000206-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10  9:04           ` Jun Koi
     [not found]             ` <fdaac4d50710100204n23a3486bk3012fa995b14455d-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-10-10  9:07               ` Avi Kivity
     [not found]                 ` <470C9660.8090700-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-11  1:02                   ` Jun Koi
     [not found]                     ` <fdaac4d50710101802u27013e48l8c88641a904f6ef8-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-10-11  1:13                       ` Anthony Liguori
2007-10-10  9:52   ` Farkas Levente
     [not found]     ` <470CA0DB.8020303-lWVWdrzSO4GHXe+LvDLADg@public.gmane.org>
2007-10-10 10:08       ` Avi Kivity
     [not found]         ` <470CA4AA.6020909-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10 10:18           ` Farkas Levente
2007-10-10 10:16       ` Farkas Levente
2007-10-10 11:24   ` Farkas Levente
     [not found]     ` <470CB672.4070209-lWVWdrzSO4GHXe+LvDLADg@public.gmane.org>
2007-10-10 11:28       ` Avi Kivity
     [not found]         ` <470CB75E.4000404-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10 11:35           ` Farkas Levente
     [not found]             ` <470CB91A.1020508-lWVWdrzSO4GHXe+LvDLADg@public.gmane.org>
2007-10-10 11:58               ` Avi Kivity
     [not found]                 ` <470CBE58.3040807-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10 12:49                   ` Farkas Levente
     [not found]                     ` <470CCA61.3080007-lWVWdrzSO4GHXe+LvDLADg@public.gmane.org>
2007-10-13  7:18                       ` Avi Kivity
     [not found]                         ` <47107150.3000106-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-15 14:22                           ` Farkas Levente
2007-10-10 13:39   ` Daniel P. Berrange
     [not found]     ` <20071010133912.GB1894-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-10 13:39       ` Avi Kivity
     [not found]         ` <470CD61A.4090103-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10 13:49           ` Haydn Solomon
     [not found]             ` <b75785ba0710100649y3903f0ccma8c687d033fffec7-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-10-10 14:59               ` Dor Laor
     [not found]                 ` <470CE8E7.7010001-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-10 15:22                   ` Haydn Solomon
2007-10-12  7:53   ` Gerd Hoffmann
     [not found]     ` <470F2806.8090902-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-13  7:13       ` Avi Kivity
     [not found]         ` <4710701C.2040200-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-15 10:44           ` Gerd Hoffmann
     [not found]             ` <47134476.1050609-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-15 11:00               ` Gerd Hoffmann
     [not found]                 ` <47134857.9030102-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-15 11:06                   ` Izik Eidus
     [not found]                     ` <1192446374.6578.0.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
2007-10-15 11:15                       ` Gerd Hoffmann
     [not found]                         ` <47134BC0.1000008-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-15 11:24                           ` Izik Eidus
     [not found]                             ` <1192447442.6911.5.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
2007-10-15 11:44                               ` Gerd Hoffmann
     [not found]                                 ` <47135284.1060106-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-17 10:07                                   ` [patch] kvmctl.c: allow custom memory setup Gerd Hoffmann
     [not found]                                     ` <4715DEFC.8010507-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-17 22:46                                       ` Izik Eidus
     [not found]                                         ` <471690D2.2060204-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-17 22:56                                           ` Izik Eidus
2007-10-18  7:39                                           ` Gerd Hoffmann
     [not found]                                             ` <47170D95.1050603-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-18  8:10                                               ` Dor Laor
     [not found]                                                 ` <471714FC.6050703-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-18 10:18                                                   ` Gerd Hoffmann
     [not found]                                                     ` <47173300.70907-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-18 10:30                                                       ` Izik Eidus
     [not found]                                                         ` <1192703432.3175.18.camel-siXIhNkUrCXckEVJwWePHtCfPAL7FxvL@public.gmane.org>
2007-10-18 10:39                                                           ` Avi Kivity
     [not found]                                                             ` <471737E8.6000708-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-18 11:06                                                               ` Gerd Hoffmann [this message]
     [not found]                                                                 ` <47173E21.3010502-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-18 11:21                                                                   ` Avi Kivity
     [not found]                                                                     ` <471741D1.7000500-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-18 12:24                                                                       ` Gerd Hoffmann
     [not found]                                                                         ` <47175088.7000507-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-18 12:34                                                                           ` Avi Kivity
     [not found]                                                                             ` <471752BC.90600-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-10-18 15:29                                                                               ` Gerd Hoffmann
     [not found]                                                                                 ` <47177BCF.7010309-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-10-18 16:43                                                                                   ` Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47173E21.3010502@redhat.com \
    --to=kraxel-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
    --cc=avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox