Received: by 10.223.148.5 with SMTP id 5csp6378117wrq; Wed, 17 Jan 2018 12:53:30 -0800 (PST) X-Google-Smtp-Source: ACJfBounfQleyCH060Lam9gFEumLY5rYzYb4gd6D8SZm9Fv7WEKBMBiu8S9SzQ24gWvGHgiTd/zJ X-Received: by 10.99.140.18 with SMTP id m18mr16859243pgd.59.1516222409842; Wed, 17 Jan 2018 12:53:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516222409; cv=none; d=google.com; s=arc-20160816; b=x0E503EuoLo7rfpdu1pUF5Tc5ra1rzeQ0CaSjEovcZN7K2SPN9PO1DHgggUqyZm9sF IOmbTVY6iYFjfwlb+LMTrDq2sbC6K43ctkzi81jyG+03Ho4mDn6FQNsF8UJ0XlJC6jk7 RmiKpkbXZTI6uYGopqsXr5oDp95HzbckHCc6tobQVsh6ZTkibH1rYB1XprUUnbSIYrEW exc/3UsejixewT8ohcCzoumk5yOUdoC70x2E1vE1ZjCyFHwkQo9hHw9LnF10PONIWgKt bneWwe+xLn6Ohp+N8FooW+EHAxt5EB132YrOzWkhcOa0zl3/nULkpdz58w9+qC2cykxr GDtg== 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=tm395P+07Nr+JL+jzuW6+85raWyo2+0xXriULUgqQxI=; b=B5oVn1cOgjwpEb4Alx2LriXzpm58a0zOCE0qWOnwYNmBsoaGqIP4h4weke9B/Wmkc+ P3wbS3Uk1UyNJOKLIPg7hjMMWrbKRTLFAmd1US3yFp+vjQFnXn7Hzl08nvBEdT9NDL7g e107gRQ9Al7hvUfdYWolohhG9Om+81tsRoTov/859URaQqA33qDFeqvtOzuTVvHgz7fx QwLf+qVABf/69Kqnfnl2UtINlFd8YNniZHnX7JqLLOIiakON6FVbM8eNICjOhTUlJjsp B6R3k9x+fG4/knQMD2suBSf3uT5oyFP/tRg6m0w1h7F+aqGRou4fuvcJcIEgOx8WrqPW VpRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=iImZJE8J; 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 bd7si4813331plb.637.2018.01.17.12.53.15; Wed, 17 Jan 2018 12:53:29 -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=iImZJE8J; 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 S1754706AbeAQUvY (ORCPT + 99 others); Wed, 17 Jan 2018 15:51:24 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:34523 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753660AbeAQUWo (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=tm395P+07Nr+JL+jzuW6+85raWyo2+0xXriULUgqQxI=; b=iImZJE8Jl3whzqxpoFqTXA9gQ fDnZ3Vyj5JPWwtf0e3yUrPSFsGt67h+xSPv9F7Y8H4oBZqoC56OA0Cvz9ep+araGxk8ry+1DZo2QU p3sKCwVSorZm1fLGjRmrofBefwL8HqxkIz6rvx7MRkZEByG+Yii+wy72qLXBypmZKwtkayNYh2lOv Aa2mbZXJ8oCSFpRTXaAhr/QSkWPnmvwyAij5WU3iQbJ59RisMmaChF8Hbi1bVn56YNx1c11g7UP3H tik4IckU7RKhlANn8HO++SHidG5gtGdmA/p872gw9daBbN4sJjKF3itSIJQYKznzG3aJJ6pwsBsYm wN+SBrpiA==; Received: from willy by bombadil.infradead.org with local (Exim 4.89 #1 (Red Hat Linux)) id 1ebuEN-0005uu-6n; Wed, 17 Jan 2018 20:22:43 +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 45/99] shmem: Convert shmem_wait_for_pins to XArray Date: Wed, 17 Jan 2018 12:21:09 -0800 Message-Id: <20180117202203.19756-46-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 As with shmem_tag_pins(), hold the lock around the entire loop instead of acquiring & dropping it for each entry we're going to untag. Signed-off-by: Matthew Wilcox --- mm/shmem.c | 59 ++++++++++++++++++++++++----------------------------------- 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index 2f41c7ceea18..e4a2eb1336be 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2636,9 +2636,7 @@ static void shmem_tag_pins(struct address_space *mapping) */ static int shmem_wait_for_pins(struct address_space *mapping) { - struct radix_tree_iter iter; - void **slot; - pgoff_t start; + XA_STATE(xas, &mapping->pages, 0); struct page *page; int error, scan; @@ -2646,7 +2644,9 @@ static int shmem_wait_for_pins(struct address_space *mapping) error = 0; for (scan = 0; scan <= LAST_SCAN; scan++) { - if (!radix_tree_tagged(&mapping->pages, SHMEM_TAG_PINNED)) + unsigned int tagged = 0; + + if (!xas_tagged(&xas, SHMEM_TAG_PINNED)) break; if (!scan) @@ -2654,45 +2654,34 @@ static int shmem_wait_for_pins(struct address_space *mapping) else if (schedule_timeout_killable((HZ << scan) / 200)) scan = LAST_SCAN; - start = 0; - rcu_read_lock(); - radix_tree_for_each_tagged(slot, &mapping->pages, &iter, - start, SHMEM_TAG_PINNED) { - - page = radix_tree_deref_slot(slot); - if (radix_tree_exception(page)) { - if (radix_tree_deref_retry(page)) { - slot = radix_tree_iter_retry(&iter); - continue; - } - - page = NULL; - } - - if (page && - page_count(page) - page_mapcount(page) != 1) { - if (scan < LAST_SCAN) - goto continue_resched; - + xas_set(&xas, 0); + xas_lock_irq(&xas); + xas_for_each_tag(&xas, page, ULONG_MAX, SHMEM_TAG_PINNED) { + bool clear = true; + if (xa_is_value(page)) + continue; + if (page_count(page) - page_mapcount(page) != 1) { /* * On the last scan, we clean up all those tags * we inserted; but make a note that we still * found pages pinned. */ - error = -EBUSY; + if (scan == LAST_SCAN) + error = -EBUSY; + else + clear = false; } + if (clear) + xas_clear_tag(&xas, SHMEM_TAG_PINNED); + if (++tagged % XA_CHECK_SCHED) + continue; - xa_lock_irq(&mapping->pages); - radix_tree_tag_clear(&mapping->pages, - iter.index, SHMEM_TAG_PINNED); - xa_unlock_irq(&mapping->pages); -continue_resched: - if (need_resched()) { - slot = radix_tree_iter_resume(slot, &iter); - cond_resched_rcu(); - } + xas_pause(&xas); + xas_unlock_irq(&xas); + cond_resched(); + xas_lock_irq(&xas); } - rcu_read_unlock(); + xas_unlock_irq(&xas); } return error; -- 2.15.1