diff mbox

linux-user/mmap.c: Use end instead of real_end in target_mmap

Message ID 1450919253-3237-1-git-send-email-chengang@emindsoft.com.cn
State New
Headers show

Commit Message

Chen Gang Dec. 24, 2015, 1:07 a.m. UTC
From: Chen Gang <chengang@emindsoft.com.cn>

In this case, real_end is larger than end, which may cause mmap_frag
process the incorrect memory region.

Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
---
 linux-user/mmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Chen Gang Dec. 24, 2015, 1:21 a.m. UTC | #1
Hello all:

After this patch, the i386 wine notepad.exe can be bootup and run under
sw_64 host.

 - The initialization is very very slow (about 10 minutes), it is mainly
   running in find_vma_reserved (consume more than 95% time resource). I
   guess, it can be optimized.

 - After initialization, for real using, the performance is acceptable!!
   :-)

 - Next, I shall try the real Windows XP notepad.exe.

I guess, we need not softmmu, at least, for wine, it is true (wine will
mmap all memory areas during initializing, and manage them by itself
when real running).

Welcome any suggestions, ideas, and completions.


BTW: Merry Christmas!  :-)

Thanks.

On 2015年12月24日 09:07, chengang@emindsoft.com.cn wrote:
> From: Chen Gang <chengang@emindsoft.com.cn>
> 
> In this case, real_end is larger than end, which may cause mmap_frag
> process the incorrect memory region.
> 
> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
> ---
>  linux-user/mmap.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index 7b459d5..57b0361 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -536,7 +536,7 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
>          /* handle the end of the mapping */
>          if (end < real_end) {
>              ret = mmap_frag(real_end - qemu_host_page_size,
> -                            real_end - qemu_host_page_size, real_end,
> +                            real_end - qemu_host_page_size, end,
>                              prot, flags, fd,
>                              offset + real_end - qemu_host_page_size - start);
>              if (ret == -1)
>
Laurent Vivier Dec. 24, 2015, 9:54 a.m. UTC | #2
Le 24/12/2015 02:07, chengang@emindsoft.com.cn a écrit :
> From: Chen Gang <chengang@emindsoft.com.cn>
> 
> In this case, real_end is larger than end, which may cause mmap_frag
> process the incorrect memory region.
> 
> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
> ---
>  linux-user/mmap.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index 7b459d5..57b0361 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -536,7 +536,7 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
>          /* handle the end of the mapping */
>          if (end < real_end) {
>              ret = mmap_frag(real_end - qemu_host_page_size,
> -                            real_end - qemu_host_page_size, real_end,
> +                            real_end - qemu_host_page_size, end,
>                              prot, flags, fd,
>                              offset + real_end - qemu_host_page_size - start);
>              if (ret == -1)
> 

The fragment must effectively be mapped only to "end" not to "real_end"
(which is a host page aligned address, and thus this is not a fragment).
It is consistent with what it is done in the case of one single page.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Chen Gang Dec. 24, 2015, 3:25 p.m. UTC | #3
On 12/24/15 17:54, Laurent Vivier wrote:
> 
> Le 24/12/2015 02:07, chengang@emindsoft.com.cn a écrit :
>> From: Chen Gang <chengang@emindsoft.com.cn>
>>
>> In this case, real_end is larger than end, which may cause mmap_frag
>> process the incorrect memory region.
>>
>> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
>> ---
>>  linux-user/mmap.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
>> index 7b459d5..57b0361 100644
>> --- a/linux-user/mmap.c
>> +++ b/linux-user/mmap.c
>> @@ -536,7 +536,7 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
>>          /* handle the end of the mapping */
>>          if (end < real_end) {
>>              ret = mmap_frag(real_end - qemu_host_page_size,
>> -                            real_end - qemu_host_page_size, real_end,
>> +                            real_end - qemu_host_page_size, end,
>>                              prot, flags, fd,
>>                              offset + real_end - qemu_host_page_size - start);
>>              if (ret == -1)
>>
> 
> The fragment must effectively be mapped only to "end" not to "real_end"
> (which is a host page aligned address, and thus this is not a fragment).
> It is consistent with what it is done in the case of one single page.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>

Thank you for your comments. I only met this issue, and knew it should
be fixed in this way, but really don't know the related details.

Thanks.
Riku Voipio Jan. 11, 2016, 1:03 p.m. UTC | #4
On torstaina 24. joulukuuta 2015 11.54.09 EET, Laurent Vivier wrote:
>
> Le 24/12/2015 02:07, chengang@emindsoft.com.cn a écrit :
>> From: Chen Gang <chengang@emindsoft.com.cn>
>> 
>> In this case, real_end is larger than end, which may cause mmap_frag
>> process the incorrect memory region.
>> 
>> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
>> --- ...
>
> The fragment must effectively be mapped only to "end" not to "real_end"
> (which is a host page aligned address, and thus this is not a fragment).
> It is consistent with what it is done in the case of one single page.
>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>

Applied with changing the patch comment to Laurent's explanation.

Riku
diff mbox

Patch

diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index 7b459d5..57b0361 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -536,7 +536,7 @@  abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
         /* handle the end of the mapping */
         if (end < real_end) {
             ret = mmap_frag(real_end - qemu_host_page_size,
-                            real_end - qemu_host_page_size, real_end,
+                            real_end - qemu_host_page_size, end,
                             prot, flags, fd,
                             offset + real_end - qemu_host_page_size - start);
             if (ret == -1)