|
From: <sv...@va...> - 2015-08-13 20:35:11
|
Author: florian
Date: Thu Aug 13 21:35:03 2015
New Revision: 15538
Log:
Improve mmap MAP_HUGETLB support.
This is a follow up to r14682:
When an mmap retry is done without any constraints, the kernel can
place it into free or reservation segments (i.e. anywhere there is no
mapping yet).
In r14682 a sanity check made the hypothesis that the new mapping was
in a free segment, but it does not hold at least on Linux 3.12 and 3.16
on amd64 (tested under Debian).
There is no risk in allowing the mapping to end up in (what was
previously) a reservation at this point, because it is also allowed.
Patch by Guillaume Knispel <xi...@gm...>. Fixes BZ #348269.
Modified:
trunk/NEWS
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/docs/internals/3_10_BUGSTATUS.txt
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Thu Aug 13 21:35:03 2015
@@ -267,6 +267,7 @@
== 345929
348102 Patch updating v4l2 API support
348247 jno jumps wrongly when overflow is not set
+348269 Improve mmap MAP_HUGETLB support.
348565 Fix detection of command line option availability for clang
348728 Fix broken check for VIDIOC_G_ENC_INDEX
348748 Fix redundant condition
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-generic.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c Thu Aug 13 21:35:03 2015
@@ -2323,9 +2323,9 @@
to understand special file system mount options).
So, let's just redo an mmap, without giving any constraint to
the kernel. If that succeeds, check with aspacem that the returned
- address is acceptable (i.e. is free).
+ address is acceptable.
This will give a similar effect as if the user would have
- specified a MAP_FIXED at that address.
+ hinted that address.
The aspacem state will be correctly updated afterwards.
We however cannot do this last refinement when the user asked
for a fixed mapping, as the user asked a specific address. */
@@ -2337,8 +2337,18 @@
arg4,
arg5, arg6);
if (!sr_isError(sres)) {
- vg_assert(VG_(am_covered_by_single_free_segment)((Addr)sr_Res(sres),
- arg2));
+ /* The kernel is supposed to know what it is doing, but let's
+ do a last sanity check anyway, as if the chosen address had
+ been initially hinted by the client. The whole point of this
+ last try was to allow mmap of huge pages to succeed without
+ making aspacem understand them, on the other hand the kernel
+ does not know about valgrind reservations, so this mapping
+ can end up in free space and reservations. */
+ mreq.start = (Addr)sr_Res(sres);
+ mreq.len = arg2;
+ mreq.rkind = MHint;
+ advised = VG_(am_get_advisory)( &mreq, True/*client*/, &mreq_ok );
+ vg_assert(mreq_ok && advised == mreq.start);
}
}
Modified: trunk/docs/internals/3_10_BUGSTATUS.txt
==============================================================================
--- trunk/docs/internals/3_10_BUGSTATUS.txt (original)
+++ trunk/docs/internals/3_10_BUGSTATUS.txt Thu Aug 13 21:35:03 2015
@@ -144,8 +144,6 @@
345414 WARNING: unhandled syscall: 317 (sys_seccomp)
-348269 support of mmap for huge pages is broken at least on amd64
-
348616 Wine/valgrind: Warning: noted but unhandled ioctl 0x5390 with
no size/direction hints. (DVD_READ_STRUCT)
|