Thread (41 messages) 41 messages, 7 authors, 2018-03-24

Re: [RFC PATCH 1/8] mm: mmap: unmap large mapping by section

From: Yang Shi <hidden>
Date: 2018-03-21 17:16:58
Also in: lkml


On 3/21/18 9:50 AM, Yang Shi wrote:

On 3/21/18 6:14 AM, Michal Hocko wrote:
quoted
On Wed 21-03-18 05:31:19, Yang Shi wrote:
quoted
When running some mmap/munmap scalability tests with large memory (i.e.
quoted
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
Slightly off-topic:
Btw. this sucks as well. Do we really need to take mmap_sem here? Do any
of
    arg_start = mm->arg_start;
    arg_end = mm->arg_end;
    env_start = mm->env_start;
    env_end = mm->env_end;

change after exec or while the pid is already visible in proc? If yes
maybe we can use a dedicated lock.
BTW, this is not the only place to acquire mmap_sem in 
proc_pid_cmdline_read(), it calls access_remote_vm() which need acquire 
mmap_sem too, so the mmap_sem scalability issue will be hit sooner or later.

Yang
Actually, Alexey Dobriyan had the same comment when he reviewed my 
very first patch (which changes down_read to down_read_killable at 
that place).

Those 4 values might be changed by prctl_set_mm() and 
prctl_set_mm_map() concurrently. They used to use down_read() to 
protect the change, but it looks not good enough to protect concurrent 
writing. So, Mateusz Guzik's commit 
ddf1d398e517e660207e2c807f76a90df543a217 ("prctl: take mmap sem for 
writing to protect against others") change it to down_write().

It seems mmap_sem can be replaced to a dedicated lock. How about 
defining a rwlock in mm_struct to protect those data? I will come up 
with a RFC patch for this.

However, this dedicated lock just can work around this specific case. 
I believe solving mmap_sem scalability issue aimed by the patch series 
is still our consensus.

Thanks,
Yang


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help