Patchwork xen: Avoid useless allocation in Xen case.

login
register
mail settings
Submitter Anthony PERARD
Date Aug. 1, 2011, 7:26 p.m.
Message ID <1312226782-26882-1-git-send-email-anthony.perard@citrix.com>
Download mbox | patch
Permalink /patch/107795/
State New
Headers show

Comments

Anthony PERARD - Aug. 1, 2011, 7:26 p.m.
The code_gen_buffer is not use by Xen and can be really big (several
GB). Even if the host RAM is not used, this buffer just burn the address
space of the QEMU process.

So to "avoid" this allocation, the asked tb_size is set to the minimum.

The other way to do that would be to not call code_gen_alloc when Xen is
enabled.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 vl.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
Jan Kiszka - Aug. 1, 2011, 7:57 p.m.
On 2011-08-01 21:26, Anthony PERARD wrote:
> The code_gen_buffer is not use by Xen and can be really big (several
> GB). Even if the host RAM is not used, this buffer just burn the address
> space of the QEMU process.
> 
> So to "avoid" this allocation, the asked tb_size is set to the minimum.
> 
> The other way to do that would be to not call code_gen_alloc when Xen is
> enabled.
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  vl.c |    8 ++++++++
>  1 files changed, 8 insertions(+), 0 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index d8c7c01..bd60a89 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3106,6 +3106,14 @@ int main(int argc, char **argv, char **envp)
>          }
>      }
>  
> +    if (xen_enabled()) {
> +        /* Allocate only the minimum amount of memory for the code_gen_buffer.
> +         * Xen does not use it and we need the virtual address space for the
> +         * MapCache.
> +         */
> +        tb_size = 1;
> +    }
> +

The same applies to kvm, please generalize.

Jan
Jan Kiszka - Aug. 2, 2011, 10:49 a.m.
On 2011-08-01 21:57, Jan Kiszka wrote:
> On 2011-08-01 21:26, Anthony PERARD wrote:
>> The code_gen_buffer is not use by Xen and can be really big (several
>> GB). Even if the host RAM is not used, this buffer just burn the address
>> space of the QEMU process.
>>
>> So to "avoid" this allocation, the asked tb_size is set to the minimum.
>>
>> The other way to do that would be to not call code_gen_alloc when Xen is
>> enabled.
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>>  vl.c |    8 ++++++++
>>  1 files changed, 8 insertions(+), 0 deletions(-)
>>
>> diff --git a/vl.c b/vl.c
>> index d8c7c01..bd60a89 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -3106,6 +3106,14 @@ int main(int argc, char **argv, char **envp)
>>          }
>>      }
>>  
>> +    if (xen_enabled()) {
>> +        /* Allocate only the minimum amount of memory for the code_gen_buffer.
>> +         * Xen does not use it and we need the virtual address space for the
>> +         * MapCache.
>> +         */
>> +        tb_size = 1;
>> +    }
>> +
> 
> The same applies to kvm, please generalize.

Actually, qemu-kvm avoids this overhead today by making code_gen_alloc
return immediately when kvm is on. Also not very beautiful.

Can't we simply skip cpu_exec_init_all for any accel != TCG, e.g. by
moving that call to tcg_init?

Jan
Anthony PERARD - Aug. 2, 2011, 12:13 p.m.
On Tue, Aug 2, 2011 at 11:49, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>> The same applies to kvm, please generalize.
>
> Actually, qemu-kvm avoids this overhead today by making code_gen_alloc
> return immediately when kvm is on. Also not very beautiful.
>
> Can't we simply skip cpu_exec_init_all for any accel != TCG, e.g. by
> moving that call to tcg_init?

In the function cpu_exec_init_all(), the call to cpu_gen_init() (and I
suppose to io_mem_init()) is still required. So we can not move the
whole function to tcg_init().

But I can maybe use "if (!tcg_enabled())" instead of a check to xen.
Until no tcg code is use when kvm/xen is enabled.
Jan Kiszka - Aug. 2, 2011, 12:49 p.m.
On 2011-08-02 14:13, Anthony PERARD wrote:
> On Tue, Aug 2, 2011 at 11:49, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>>> The same applies to kvm, please generalize.
>>
>> Actually, qemu-kvm avoids this overhead today by making code_gen_alloc
>> return immediately when kvm is on. Also not very beautiful.
>>
>> Can't we simply skip cpu_exec_init_all for any accel != TCG, e.g. by
>> moving that call to tcg_init?
> 
> In the function cpu_exec_init_all(), the call to cpu_gen_init() (and I
> suppose to io_mem_init()) is still required. So we can not move the
> whole function to tcg_init().
> 
> But I can maybe use "if (!tcg_enabled())" instead of a check to xen.
> Until no tcg code is use when kvm/xen is enabled.

I would prefer to take the chance and clean up. Anything TCG related
belongs to tcg_init (or a function called from it). Shared services
should be initialized as before. Will send a patch to make a start.

Jan

Patch

diff --git a/vl.c b/vl.c
index d8c7c01..bd60a89 100644
--- a/vl.c
+++ b/vl.c
@@ -3106,6 +3106,14 @@  int main(int argc, char **argv, char **envp)
         }
     }
 
+    if (xen_enabled()) {
+        /* Allocate only the minimum amount of memory for the code_gen_buffer.
+         * Xen does not use it and we need the virtual address space for the
+         * MapCache.
+         */
+        tb_size = 1;
+    }
+
     /* init the dynamic translator */
     cpu_exec_init_all(tb_size * 1024 * 1024);