Received: by 10.223.148.5 with SMTP id 5csp6376625wrq; Wed, 17 Jan 2018 12:52:25 -0800 (PST) X-Google-Smtp-Source: ACJfBosikLCQ9CRukaK/GYSMXHkbwxq3lO8g+ISWy3kzz6M+CoSLhXhArV1vIIx2yib7RCgKvSEb X-Received: by 10.99.65.70 with SMTP id o67mr35050862pga.348.1516222345246; Wed, 17 Jan 2018 12:52:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516222345; cv=none; d=google.com; s=arc-20160816; b=UVXvfNvmg7fQKbJVaVKslQ8R/BqGQh2GxHbIOO0vP4QU/RluTu4sDS0A+TksmU+01o tGohIn680rklYH7e5iSZ8dBrdudaiswCwmA/hTmSfXjoemURStMU8euI6aB01cCQHhk5 KaGn5W49qzXnKINCEXJeTZ1ZetmaCWccJh+/45Oq2SBLDPr/FUgbf2tnl51NaoAzy5Py reyxdabqj0TPhv5LVNqSAJcBvS9ZLduR6t2/+Lgu+xe04F0WghaEDOZZR2AiYMaaIMR7 pnPIOSmb0B8auCPijYZLevpwHmBZLTHcdwKtcdZtSaz/dQVIsYFrY2MfOjRXPv3xvUbB R5QQ== 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:dkim-signature:arc-authentication-results; bh=twBQxHGEDlYgTOopxV5sYBq1NROUVjylQu/ED/7Eudk=; b=F7ie2I27HLUZjAD/H5ZUg2IRXFi4uOnKMxdpmG8zeCov1hz+vm8kZ3fs83Du6c+DUf XbpX6N0e+xJmtLSyuh2U9DapiPuEIAMqNA1HAjBE9z9TbViQEQV3fHVa6EmP7efmyRQL QfP+/AeB+fllMq7HnOsL41IZFH+NpttKF9VZa4KEwQvqfoD4F+fieX+piN8nXH98m9pr 44JTgnNCrSD4Hwi2CFgFIiZAJ/MSBIJVfPEsWaI0lQtnP2fEW7AluMo4oKcgKWL+3ft+ 5iiAyyhgmccmGZP/FdLqEHGTw9qbVxcCqv19rqWKf6gK+lNskMqx9MWgJu2/frBY3dZB 2Usg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=l3iFkkPU; 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 u184si4384664pgd.675.2018.01.17.12.52.11; Wed, 17 Jan 2018 12:52:25 -0800 (PST) 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; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=l3iFkkPU; 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 S932288AbeAQUv1 (ORCPT + 99 others); Wed, 17 Jan 2018 15:51:27 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:45661 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753658AbeAQUWo (ORCPT ); Wed, 17 Jan 2018 15:22:44 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=twBQxHGEDlYgTOopxV5sYBq1NROUVjylQu/ED/7Eudk=; b=l3iFkkPUJZQiiHf7hbPlaOXEk sGWG4PB/3hZHISuyD2KE2Tg73NIAGVNFzLpHq6z8c1x/3u5J5mlK2CZrwcxckfTpdYvmaV5D0SpL7 +Q1jrSpMYpXpOsI34r7JoJ4t70KWy0QkAacOaiR5/xRMhZfJ2Tl2/cP1RW4eTmqfDsLR0FkDrR8L5 aXZsAfjCwTbss0a/3gRGmj2DHSYW0aHHcWoF/2HZYfSqLiycRvf53SMwaRqHiNHmlpRiNaCQp7oCk gaC4PpSRcg7Drmz9LI/tsEfrK11NRo6L6P4FkvPqWFLfo2hpfZCew+5IUo0y3yAWicMTKVXLEmLkz FqZPyQ6mg==; Received: from willy by bombadil.infradead.org with local (Exim 4.89 #1 (Red Hat Linux)) id 1ebuEM-0005u8-5u; Wed, 17 Jan 2018 20:22:42 +0000 From: Matthew Wilcox To: linux-kernel@vger.kernel.org Cc: Matthew Wilcox , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-nilfs@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-xfs@vger.kernel.org, linux-usb@vger.kernel.org, Bjorn Andersson , Stefano Stabellini , iommu@lists.linux-foundation.org, linux-remoteproc@vger.kernel.org, linux-s390@vger.kernel.org, intel-gfx@lists.freedesktop.org, cgroups@vger.kernel.org, linux-sh@vger.kernel.org, David Howells Subject: [PATCH v6 44/99] shmem: Convert shmem_tag_pins to XArray Date: Wed, 17 Jan 2018 12:21:08 -0800 Message-Id: <20180117202203.19756-45-willy@infradead.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180117202203.19756-1-willy@infradead.org> References: <20180117202203.19756-1-willy@infradead.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Matthew Wilcox Simplify the locking by taking the spinlock while we walk the tree on the assumption that many acquires and releases of the lock will be worse than holding the lock for a (potentially) long time. We could replicate the same locking behaviour with the xarray, but would have to be careful that the xa_node wasn't RCU-freed under us before we took the lock. Signed-off-by: Matthew Wilcox --- mm/shmem.c | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index ce285ae635ea..2f41c7ceea18 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2601,35 +2601,28 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence) static void shmem_tag_pins(struct address_space *mapping) { - struct radix_tree_iter iter; - void **slot; - pgoff_t start; + XA_STATE(xas, &mapping->pages, 0); struct page *page; + unsigned int tagged = 0; lru_add_drain(); - start = 0; - rcu_read_lock(); - radix_tree_for_each_slot(slot, &mapping->pages, &iter, start) { - page = radix_tree_deref_slot(slot); - if (!page || radix_tree_exception(page)) { - if (radix_tree_deref_retry(page)) { - slot = radix_tree_iter_retry(&iter); - continue; - } - } else if (page_count(page) - page_mapcount(page) > 1) { - xa_lock_irq(&mapping->pages); - radix_tree_tag_set(&mapping->pages, iter.index, - SHMEM_TAG_PINNED); - xa_unlock_irq(&mapping->pages); - } + xas_lock_irq(&xas); + xas_for_each(&xas, page, ULONG_MAX) { + if (xa_is_value(page)) + continue; + if (page_count(page) - page_mapcount(page) > 1) + xas_set_tag(&xas, SHMEM_TAG_PINNED); - if (need_resched()) { - slot = radix_tree_iter_resume(slot, &iter); - cond_resched_rcu(); - } + if (++tagged % XA_CHECK_SCHED) + continue; + + xas_pause(&xas); + xas_unlock_irq(&xas); + cond_resched(); + xas_lock_irq(&xas); } - rcu_read_unlock(); + xas_unlock_irq(&xas); } /* -- 2.15.1