Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp259718imm; Tue, 22 May 2018 18:19:49 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqUfx+aqZqOC068dTMA6vtzgXNeQjjTVh+QS3yFli6Tp6S91zRHTCXDdIdKbAY2ajgIqTLf X-Received: by 2002:a63:6f83:: with SMTP id k125-v6mr631950pgc.63.1527038389871; Tue, 22 May 2018 18:19:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527038389; cv=none; d=google.com; s=arc-20160816; b=vzK8o5zxqKX0vJDtOj9B0PZSxkzI6iJU3+Kla9tz1Cequ3NuxBEXjTWJCFV4bpbB/C 1GcC4KsHfJCHHDNp8UYs6oh5g3kXa18e4LKp3nW/ftMNaBHQrRSO1SY3/XmPNBtt5ups bU4eabSUU2VvChGVL0EPa2bgtLPTEKVhTe0gJR8jpvIeaLX70mfMXUIoZM8T8IRQYfy9 9Iu8tlJVTFDW4tkW9PT5X3GCO/iaSHJpsw1x3ZV12JLJMDORhgPnyfT7s7MBzJzqpsbA CMLbOay0RsX0EcWt60zEeqSbFt2r3TG8yvrTLjhHB0URYL8pMPI/Wepq5C+WDJExwP7Z qS/w== 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=aAylj390SzpurFM70TLaaWr6yaijN8/amlAfF5yOrvQ=; b=jhDTKI27mM2m/uewrj0vJRcnnCPfVj8ZDtjLl7JZ1IeApxZ7yNfIcrfan+KjYHkWQK lDBPSIE0jWdNvLQKNy73/l4wHBsx0YyRL+X644nNWe80gaveq2nWZx8bZYjLhKH1kqYU 298om5WdBUuzZs909wtFOKmal/NyRj3ZWhfPgTI8tyzvPZ0jNqdUHQqc8iK/+BqHgANK QebdN71lnYmL/+yuuVoD8BYI2F5TIhFjO3lghng9+ZcJKcT5WrEBGBBYRRVdvowHrilG d5evs5JAknTYlJ5P/r85uDXnl3X3ejSVdvpiBDooyXWpuRqm69bLX7rZ+OaFRCg4q5Cq rvYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FiWvqlct; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p1-v6si16888863pfn.269.2018.05.22.18.19.34; Tue, 22 May 2018 18:19:49 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FiWvqlct; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753686AbeEWBSv (ORCPT + 99 others); Tue, 22 May 2018 21:18:51 -0400 Received: from mail-qt0-f194.google.com ([209.85.216.194]:44990 "EHLO mail-qt0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753643AbeEWBSr (ORCPT ); Tue, 22 May 2018 21:18:47 -0400 Received: by mail-qt0-f194.google.com with SMTP id d3-v6so26041043qtp.11; Tue, 22 May 2018 18:18:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=aAylj390SzpurFM70TLaaWr6yaijN8/amlAfF5yOrvQ=; b=FiWvqlctm9YOqhV6PADLlMRu8p/VFaKIBu3bE3AIQDHd0ob/6ve+cZdnN3UdDFU3ZY zwOcH14wMyeNBRo5vhIFmWj6Km1/bEU1y+8/nEZpH0dra7+DLFvEiGcJHcuczP1YRQhl 9ZWKa3yG5g9EDa6ExRyx/WsxYCIPOu+Rxzels3Ma3lU98+giW7XXq1bHMSWMDg50yy0k H7WcgBP1u7lSmgLKRnN56Z+ugtYiuoW5pA9lu6BfA6L7PAbXEPppoHilqlFr24IggPzR 0hv9aoXvT1eBT9jvTbaKPw6NCop8UestQ1XitnTkAtSAa6t1prFK7lL7YD1ZXaxUFCaM x9og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=aAylj390SzpurFM70TLaaWr6yaijN8/amlAfF5yOrvQ=; b=kDOe7gpOtEeEBsepDy8LsSqUB82+vX/7POJuEMnDFmAXtNlhaFcV/3cYxZMls5MPZs 22y7pHFdn2tPaTD21tkPlyjCgnu4846c29p4TT8KWFGJZoqZWkax0aq4rcZolR40GjyN LGDBFFb+z4fLdY1kohekpOq6P3y0gfcCnXLGG/J+JDGacKgwSBSRRHodLCcs9vURVHv7 2uLZyS4mahOk4K8D8jWvM4oLb3w0e7XvokgIatthjM/37Hk1r3ImlYViAJlgHvXc7qY1 hw6I3qU4uqkXp+naSRLD2BGqJTrMadvAYge3pR6kBh73z8Z915FZLuqzxX9RTfrr+aN8 NcCw== X-Gm-Message-State: ALKqPwc+rgat7wxTbWmUspvyts3X30pHh/kb4SK5r7zyxSkZhuOwCtU5 RMF1bqAqjx3yC8pv7jBGnWisGMSNXw== X-Received: by 2002:ac8:235c:: with SMTP id b28-v6mr764551qtb.212.1527038325681; Tue, 22 May 2018 18:18:45 -0700 (PDT) Received: from localhost.localdomain (c-71-234-172-214.hsd1.vt.comcast.net. [71.234.172.214]) by smtp.gmail.com with ESMTPSA id s127-v6sm12604251qkf.21.2018.05.22.18.18.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 May 2018 18:18:44 -0700 (PDT) From: Kent Overstreet To: linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk, akpm@linux-foundation.org, willy@infradead.org, gregkh@linuxfoundation.org, linux-security-module@vger.kernel.org, selinux@tycho.nsa.gov, dev@openvswitch.org, shli@kernel.org, linux-raid@vger.kernel.org Cc: Kent Overstreet Subject: [PATCH 3/6] md: convert to genradix Date: Tue, 22 May 2018 21:18:18 -0400 Message-Id: <20180523011821.12165-3-kent.overstreet@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180523011821.12165-1-kent.overstreet@gmail.com> References: <20180523011821.12165-1-kent.overstreet@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org the new generic radix trees have a simpler API and implementation, and no limitations on number of elements, so all flex_array users are being converted Signed-off-by: Kent Overstreet --- drivers/md/raid5-ppl.c | 5 ++- drivers/md/raid5.c | 77 ++++++++++++++++++++---------------------- drivers/md/raid5.h | 4 ++- 3 files changed, 42 insertions(+), 44 deletions(-) diff --git a/drivers/md/raid5-ppl.c b/drivers/md/raid5-ppl.c index 42890a0837..ffb4ae0679 100644 --- a/drivers/md/raid5-ppl.c +++ b/drivers/md/raid5-ppl.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include "md.h" @@ -165,7 +164,7 @@ ops_run_partial_parity(struct stripe_head *sh, struct raid5_percpu *percpu, struct dma_async_tx_descriptor *tx) { int disks = sh->disks; - struct page **srcs = flex_array_get(percpu->scribble, 0); + struct page **srcs = __genradix_ptr(&percpu->scribble, 0); int count = 0, pd_idx = sh->pd_idx, i; struct async_submit_ctl submit; @@ -196,7 +195,7 @@ ops_run_partial_parity(struct stripe_head *sh, struct raid5_percpu *percpu, } init_async_submit(&submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_ZERO_DST, tx, - NULL, sh, flex_array_get(percpu->scribble, 0) + NULL, sh, __genradix_ptr(&percpu->scribble, 0) + sizeof(struct page *) * (sh->disks + 2)); if (count == 1) diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index b5d2601483..31f88db83c 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -54,7 +54,6 @@ #include #include #include -#include #include #include @@ -1396,7 +1395,9 @@ static addr_conv_t *to_addr_conv(struct stripe_head *sh, { void *addr; - addr = flex_array_get(percpu->scribble, i); + addr = __genradix_ptr(&percpu->scribble, + __idx_to_offset(i, percpu->scribble_obj_size)); + return addr + sizeof(struct page *) * (sh->disks + 2); } @@ -1405,7 +1406,8 @@ static struct page **to_addr_page(struct raid5_percpu *percpu, int i) { void *addr; - addr = flex_array_get(percpu->scribble, i); + addr = __genradix_ptr(&percpu->scribble, + __idx_to_offset(i, percpu->scribble_obj_size)); return addr; } @@ -2235,21 +2237,21 @@ static int grow_stripes(struct r5conf *conf, int num) * calculate over all devices (not just the data blocks), using zeros in place * of the P and Q blocks. */ -static struct flex_array *scribble_alloc(int num, int cnt, gfp_t flags) +static int scribble_alloc(struct raid5_percpu *percpu, + int num, int cnt, gfp_t flags) { - struct flex_array *ret; - size_t len; + size_t obj_size = + sizeof(struct page *) * (num+2) + + sizeof(addr_conv_t) * (num+2); + int ret; - len = sizeof(struct page *) * (num+2) + sizeof(addr_conv_t) * (num+2); - ret = flex_array_alloc(len, cnt, flags); - if (!ret) - return NULL; - /* always prealloc all elements, so no locking is required */ - if (flex_array_prealloc(ret, 0, cnt, flags)) { - flex_array_free(ret); - return NULL; - } - return ret; + ret = __genradix_prealloc(&percpu->scribble, + __idx_to_offset(cnt + 1, obj_size), flags); + if (ret) + return ret; + + percpu->scribble_obj_size = obj_size; + return 0; } static int resize_chunks(struct r5conf *conf, int new_disks, int new_sectors) @@ -2267,23 +2269,18 @@ static int resize_chunks(struct r5conf *conf, int new_disks, int new_sectors) return 0; mddev_suspend(conf->mddev); get_online_cpus(); + for_each_present_cpu(cpu) { struct raid5_percpu *percpu; - struct flex_array *scribble; percpu = per_cpu_ptr(conf->percpu, cpu); - scribble = scribble_alloc(new_disks, - new_sectors / STRIPE_SECTORS, - GFP_NOIO); - - if (scribble) { - flex_array_free(percpu->scribble); - percpu->scribble = scribble; - } else { - err = -ENOMEM; + err = scribble_alloc(percpu, new_disks, + new_sectors / STRIPE_SECTORS, + GFP_NOIO); + if (err) break; - } } + put_online_cpus(); mddev_resume(conf->mddev); if (!err) { @@ -6716,25 +6713,25 @@ raid5_size(struct mddev *mddev, sector_t sectors, int raid_disks) static void free_scratch_buffer(struct r5conf *conf, struct raid5_percpu *percpu) { safe_put_page(percpu->spare_page); - if (percpu->scribble) - flex_array_free(percpu->scribble); percpu->spare_page = NULL; - percpu->scribble = NULL; + __genradix_free(&percpu->scribble); } static int alloc_scratch_buffer(struct r5conf *conf, struct raid5_percpu *percpu) { - if (conf->level == 6 && !percpu->spare_page) + if (conf->level == 6 && !percpu->spare_page) { percpu->spare_page = alloc_page(GFP_KERNEL); - if (!percpu->scribble) - percpu->scribble = scribble_alloc(max(conf->raid_disks, - conf->previous_raid_disks), - max(conf->chunk_sectors, - conf->prev_chunk_sectors) - / STRIPE_SECTORS, - GFP_KERNEL); - - if (!percpu->scribble || (conf->level == 6 && !percpu->spare_page)) { + if (!percpu->spare_page) + return -ENOMEM; + } + + if (scribble_alloc(percpu, + max(conf->raid_disks, + conf->previous_raid_disks), + max(conf->chunk_sectors, + conf->prev_chunk_sectors) + / STRIPE_SECTORS, + GFP_KERNEL)) { free_scratch_buffer(conf, percpu); return -ENOMEM; } diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 3f8da26032..2c39bfce32 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h @@ -4,6 +4,7 @@ #include #include +#include /* * @@ -637,10 +638,11 @@ struct r5conf { /* per cpu variables */ struct raid5_percpu { struct page *spare_page; /* Used when checking P/Q in raid6 */ - struct flex_array *scribble; /* space for constructing buffer + struct __genradix scribble; /* space for constructing buffer * lists and performing address * conversions */ + int scribble_obj_size; } __percpu *percpu; int scribble_disks; int scribble_sectors; -- 2.17.0