From: Liam Howlett <liam.howlett@oracle.com>
To: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: "maple-tree@lists.infradead.org" <maple-tree@lists.infradead.org>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
"damon @ lists . linux . dev" <damon@lists.linux.dev>,
SeongJae Park <sj@kernel.org>,
David Hildenbrand <david@redhat.com>,
Matthew Wilcox <willy@infradead.org>
Subject: Re: [PATCH v10 13/69] mm/mmap: use maple tree for unmapped_area{_topdown}
Date: Tue, 12 Jul 2022 01:49:12 +0000 [thread overview]
Message-ID: <20220712014902.3lfeaebfhyc4eakc@revolver> (raw)
In-Reply-To: <YskuUvl55iK+uRWf@tuxmaker.boeblingen.de.ibm.com>
* Alexander Gordeev <agordeev@linux.ibm.com> [220709 03:29]:
> On Tue, Jun 21, 2022 at 08:46:55PM +0000, Liam Howlett wrote:
> > From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
> >
> > The maple tree code was added to find the unmapped area in a previous
> > commit and was checked against what the rbtree returned, but the actual
> > result was never used. Start using the maple tree implementation and
> > remove the rbtree code.
> >
> > Add kernel documentation comment for these functions.
>
> Hi Liam,
>
> With this update a user process crash is triggered on s390 when
> the below core is executed (derived from LTP fork14 testcase):
>
> #include <unistd.h>
> #include <sys/mman.h>
>
> #define GB (1024 * 1024 * 1024L)
> #define EXTENT (16 * 1024 + 10)
>
> int main(int argc, char **argv)
> {
> void *addr;
> int i;
>
> for (i = 0; i < EXTENT; i++) {
> addr = mmap(NULL, 1 * GB, PROT_READ | PROT_WRITE,
> MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> if (addr == MAP_FAILED)
> break;
> }
>
> return 0;
> }
>
> On 4095-th iteration mmap() returns a normal address, but shared
> library mappings go away. The page tables seem to be intact as the
> memory is still available (I did not check every mapping gone though).
> In addition, the memory contents of disappeared mappings is zeroed.
> As result, an instruction that follows the mmap() system call turns
> into invalid operation code:
>
> t35lp64 login: [45116.631391] User process fault: interruption code 0004 ilc:1
> [45116.631403] Failing address: 000003ffa580c000 TEID: 000003ffa580c884
> [45116.631405] Fault in primary space mode while using user ASCE.
> [45116.631407] AS:00000000e75fc1c7 R3:00000000e758c007 S:00000000a3e01701
> [45116.631411] CPU: 4 PID: 1745 Comm: mmap Not tainted 5.19.0-rc4-00162-g34de4ebd5706 #36
> [45116.631414] Hardware name: IBM 8561 T01 703 (LPAR)
> [45116.631416] User PSW : 0705000180000000 000003ffa580cc38
> [45116.631418] R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:1 AS:0 CC:0 PM:0 RI:0 EA:3
> [45116.631420] User GPRS: 0000000000000000 000003ffa5af4040 000003ff65afb000 0000000040000000
> [45116.631422] 0000000000000003 0000000000000022 0000000000000000 0000000001003e00
> [45116.631423] 000003ffa5ab0b48 000003ffa5ab1018 0000000000000001 000003fff5879500
> [45116.631425] 000003ffa5ab0f70 0000000000000000 0000000001001218 000003fff5879428
> [45116.631429] User Code: 000003ffa580cc32: 0000 illegal
> [45116.631429] 000003ffa580cc34: 0000 illegal
> [45116.631429] #000003ffa580cc36: 0000 illegal
> [45116.631429] >000003ffa580cc38: 0000 illegal
> [45116.631429] 000003ffa580cc3a: 0000 illegal
> [45116.631429] 000003ffa580cc3c: 0000 illegal
> [45116.631429] 000003ffa580cc3e: 0000 illegal
> [45116.631429] 000003ffa580cc40: 0000 illegal
> [45116.631437] Last Breaking-Event-Address:
> [45116.631438] [<0000000000000001>] 0x1
>
> In other words, if before the mmap() call memory mappings look like this:
>
> Start Addr End Addr Size Offset Perms objfile
> 0x1000000 0x1001000 0x1000 0x0 r--p /root/main/mmap
> 0x1001000 0x1002000 0x1000 0x1000 r-xp /root/main/mmap
> 0x1002000 0x1003000 0x1000 0x2000 r--p /root/main/mmap
> 0x1003000 0x1004000 0x1000 0x2000 r--p /root/main/mmap
> 0x1004000 0x1005000 0x1000 0x3000 rw-p /root/main/mmap
> 0x3fff7c00000 0x3fff7c2b000 0x2b000 0x0 r--p /usr/lib64/libc.so.6
> 0x3fff7c2b000 0x3fff7d64000 0x139000 0x2b000 r-xp /usr/lib64/libc.so.6
> 0x3fff7d64000 0x3fff7dc3000 0x5f000 0x164000 r--p /usr/lib64/libc.so.6
> 0x3fff7dc3000 0x3fff7dc4000 0x1000 0x1c3000 ---p /usr/lib64/libc.so.6
> 0x3fff7dc4000 0x3fff7dc8000 0x4000 0x1c3000 r--p /usr/lib64/libc.so.6
> 0x3fff7dc8000 0x3fff7dca000 0x2000 0x1c7000 rw-p /usr/lib64/libc.so.6
> 0x3fff7dca000 0x3fff7dd2000 0x8000 0x0 rw-p
> 0x3fff7f80000 0x3fff7f82000 0x2000 0x0 r--p /usr/lib/ld64.so.1
> 0x3fff7f82000 0x3fff7fa3000 0x21000 0x2000 r-xp /usr/lib/ld64.so.1
> 0x3fff7fa3000 0x3fff7faf000 0xc000 0x23000 r--p /usr/lib/ld64.so.1
> 0x3fff7faf000 0x3fff7fb1000 0x2000 0x2e000 r--p /usr/lib/ld64.so.1
> 0x3fff7fb1000 0x3fff7fb3000 0x2000 0x30000 rw-p /usr/lib/ld64.so.1
> 0x3fff7ff3000 0x3fff7ffb000 0x8000 0x0 rw-p
> 0x3fffffda000 0x3ffffffb000 0x21000 0x0 rw-p [stack]
> 0x3ffffffc000 0x3ffffffe000 0x2000 0x0 r--p [vvar]
> 0x3ffffffe000 0x40000000000 0x2000 0x0 r-xp [vdso]
>
> Then after mmap() returns it turns into:
>
> Start Addr End Addr Size Offset Perms objfile
> 0x1000000 0x1001000 0x1000 0x0 r--p /root/main/mmap
> 0x1001000 0x1002000 0x1000 0x1000 r-xp /root/main/mmap
> 0x1002000 0x1003000 0x1000 0x2000 r--p /root/main/mmap
> 0x1003000 0x1004000 0x1000 0x2000 r--p /root/main/mmap
> 0x1004000 0x1005000 0x1000 0x3000 rw-p /root/main/mmap
> 0x37c00000 0x3fff7ffb000 0x3ffc03fb000 0x0 rw-p
> 0x3fffffda000 0x3ffffffb000 0x21000 0x0 rw-p [stack]
> 0x3ffffffc000 0x3ffffffe000 0x2000 0x0 r--p [vvar]
> 0x3ffffffe000 0x40000000000 0x2000 0x0 r-xp [vdso]
>
> Interestingly, all addresses mmap() returns before the problem hits are
> 1MB-aligned, while the last one that screws the mappings is always page-
> aligned. Also, the iteration number 4095 suggests some arithmetics that
> leads to an integer overflow.
>
> I did not experiment much with x86, but the problem does not hit there.
> The config has CONFIG_PGTABLE_LEVELS=5, but I am not sure about other
> options that may be involved.
>
> The tree I used to isolate the issue:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm-everything
>
> It (looks like it) gets pulled into every linux-next, so the problem
> is reproducable there as well.
>
> As we are approaching the merge window that looks pretty worrisome. I will
> try to get more details on what is going on, but may be you have an immediate
> idea?
Thank you for testing this code. Yes, it is because I was not returning
the error code which I had set when gap searching was exhausted. What
is happening is that, because I had not returned the error, the mmap
code will munmap the area and replace it with your requested map. There
will be a patch for the maple tree in your inbox shortly.
Regards,
Liam
next prev parent reply other threads:[~2022-07-12 1:49 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-21 20:46 [PATCH v10 00/69] Introducing the Maple Tree Liam Howlett
2022-06-21 20:46 ` [PATCH v10 01/69] Maple Tree: add new data structure Liam Howlett
2022-06-21 20:46 ` [PATCH v10 02/69] radix tree test suite: add pr_err define Liam Howlett
2022-06-21 20:46 ` [PATCH v10 04/69] radix tree test suite: add allocation counts and size to kmem_cache Liam Howlett
2022-06-21 20:46 ` [PATCH v10 03/69] radix tree test suite: add kmem_cache_set_non_kernel() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 06/69] radix tree test suite: add lockdep_is_held to header Liam Howlett
2022-06-21 20:46 ` [PATCH v10 05/69] radix tree test suite: add support for slab bulk APIs Liam Howlett
2022-06-21 20:46 ` [PATCH v10 07/69] lib/test_maple_tree: add testing for maple tree Liam Howlett
2022-06-21 20:46 ` [PATCH v10 08/69] mm: start tracking VMAs with " Liam Howlett
2022-06-21 20:46 ` [PATCH v10 11/69] mm/mmap: use the maple tree in find_vma() instead of the rbtree Liam Howlett
2022-06-21 21:04 ` David Hildenbrand
2022-06-24 13:05 ` Liam Howlett
2022-06-21 20:46 ` [PATCH v10 09/69] mm: add VMA iterator Liam Howlett
2022-06-21 21:10 ` David Hildenbrand
2022-06-23 17:03 ` Matthew Wilcox
2022-06-24 14:31 ` Liam Howlett
2022-06-21 20:46 ` [PATCH v10 10/69] mmap: use the VMA iterator in count_vma_pages_range() Liam Howlett
2022-06-21 21:13 ` David Hildenbrand
2022-06-24 13:10 ` Liam Howlett
2022-06-21 20:46 ` [PATCH v10 12/69] mm/mmap: use the maple tree for find_vma_prev() instead of the rbtree Liam Howlett
2022-06-21 21:17 ` David Hildenbrand
2022-06-21 20:46 ` [PATCH v10 13/69] mm/mmap: use maple tree for unmapped_area{_topdown} Liam Howlett
2022-06-23 17:25 ` David Hildenbrand
2022-07-14 0:47 ` Liam Howlett
2022-07-09 7:29 ` Alexander Gordeev
2022-07-12 1:49 ` Liam Howlett [this message]
2022-07-19 14:20 ` Sven Schnelle
2022-07-19 14:54 ` Liam Howlett
2022-06-21 20:46 ` [PATCH v10 14/69] kernel/fork: use maple tree for dup_mmap() during forking Liam Howlett
2022-06-23 18:42 ` David Hildenbrand
2022-07-13 19:05 ` Liam Howlett
2022-06-21 20:46 ` [PATCH v10 15/69] damon: convert __damon_va_three_regions to use the VMA iterator Liam Howlett
2022-06-23 18:47 ` David Hildenbrand
2022-06-21 20:46 ` [PATCH v10 16/69] proc: remove VMA rbtree use from nommu Liam Howlett
2022-06-21 20:46 ` [PATCH v10 17/69] mm: remove rb tree Liam Howlett
2022-06-21 20:46 ` [PATCH v10 18/69] mmap: change zeroing of maple tree in __vma_adjust() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 20/69] mm: optimize find_exact_vma() to use vma_lookup() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 19/69] xen: use vma_lookup() in privcmd_ioctl_mmap() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 22/69] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 21/69] mm/khugepaged: optimize collapse_pte_mapped_thp() by using vma_lookup() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 23/69] mm: use maple tree operations for find_vma_intersection() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 26/69] mm: convert vma_lookup() to use mtree_load() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 24/69] mm/mmap: use advanced maple tree API for mmap_region() Liam Howlett
2022-06-21 20:46 ` [PATCH v10 25/69] mm: remove vmacache Liam Howlett
2022-06-21 20:47 ` [PATCH v10 28/69] mm/mmap: reorganize munmap to use maple states Liam Howlett
2022-06-21 20:47 ` [PATCH v10 27/69] mm/mmap: move mmap_region() below do_munmap() Liam Howlett
2022-06-21 20:47 ` [PATCH v10 30/69] arm64: remove mmap linked list from vdso Liam Howlett
2022-06-21 20:47 ` [PATCH v10 31/69] arm64: Change elfcore for_each_mte_vma() to use VMA iterator Liam Howlett
2022-06-21 20:47 ` [PATCH v10 29/69] mm/mmap: change do_brk_munmap() to use do_mas_align_munmap() Liam Howlett
2022-06-21 20:47 ` [PATCH v10 34/69] s390: remove vma linked list walks Liam Howlett
2022-06-21 20:47 ` [PATCH v10 33/69] powerpc: remove mmap " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 32/69] parisc: remove mmap linked list from cache handling Liam Howlett
2022-06-21 20:47 ` [PATCH v10 35/69] x86: remove vma linked list walks Liam Howlett
2022-06-21 20:47 ` [PATCH v10 39/69] um: remove vma linked list walk Liam Howlett
2022-06-21 20:47 ` [PATCH v10 37/69] cxl: " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 38/69] optee: " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 36/69] xtensa: remove vma linked list walks Liam Howlett
2022-06-21 20:47 ` [PATCH v10 41/69] exec: use VMA iterator instead of linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 40/69] coredump: remove vma linked list walk Liam Howlett
2022-06-21 20:47 ` [PATCH v10 44/69] userfaultfd: use maple tree iterator to iterate VMAs Liam Howlett
2022-06-21 20:47 ` [PATCH v10 42/69] fs/proc/base: use maple tree iterators in place of linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 45/69] ipc/shm: use VMA iterator instead " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 43/69] fs/proc/task_mmu: stop using linked list and highest_vm_end Liam Howlett
2022-06-21 20:47 ` [PATCH v10 47/69] perf: use VMA iterator Liam Howlett
2022-06-21 20:47 ` [PATCH v10 49/69] fork: " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 46/69] acct: use VMA iterator instead of linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 48/69] sched: use maple tree iterator to walk VMAs Liam Howlett
2022-06-21 20:47 ` [PATCH v10 51/69] mm/gup: use maple tree navigation instead of linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 50/69] bpf: remove VMA " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 52/69] mm/khugepaged: stop using vma " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 54/69] mm/madvise: use vma_find() instead of " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 53/69] mm/ksm: use vma iterators " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 55/69] mm/memcontrol: stop using mm->highest_vm_end Liam Howlett
2022-06-21 20:47 ` [PATCH v10 56/69] mm/mempolicy: use vma iterator & maple state instead of vma linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 59/69] mm/mremap: use vma_find_intersection() " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 57/69] mm/mlock: use vma iterator and maple state " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 58/69] mm/mprotect: use maple tree navigation " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 61/69] mm/oom_kill: use maple tree iterators " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 60/69] mm/msync: use vma_find() " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 63/69] mm/swapfile: use vma iterator " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 62/69] mm/pagewalk: use vma_find() " Liam Howlett
2022-06-21 20:47 ` [PATCH v10 66/69] riscv: use vma iterator for vdso Liam Howlett
2022-06-21 20:47 ` [PATCH v10 65/69] nommu: remove uses of VMA linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 64/69] i915: use the VMA iterator Liam Howlett
2022-06-21 20:47 ` [PATCH v10 67/69] mm: remove the vma linked list Liam Howlett
2022-06-21 20:47 ` [PATCH v10 68/69] mm/mmap: drop range_has_overlap() function Liam Howlett
2022-06-21 20:47 ` [PATCH v10 69/69] mm/mmap.c: pass in mapping to __vma_link_file() Liam Howlett
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220712014902.3lfeaebfhyc4eakc@revolver \
--to=liam.howlett@oracle.com \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=damon@lists.linux.dev \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=maple-tree@lists.infradead.org \
--cc=sj@kernel.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox