From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965454AbcKJRwE (ORCPT ); Thu, 10 Nov 2016 12:52:04 -0500 Received: from mga04.intel.com ([192.55.52.120]:34445 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964912AbcKJRwC (ORCPT ); Thu, 10 Nov 2016 12:52:02 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,619,1473145200"; d="scan'208";a="190009508" Date: Thu, 10 Nov 2016 20:51:53 +0300 From: "Kirill A. Shutemov" To: kbuild test robot Cc: "Kirill A. Shutemov" , kbuild-all@01.org, Hugh Dickins , Andrea Arcangeli , Andrew Morton , Andi Kleen , Dave Chinner , Michal Hocko , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] shmem: avoid huge pages for small files Message-ID: <20161110175153.o6mnjovli4ocil56@black.fi.intel.com> References: <20161110162540.GA12743@node.shutemov.name> <201611110147.n5fpiarv%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201611110147.n5fpiarv%fengguang.wu@intel.com> User-Agent: NeoMutt/20160916 (1.7.0) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Nov 11, 2016 at 01:42:47AM +0800, kbuild test robot wrote: > Hi Kirill, > > [auto build test WARNING on linus/master] > [also build test WARNING on v4.9-rc4 next-20161110] > [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] > > url: https://github.com/0day-ci/linux/commits/Kirill-A-Shutemov/shmem-avoid-huge-pages-for-small-files/20161111-005428 > config: i386-randconfig-s0-201645 (attached as .config) > compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 > reproduce: > # save the attached .config to linux build tree > make ARCH=i386 > > All warnings (new ones prefixed by >>): > > mm/shmem.c: In function 'shmem_getpage_gfp': > >> mm/shmem.c:1680:12: warning: unused variable 'off' [-Wunused-variable] > pgoff_t off; >>From f0a582888ac6dcb56c6134611c83edfb091bbcb6 Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" Date: Mon, 17 Oct 2016 14:44:47 +0300 Subject: [PATCH] shmem: avoid huge pages for small files Huge pages are detrimental for small file: they causes noticible overhead on both allocation performance and memory footprint. This patch aimed to address this issue by avoiding huge pages until file grown to size of huge page if the filesystem mounted with huge=within_size option. This would cover most of the cases where huge pages causes regressions in performance. The limit doesn't affect khugepaged behaviour: it still can collapse pages based on its settings. Signed-off-by: Kirill A. Shutemov --- Documentation/vm/transhuge.txt | 7 ++++++- mm/shmem.c | 7 ++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Documentation/vm/transhuge.txt b/Documentation/vm/transhuge.txt index 2ec6adb5a4ce..14c911c56f4a 100644 --- a/Documentation/vm/transhuge.txt +++ b/Documentation/vm/transhuge.txt @@ -208,11 +208,16 @@ You can control hugepage allocation policy in tmpfs with mount option - "always": Attempt to allocate huge pages every time we need a new page; + This option can lead to significant overhead if filesystem is used to + store small files. + - "never": Do not allocate huge pages; - "within_size": - Only allocate huge page if it will be fully within i_size. + Only allocate huge page if size of the file more than size of huge + page. This helps to avoid overhead for small files. + Also respect fadvise()/madvise() hints; - "advise: diff --git a/mm/shmem.c b/mm/shmem.c index ad7813d73ea7..3e2c0912c587 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1677,14 +1677,11 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, goto alloc_huge; switch (sbinfo->huge) { loff_t i_size; - pgoff_t off; case SHMEM_HUGE_NEVER: goto alloc_nohuge; case SHMEM_HUGE_WITHIN_SIZE: - off = round_up(index, HPAGE_PMD_NR); - i_size = round_up(i_size_read(inode), PAGE_SIZE); - if (i_size >= HPAGE_PMD_SIZE && - i_size >> PAGE_SHIFT >= off) + i_size = i_size_read(inode); + if (index >= HPAGE_PMD_NR || i_size >= HPAGE_PMD_SIZE) goto alloc_huge; /* fallthrough */ case SHMEM_HUGE_ADVISE: -- 2.9.3 -- Kirill A. Shutemov