Message ID | 1450919253-3237-1-git-send-email-chengang@emindsoft.com.cn |
---|---|
State | New |
Headers | show |
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) >
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>
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.
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 --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)