linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
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





  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