Skip to content
  • Vladimir Davydov's avatar
    pipe: account to kmemcg · d86133bd
    Vladimir Davydov authored
    Pipes can consume a significant amount of system memory, hence they
    should be accounted to kmemcg.
    
    This patch marks pipe_inode_info and anonymous pipe buffer page
    allocations as __GFP_ACCOUNT so that they would be charged to kmemcg.
    Note, since a pipe buffer page can be "stolen" and get reused for other
    purposes, including mapping to userspace, we clear PageKmemcg thus
    resetting page->_mapcount and uncharge it in anon_pipe_buf_steal, which
    is introduced by this patch.
    
    A note regarding anon_pipe_buf_steal implementation.  We allow to steal
    the page if its ref count equals 1.  It looks racy, but it is correct
    for anonymous pipe buffer pages, because:
    
     - We lock out all other pipe users, because ->steal is called with
       pipe_lock held, so the page can't be spliced to another pipe from
       under us.
    
     - The page is not on LRU and it never was.
    
     - Thus a parallel thread can access it only by PFN. Although this is
       quite possible (e.g. see page_idle_get_page and balloon_page_isolate)
       this is not dangerous, because all such functions do is increase page
       ref count, check if the page is the one they are looking for, and
       decrease ref count if it isn't. Since our page is clean except for
       PageKmemcg mark, which doesn't conflict with other _mapcount users,
       the worst that can happen is we see page_count > 2 due to a transient
       ref, in which case we false-positively abort ->steal, which is still
       fine, because ->steal is not guaranteed to succeed.
    
    Link: http://lkml.kernel.org/r/20160527150313.GD26059@esperanza
    
    
    Signed-off-by: default avatarVladimir Davydov <vdavydov@virtuozzo.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d86133bd