xen: Avoid useless allocation in Xen case.

Submitted by Anthony PERARD on Aug. 1, 2011, 7:26 p.m.

Details

Message ID 1312226782-26882-1-git-send-email-anthony.perard@citrix.com
State New
Headers show

Commit Message

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(-)

Comments

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 hide | download patch | download mbox

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);