From: Yang Shi <yang.shi@linux.alibaba.com>
To: Michal Hocko <mhocko@kernel.org>
Cc: akpm@linux-foundation.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH 1/8] mm: mmap: unmap large mapping by section
Date: Wed, 21 Mar 2018 09:31:22 -0700 [thread overview]
Message-ID: <f88deb20-bcce-939f-53a6-1061c39a9f6c@linux.alibaba.com> (raw)
In-Reply-To: <20180321130833.GM23100@dhcp22.suse.cz>
On 3/21/18 6:08 AM, Michal Hocko wrote:
> On Wed 21-03-18 05:31:19, Yang Shi wrote:
>> When running some mmap/munmap scalability tests with large memory (i.e.
>>> 300GB), the below hung task issue may happen occasionally.
>> INFO: task ps:14018 blocked for more than 120 seconds.
>> Tainted: G E 4.9.79-009.ali3000.alios7.x86_64 #1
>> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this
>> message.
>> ps D 0 14018 1 0x00000004
>> ffff885582f84000 ffff885e8682f000 ffff880972943000 ffff885ebf499bc0
>> ffff8828ee120000 ffffc900349bfca8 ffffffff817154d0 0000000000000040
>> 00ffffff812f872a ffff885ebf499bc0 024000d000948300 ffff880972943000
>> Call Trace:
>> [<ffffffff817154d0>] ? __schedule+0x250/0x730
>> [<ffffffff817159e6>] schedule+0x36/0x80
>> [<ffffffff81718560>] rwsem_down_read_failed+0xf0/0x150
>> [<ffffffff81390a28>] call_rwsem_down_read_failed+0x18/0x30
>> [<ffffffff81717db0>] down_read+0x20/0x40
>> [<ffffffff812b9439>] proc_pid_cmdline_read+0xd9/0x4e0
>> [<ffffffff81253c95>] ? do_filp_open+0xa5/0x100
>> [<ffffffff81241d87>] __vfs_read+0x37/0x150
>> [<ffffffff812f824b>] ? security_file_permission+0x9b/0xc0
>> [<ffffffff81242266>] vfs_read+0x96/0x130
>> [<ffffffff812437b5>] SyS_read+0x55/0xc0
>> [<ffffffff8171a6da>] entry_SYSCALL_64_fastpath+0x1a/0xc5
>>
>> It is because munmap holds mmap_sem from very beginning to all the way
>> down to the end, and doesn't release it in the middle. When unmapping
>> large mapping, it may take long time (take ~18 seconds to unmap 320GB
>> mapping with every single page mapped on an idle machine).
> Yes, this definitely sucks. One way to work that around is to split the
> unmap to two phases. One to drop all the pages. That would only need
> mmap_sem for read and then tear down the mapping with the mmap_sem for
> write. This wouldn't help for parallel mmap_sem writers but those really
> need a different approach (e.g. the range locking).
page fault might sneak in to map a page which has been unmapped before?
range locking should help a lot on manipulating small sections of a
large mapping in parallel or multiple small mappings. It may not achieve
too much for single large mapping.
>
>> Since unmapping does't require any atomicity, so here unmap large
> How come? Could you be more specific why? Once you drop the lock the
> address space might change under your feet and you might be unmapping a
> completely different vma. That would require userspace doing nasty
> things of course (e.g. MAP_FIXED) but I am worried that userspace really
> depends on mmap/munmap atomicity these days.
Sorry for the ambiguity. The statement does look misleading. munmap does
need certain atomicity, particularly for the below sequence:
splitting vma
unmap region
free pagetables
free vmas
Otherwise it may run into the below race condition:
CPU A CPU B
---------- ----------
do_munmap
zap_pmd_range
up_write do_munmap
down_write
......
remove_vma_list
up_write
down_write
access vmas <-- use-after-free bug
This is why I do the range unmap in do_munmap() rather than doing it in
deeper location, i.e. zap_pmd_range(). I elaborated this in the cover
letter.
Thanks,
Yang
next prev parent reply other threads:[~2018-03-21 16:31 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-20 21:31 [RFC PATCH 0/8] Drop mmap_sem during unmapping large map Yang Shi
2018-03-20 21:31 ` [RFC PATCH 1/8] mm: mmap: unmap large mapping by section Yang Shi
2018-03-21 13:08 ` Michal Hocko
2018-03-21 16:31 ` Yang Shi [this message]
2018-03-21 17:29 ` Matthew Wilcox
2018-03-21 21:45 ` Yang Shi
2018-03-21 22:15 ` Matthew Wilcox
2018-03-21 22:40 ` Yang Shi
2018-03-21 22:46 ` Matthew Wilcox
2018-03-22 15:32 ` Laurent Dufour
2018-03-22 15:40 ` Matthew Wilcox
2018-03-22 15:54 ` Laurent Dufour
2018-03-22 16:05 ` Matthew Wilcox
2018-03-22 16:18 ` Laurent Dufour
2018-03-22 16:46 ` Yang Shi
2018-03-23 13:03 ` Laurent Dufour
2018-03-22 16:51 ` Matthew Wilcox
2018-03-22 16:49 ` Yang Shi
2018-03-22 17:34 ` Yang Shi
2018-03-22 18:48 ` Matthew Wilcox
2018-03-24 18:24 ` Jerome Glisse
2018-03-21 13:14 ` Michal Hocko
2018-03-21 16:50 ` Yang Shi
2018-03-21 17:16 ` Yang Shi
2018-03-21 21:23 ` Michal Hocko
2018-03-21 22:36 ` Yang Shi
2018-03-22 9:10 ` Michal Hocko
2018-03-22 16:06 ` Yang Shi
2018-03-22 16:12 ` Michal Hocko
2018-03-22 16:13 ` Matthew Wilcox
2018-03-22 16:28 ` Laurent Dufour
2018-03-22 16:36 ` David Laight
2018-03-20 21:31 ` [RFC PATCH 2/8] mm: mmap: pass atomic parameter to do_munmap() call sites Yang Shi
2018-03-20 21:31 ` [RFC PATCH 3/8] mm: mremap: pass atomic parameter to do_munmap() Yang Shi
2018-03-20 21:31 ` [RFC PATCH 4/8] mm: nommu: add " Yang Shi
2018-03-20 21:31 ` [RFC PATCH 5/8] ipc: shm: pass " Yang Shi
2018-03-20 21:31 ` [RFC PATCH 6/8] fs: proc/vmcore: " Yang Shi
2018-03-20 21:31 ` [RFC PATCH 7/8] x86: mpx: " Yang Shi
2018-03-20 22:35 ` Thomas Gleixner
2018-03-21 16:53 ` Yang Shi
2018-03-20 21:31 ` [RFC PATCH 8/8] x86: vma: " Yang Shi
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=f88deb20-bcce-939f-53a6-1061c39a9f6c@linux.alibaba.com \
--to=yang.shi@linux.alibaba.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.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