Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp7115472ybi; Thu, 13 Jun 2019 09:49:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqwET/mma28M9F8zE2RxJlGoILniYBFd5iHlZ7QkPRN/TTpipGNpFom9DlJ7b7LT7q2diu0o X-Received: by 2002:a62:8643:: with SMTP id x64mr59250292pfd.7.1560444561723; Thu, 13 Jun 2019 09:49:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560444561; cv=none; d=google.com; s=arc-20160816; b=nlH8ODrnXxM8LOQ1BaUph1gVCtCVjsKAT5OvKAZKyWvdHONTAjjuTcBtP2OfW+f4zk /wqUL3w3VpLfvG6o7ecnGf5nZ8hg3Ix8EueANmMDx9VKCdr7r4Is5m7CMU8XpMDQhdJr OBydAlLu2QYgPaprOL4Ur5Lz6cNQq9o408dk3LPhsM2P7XJklLFUBLih1X4XSe3FHDTm aNpxsLwA5GWXUF7fP8bXmWuxLmdbnc+Z1j/SA86VHD8VZg5b5TqXI+cOFDnFhzkeN+fD wChy5qcobrMEIzGPy83VNGra9toiPw6i89Q1eKsQK0Z0oxsRcTGk9MVtX1JD6+c+0CH9 49BQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=b++5wQT5X+2HL7ydJLKxd3UTgelDknQq5vbNdqzzGcE=; b=q8x5LM/xT5B99DXDIv8lp40bizwUfU7ELTnNQFPlsrGuGqYT79i9xvEpOp7nMjbdpQ aXsSScs9xBSRcHARoHkAHtrWS12u6gHg7AURigu4IUqbsENExadszRqTvvgWH/c3pBfo G5ucwX8zkROIh0kJaI53ipy+/OwmALzjZjyhLvDQIxlW1q7eN36YWq7OWSqsWZ1cJPIn DwQl9Esm79/wXi2sF1175h/0EwFuDlTMMiXGvOrIGBjrpiFszRsil2xGBuIYfeyuVYtu CY3ZjC8zSVqcqbrorfSY6mY4OKZdjhUaHfzrE8NAlD6dTgMjPpGN9Rr3n4czlPtwC9YW qkpQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c15si210948pgm.421.2019.06.13.09.49.06; Thu, 13 Jun 2019 09:49:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730185AbfFMQsw (ORCPT + 99 others); Thu, 13 Jun 2019 12:48:52 -0400 Received: from out30-131.freemail.mail.aliyun.com ([115.124.30.131]:53297 "EHLO out30-131.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727942AbfFMEpT (ORCPT ); Thu, 13 Jun 2019 00:45:19 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R131e4;CH=green;DM=||false|;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04426;MF=yang.shi@linux.alibaba.com;NM=1;PH=DS;RN=9;SR=0;TI=SMTPD_---0TU25N7U_1560401051; Received: from e19h19392.et15sqa.tbsite.net(mailfrom:yang.shi@linux.alibaba.com fp:SMTPD_---0TU25N7U_1560401051) by smtp.aliyun-inc.com(127.0.0.1); Thu, 13 Jun 2019 12:44:19 +0800 From: Yang Shi To: hughd@google.com, kirill.shutemov@linux.intel.com, mhocko@suse.com, vbabka@suse.cz, rientjes@google.com, akpm@linux-foundation.org Cc: yang.shi@linux.alibaba.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [v3 PATCH 2/2] mm: thp: fix false negative of shmem vma's THP eligibility Date: Thu, 13 Jun 2019 12:44:01 +0800 Message-Id: <1560401041-32207-3-git-send-email-yang.shi@linux.alibaba.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1560401041-32207-1-git-send-email-yang.shi@linux.alibaba.com> References: <1560401041-32207-1-git-send-email-yang.shi@linux.alibaba.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The commit 7635d9cbe832 ("mm, thp, proc: report THP eligibility for each vma") introduced THPeligible bit for processes' smaps. But, when checking the eligibility for shmem vma, __transparent_hugepage_enabled() is called to override the result from shmem_huge_enabled(). It may result in the anonymous vma's THP flag override shmem's. For example, running a simple test which create THP for shmem, but with anonymous THP disabled, when reading the process's smaps, it may show: 7fc92ec00000-7fc92f000000 rw-s 00000000 00:14 27764 /dev/shm/test Size: 4096 kB ... [snip] ... ShmemPmdMapped: 4096 kB ... [snip] ... THPeligible: 0 And, /proc/meminfo does show THP allocated and PMD mapped too: ShmemHugePages: 4096 kB ShmemPmdMapped: 4096 kB This doesn't make too much sense. The shmem objects should be treated separately from anonymous THP. Calling shmem_huge_enabled() with checking MMF_DISABLE_THP sounds good enough. And, we could skip stack and dax vma check since we already checked if the vma is shmem already. Also check if vma is suitable for THP by calling transhuge_vma_suitable(). And minor fix to smaps output format and documentation. Fixes: 7635d9cbe832 ("mm, thp, proc: report THP eligibility for each vma") Cc: Hugh Dickins Cc: Kirill A. Shutemov Cc: Michal Hocko Cc: Vlastimil Babka Cc: David Rientjes Signed-off-by: Yang Shi --- Documentation/filesystems/proc.txt | 4 ++-- fs/proc/task_mmu.c | 3 ++- mm/huge_memory.c | 9 +++++++-- mm/shmem.c | 3 +++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 66cad5c..b0ded06 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt @@ -477,8 +477,8 @@ replaced by copy-on-write) part of the underlying shmem object out on swap. "SwapPss" shows proportional swap share of this mapping. Unlike "Swap", this does not take into account swapped out page of underlying shmem objects. "Locked" indicates whether the mapping is locked in memory or not. -"THPeligible" indicates whether the mapping is eligible for THP pages - 1 if -true, 0 otherwise. +"THPeligible" indicates whether the mapping is eligible for allocating THP +pages - 1 if true, 0 otherwise. It just shows the current status. "VmFlags" field deserves a separate description. This member represents the kernel flags associated with the particular virtual memory area in two letter encoded diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 01d4eb0..6a13882 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -796,7 +796,8 @@ static int show_smap(struct seq_file *m, void *v) __show_smap(m, &mss); - seq_printf(m, "THPeligible: %d\n", transparent_hugepage_enabled(vma)); + seq_printf(m, "THPeligible: %d\n", + transparent_hugepage_enabled(vma)); if (arch_pkeys_enabled()) seq_printf(m, "ProtectionKey: %8u\n", vma_pkey(vma)); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 4bc2552..36f0225 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -65,10 +65,15 @@ bool transparent_hugepage_enabled(struct vm_area_struct *vma) { + /* The addr is used to check if the vma size fits */ + unsigned long addr = (vma->vm_end & HPAGE_PMD_MASK) - HPAGE_PMD_SIZE; + + if (!transhuge_vma_suitable(vma, addr)) + return false; if (vma_is_anonymous(vma)) return __transparent_hugepage_enabled(vma); - if (vma_is_shmem(vma) && shmem_huge_enabled(vma)) - return __transparent_hugepage_enabled(vma); + if (vma_is_shmem(vma)) + return shmem_huge_enabled(vma); return false; } diff --git a/mm/shmem.c b/mm/shmem.c index 1bb3b8d..a807712 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -3872,6 +3872,9 @@ bool shmem_huge_enabled(struct vm_area_struct *vma) loff_t i_size; pgoff_t off; + if ((vma->vm_flags & VM_NOHUGEPAGE) || + test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)) + return false; if (shmem_huge == SHMEM_HUGE_FORCE) return true; if (shmem_huge == SHMEM_HUGE_DENY) -- 1.8.3.1