From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-322982-1516221498-2-7876721819589638380 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES unknown, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='org', MailFrom='org' X-Spam-charsets: X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: linux-usb-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1516221497; b=DIoJg/b0Rsg0t3w28Q1eAwlpf/+dHcUq/Xduhsryc2bWDzh 2YgDSdr78jOGc3kTunsVHNAWkhUcihRYTU2b5vcSEhE6IbRk12tqN+rmIgoC6Ha8 i+ov2D3Bxen59wu42rNJ5SVYYUgLP1zpJTuaKfCe8Qe8B04eayhByyiYSeIrePjt FDIKtYgHnlfYi1qVfrzguQg/hXi5LySVcmw16esoOZqQgXGqf4En7MP+243m9EzJ rcwpdTo/pVC05LvNRK/MydTiutOCYhwTajM+FB30+Ur31Dqp2QHbDG3Zs3cuXq8T hDMc4jomf6aSmHBopvjRqSI4gSifQgfbUOrh/Nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=from:to:cc:subject:date:message-id :in-reply-to:references:sender:list-id; s=arctest; t=1516221497; bh=ApGLrNNPRlLSRWMbFfhnGwlfGk98b3x2D6CA1EhDkOw=; b=uyg6WA17QnYs Nml+Meanl9P1LUKuUr/9LbWjV7vFc1wxylh20gb7i7tAioiRJ3S5FwP6VXZfEws/ /yVVA3QWor94Khp4OlsMrzbodfqlcIYoyGjl/6wXwhyKCNyJMXF4t4hpKwxSmb9d KbY13GLvx++3L3e7BVY7ybmG0Y/HkcgeIedRRPD9JTfZsRKQ9mhN0pcQ01mGnFqD fdOq3XP1GliJQp7epEbvDQUWZQlD/juTzX/9FVTBbfgc4FGkSyWzjwckbBcv8OeG JsQqn/r6ld9xit1KC4lUkRqmqFFfh43DV4+EQNuOx2EpDbFldaWzeehscEHEB9o0 FiG8mkFg9g== ARC-Authentication-Results: i=1; mx2.messagingengine.com; arc=none (no signatures found); dkim=fail (message has been altered; 2048-bit rsa key sha256) header.d=infradead.org header.i=@infradead.org header.b=CWYgI2D7 x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=bombadil.20170209; dmarc=none (p=none,has-list-id=yes,d=none) header.from=infradead.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-usb-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=infradead.org header.result=pass header_is_org_domain=yes Authentication-Results: mx2.messagingengine.com; arc=none (no signatures found); dkim=fail (message has been altered; 2048-bit rsa key sha256) header.d=infradead.org header.i=@infradead.org header.b=CWYgI2D7 x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=bombadil.20170209; dmarc=none (p=none,has-list-id=yes,d=none) header.from=infradead.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-usb-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=infradead.org header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754638AbeAQUiO (ORCPT ); Wed, 17 Jan 2018 15:38:14 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:57541 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753822AbeAQUWz (ORCPT ); Wed, 17 Jan 2018 15:22:55 -0500 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 68/99] vmalloc: Convert to XArray Date: Wed, 17 Jan 2018 12:21:32 -0800 Message-Id: <20180117202203.19756-69-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-usb-owner@vger.kernel.org X-Mailing-List: linux-usb@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: From: Matthew Wilcox The radix tree of vmap blocks is simpler to express as an XArray. Saves a couple of hundred bytes of text and eliminates a user of the radix tree preload API. Signed-off-by: Matthew Wilcox --- mm/vmalloc.c | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 673942094328..b6c138633592 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include #include @@ -821,12 +821,11 @@ struct vmap_block { static DEFINE_PER_CPU(struct vmap_block_queue, vmap_block_queue); /* - * Radix tree of vmap blocks, indexed by address, to quickly find a vmap block + * XArray of vmap blocks, indexed by address, to quickly find a vmap block * in the free path. Could get rid of this if we change the API to return a * "cookie" from alloc, to be passed to free. But no big deal yet. */ -static DEFINE_SPINLOCK(vmap_block_tree_lock); -static RADIX_TREE(vmap_block_tree, GFP_ATOMIC); +static DEFINE_XARRAY(vmap_block_tree); /* * We should probably have a fallback mechanism to allocate virtual memory @@ -865,8 +864,8 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) struct vmap_block *vb; struct vmap_area *va; unsigned long vb_idx; - int node, err; - void *vaddr; + int node; + void *ret, *vaddr; node = numa_node_id(); @@ -883,13 +882,6 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) return ERR_CAST(va); } - err = radix_tree_preload(gfp_mask); - if (unlikely(err)) { - kfree(vb); - free_vmap_area(va); - return ERR_PTR(err); - } - vaddr = vmap_block_vaddr(va->va_start, 0); spin_lock_init(&vb->lock); vb->va = va; @@ -902,11 +894,12 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) INIT_LIST_HEAD(&vb->free_list); vb_idx = addr_to_vb_idx(va->va_start); - spin_lock(&vmap_block_tree_lock); - err = radix_tree_insert(&vmap_block_tree, vb_idx, vb); - spin_unlock(&vmap_block_tree_lock); - BUG_ON(err); - radix_tree_preload_end(); + ret = xa_store(&vmap_block_tree, vb_idx, vb, gfp_mask); + if (xa_is_err(ret)) { + kfree(vb); + free_vmap_area(va); + return ERR_PTR(xa_err(ret)); + } vbq = &get_cpu_var(vmap_block_queue); spin_lock(&vbq->lock); @@ -923,9 +916,7 @@ static void free_vmap_block(struct vmap_block *vb) unsigned long vb_idx; vb_idx = addr_to_vb_idx(vb->va->va_start); - spin_lock(&vmap_block_tree_lock); - tmp = radix_tree_delete(&vmap_block_tree, vb_idx); - spin_unlock(&vmap_block_tree_lock); + tmp = xa_erase(&vmap_block_tree, vb_idx); BUG_ON(tmp != vb); free_vmap_area_noflush(vb->va); @@ -1031,7 +1022,6 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) static void vb_free(const void *addr, unsigned long size) { unsigned long offset; - unsigned long vb_idx; unsigned int order; struct vmap_block *vb; @@ -1045,10 +1035,7 @@ static void vb_free(const void *addr, unsigned long size) offset = (unsigned long)addr & (VMAP_BLOCK_SIZE - 1); offset >>= PAGE_SHIFT; - vb_idx = addr_to_vb_idx((unsigned long)addr); - rcu_read_lock(); - vb = radix_tree_lookup(&vmap_block_tree, vb_idx); - rcu_read_unlock(); + vb = xa_load(&vmap_block_tree, addr_to_vb_idx((unsigned long)addr)); BUG_ON(!vb); vunmap_page_range((unsigned long)addr, (unsigned long)addr + size); -- 2.15.1