Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161786Ab3DEMDw (ORCPT ); Fri, 5 Apr 2013 08:03:52 -0400 Received: from mga03.intel.com ([143.182.124.21]:25371 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161540Ab3DEL6Z (ORCPT ); Fri, 5 Apr 2013 07:58:25 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.87,414,1363158000"; d="scan'208";a="223209026" From: "Kirill A. Shutemov" To: Andrea Arcangeli , Andrew Morton Cc: Al Viro , Hugh Dickins , Wu Fengguang , Jan Kara , Mel Gorman , linux-mm@kvack.org, Andi Kleen , Matthew Wilcox , "Kirill A. Shutemov" , Hillf Danton , Dave Hansen , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" Subject: [PATCHv3, RFC 22/34] thp, mm: truncate support for transparent huge page cache Date: Fri, 5 Apr 2013 14:59:46 +0300 Message-Id: <1365163198-29726-23-git-send-email-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1365163198-29726-1-git-send-email-kirill.shutemov@linux.intel.com> References: <1365163198-29726-1-git-send-email-kirill.shutemov@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1601 Lines: 52 From: "Kirill A. Shutemov" If we starting position of truncation is in tail page we have to spilit the huge page page first. We also have to split if end is within the huge page. Otherwise we can truncate whole huge page at once. Signed-off-by: Kirill A. Shutemov --- mm/truncate.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mm/truncate.c b/mm/truncate.c index c75b736..0152feb 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -231,6 +231,17 @@ void truncate_inode_pages_range(struct address_space *mapping, if (index > end) break; + /* split page if we start from tail page */ + if (PageTransTail(page)) + split_huge_page(compound_trans_head(page)); + if (PageTransHuge(page)) { + /* split if end is within huge page */ + if (index == (end & ~HPAGE_CACHE_INDEX_MASK)) + split_huge_page(page); + else + /* skip tail pages */ + i += HPAGE_CACHE_NR - 1; + } if (!trylock_page(page)) continue; WARN_ON(page->index != index); @@ -280,6 +291,8 @@ void truncate_inode_pages_range(struct address_space *mapping, if (index > end) break; + if (PageTransHuge(page)) + split_huge_page(page); lock_page(page); WARN_ON(page->index != index); wait_on_page_writeback(page); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/