Received: by 10.213.65.68 with SMTP id h4csp883217imn; Tue, 27 Mar 2018 10:31:53 -0700 (PDT) X-Google-Smtp-Source: AIpwx49LXW31h0OvgLMR7cQDSM3NZk4SiOTJCl+LGJY6h/s2+WCoT/0/7qP5a0Osk01ythoWelp7 X-Received: by 2002:a17:902:2d24:: with SMTP id o33-v6mr212532plb.143.1522171913480; Tue, 27 Mar 2018 10:31:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522171913; cv=none; d=google.com; s=arc-20160816; b=alAlvwR/1ZNpGiKtdCY4wzygCfO2VEm76ENkcuLMr3S+SUC5apUY8ALBYqgjSPxLT5 CM4d4Fkb86Yy+cJpIKrLlRjHUiKARQHrAY9zW9nAEHIZNLrm9GeRFssXdLDjQpvdgMuN ps3o8VDcodXhilCKi1mmEada4Fyu4zpL1+zApuGPAXbZdxF3LZteD8atLPZGoiEWtxf0 7VauDO23aBcnUensUPcKo+TwIfLRA3RkQ4Q3ZyAB/FBeCtD0CtNGgw6S+FJ6AB7YZmM2 AzHpflk+1Zy21/rN/qVfFAPDDMbeZ7vGKkN3IfrldOhUNKH7/8qj/idQuBTjYupZkHTt hpxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=OZ7KElSpO1IthBOCYpCGf/I829kUJfrLRt9RBx4v0UU=; b=cvt84C9a0BNRfs0p/u4h64GnGaisF7uLMLDpc+sKX7RySSVHcpA8lc8kNsraJK4J38 r569qA/bfADTB62tsCPj4n3/361JhFLGZbRG0Mk1CbZi9I008GshavXAUlK8/DO+Dktq oO1UbsE3uRe7VM44db1ScvfELBv5bTd5Q+a/Sff6HeDUreLTQ8rDPQOYT1ZdR7vfOZUd ioWIq4E9wa/LBpUchwHGBX7utsAWHCnPN9RsRY3kDntPWW5XU6W3UcriJOQRucObXfAd DME69bsq+qPXHjb7uff8W2E8TKyZcdd88PRa1ixAhGi/fZPcjtplGeHosdpdeh4Gt1xX ZjzQ== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j91-v6si1632718pld.14.2018.03.27.10.31.38; Tue, 27 Mar 2018 10:31:53 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754626AbeC0QgB (ORCPT + 99 others); Tue, 27 Mar 2018 12:36:01 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:45606 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753830AbeC0Qf5 (ORCPT ); Tue, 27 Mar 2018 12:35:57 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 546B4D93; Tue, 27 Mar 2018 16:35:56 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Kirill A. Shutemov" , Eric Wheeler , Michal Hocko , Andrew Morton , Tetsuo Handa , Hugh Dickins , Linus Torvalds Subject: [PATCH 4.14 051/101] mm/shmem: do not wait for lock_page() in shmem_unused_huge_shrink() Date: Tue, 27 Mar 2018 18:27:23 +0200 Message-Id: <20180327162753.159852108@linuxfoundation.org> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180327162749.993880276@linuxfoundation.org> References: <20180327162749.993880276@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Kirill A. Shutemov commit b3cd54b257ad95d344d121dc563d943ca39b0921 upstream. shmem_unused_huge_shrink() gets called from reclaim path. Waiting for page lock may lead to deadlock there. There was a bug report that may be attributed to this: http://lkml.kernel.org/r/alpine.LRH.2.11.1801242349220.30642@mail.ewheeler.net Replace lock_page() with trylock_page() and skip the page if we failed to lock it. We will get to the page on the next scan. We can test for the PageTransHuge() outside the page lock as we only need protection against splitting the page under us. Holding pin oni the page is enough for this. Link: http://lkml.kernel.org/r/20180316210830.43738-1-kirill.shutemov@linux.intel.com Fixes: 779750d20b93 ("shmem: split huge pages beyond i_size under memory pressure") Signed-off-by: Kirill A. Shutemov Reported-by: Eric Wheeler Acked-by: Michal Hocko Reviewed-by: Andrew Morton Cc: Tetsuo Handa Cc: Hugh Dickins Cc: [4.8+] Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- mm/shmem.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) --- a/mm/shmem.c +++ b/mm/shmem.c @@ -493,36 +493,45 @@ next: info = list_entry(pos, struct shmem_inode_info, shrinklist); inode = &info->vfs_inode; - if (nr_to_split && split >= nr_to_split) { - iput(inode); - continue; - } + if (nr_to_split && split >= nr_to_split) + goto leave; - page = find_lock_page(inode->i_mapping, + page = find_get_page(inode->i_mapping, (inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT); if (!page) goto drop; + /* No huge page at the end of the file: nothing to split */ if (!PageTransHuge(page)) { - unlock_page(page); put_page(page); goto drop; } + /* + * Leave the inode on the list if we failed to lock + * the page at this time. + * + * Waiting for the lock may lead to deadlock in the + * reclaim path. + */ + if (!trylock_page(page)) { + put_page(page); + goto leave; + } + ret = split_huge_page(page); unlock_page(page); put_page(page); - if (ret) { - /* split failed: leave it on the list */ - iput(inode); - continue; - } + /* If split failed leave the inode on the list */ + if (ret) + goto leave; split++; drop: list_del_init(&info->shrinklist); removed++; +leave: iput(inode); }