From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C80D33DC871 for ; Wed, 24 Jun 2026 15:55:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782316515; cv=none; b=HO6liiRY0o3SIrDkq9hLaonPDQyco2GwqbI4GQNA7xtTRvZWe78PwMFBK2TQVIgBHyQ4fwXwLdGG6VWsowmolbUs5SQwlbr8B8FirvgyN8qWhnFky9/zsTAMauBCDDsQn3mVE9xTyFmN10eaHxc4yggdz111LyBFfGgPzEVxlL0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782316515; c=relaxed/simple; bh=hfJn1ISxxkWed1Bhw5vwAzM8EpgX7J3WTRzBfqglt4s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l9XOUiCqhFzkBJNzDJ+BEV8CNbjYh+lpJKZoIbnEoDiAmhjvFo7m0qglBN5NJT+HectBtqc9PzpIbS45Qfxksg4c7x88TJzgtGpIdGSRCBN6EBMIPi9ZKT4CguF9c0G4G+r61e9zQBTbp0fr8JZmwtmPXX4C1ubDJ28Tj53ww8w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Lf3YRK0O; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Lf3YRK0O" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-8452a597afcso917313b3a.1 for ; Wed, 24 Jun 2026 08:55:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782316513; x=1782921313; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NYrbDXhmHxewEsyT65dV8hLwUaKhxclM3ZQCq1ly56Q=; b=Lf3YRK0O9TH4BZMv4VPv0NNzC/pQmi+YsexK59k1Al67csM12BsRkW9zn2gM/Mk+i8 CBaR+MmkxH4FjNL6v5lxPaFaAIc8vWBuli6rgXpHVR+PpSGq/7T+j3q49UOd8ikK60E1 lK2OQwKzk0GCtrk1p1srlwU8lT/uqkorWiP2JtCiw9g21YrotKXcuLOrXZ81/McETotC BrkJ8xX7xebvzllARQFMg8EZY9v5hcIFBpq2Tgd9V1TO8EdSJCM0MgEOoE/tDzsZx33h TneV5VJBDm5e8JiARJ0tLh9/RsAiywuyYGLtP/bUDMcBNBE6sXVXgZpIoHqLoCUfDgsR eSOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782316513; x=1782921313; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NYrbDXhmHxewEsyT65dV8hLwUaKhxclM3ZQCq1ly56Q=; b=D9sTwFjMxi+Ck23XY/GE03LJXf6MEIB9+QVo76R6Runv1v4wm2S9vnMwvcHu/a5TuP Hwn9fnrZgAeYe8T1AztBt6ImD7TyYW3tU8ooBu8hrMxcic//OHXWOTeJNVUpVukuVnV+ NzpfHx+ZB1yqglUHOELCQge4M4JHtOWfFTtlOs6dlZp3vtpPsYFxl+OSUpUWXLneFGYj sTwZH/NaSlMCTTnyfSspwWqioWteFGSPz7OHpsyeHCWr855ZKYYBSSiU3OZGCJo8g/Z6 IaJ/CYGAyGlssXUa979G2MOZrV+GIDkOfuGlZZxA2ckTyiS3fhjSIzq67I7PrWCJa1Ge 9JLQ== X-Forwarded-Encrypted: i=1; AFNElJ+tFSGZqOH+2sI6MyumZDe0+7s/mCFJKriYwEGCWqQ6DQHF7wxu8C1ocQAywhsCF19XcDphFlYcxUHxUas=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8Q6XX8DpUwjfPW+0+rgm6+iFCyv6j15XtePTUPmVdZRhAXdFE oCjAxgisORx/j3LJNphAR4rPlC1LPc8kYKbWl+HoFeLgEclQzddZYH/k X-Gm-Gg: AfdE7cn6PQtFhkrqlQ4QfqgQCVJa7mQsUV01c+vXook0zRvHZSBJUEQpwuqWdoPUVj5 gWQNIBQ7PLBS+TKq11ESBoPl5Rly3vmsn3BA702AUyjZrI17CjAIFxW97gebtV+T3ZJXSspseAG pXy4DjbOmoOQkQUeQMtCvMEB9M29gaNPIuA4JKkB6wXaFMBiykbNXD+fWZMV2LtmafnL7WzgNZX veD4bY233nTYMFLCQU0+BpXCzUsCPnRKKtPrUELnK9JCAguEGDddpFjb1PoOP5683OkVpkQLiTY 8JF3SWywaJixAlsii8f0kLZZmpKeqyKuWbreZay5js66tcIpCYY1Z+15wxbJ0jlPuuP3TuhO/sy 5CuRsIZ8rzd+iAUGuv8zMRQ8azJeDStzxSswrRrQ45VMSpeabqZ9MyUhn4o0z5CEt6P5pQ1Bw6B aC5rWV/CKhuE7pekoI1tWxRmExTAAwCRtRJ7Vfm+uYTYhgPHcaMSsd2zT/KMrVyvpns27ydxAj1 8Ld+Hw= X-Received: by 2002:a05:6a00:2d07:b0:845:39dd:f773 with SMTP id d2e1a72fcca58-845624575famr26310124b3a.7.1782316513064; Wed, 24 Jun 2026 08:55:13 -0700 (PDT) Received: from research02.. ([2601:1c1:8700:f5b:fe34:97ff:fea3:c147]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-845a40f55cesm2658387b3a.44.2026.06.24.08.55.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jun 2026 08:55:12 -0700 (PDT) From: Hiroshi Nishida To: Song Liu , Yu Kuai Cc: Li Nan , Xiao Ni , linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, Hiroshi Nishida Subject: [PATCH 6/8] md/raid5: allocate worker groups per NUMA node Date: Wed, 24 Jun 2026 08:54:50 -0700 Message-ID: <20260624155452.211646-7-nishidafmly@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260624155452.211646-1-nishidafmly@gmail.com> References: <20260624155452.211646-1-nishidafmly@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit alloc_thread_groups() previously allocated all r5worker arrays in a single kcalloc() block, assigning workers for NUMA node N from node 0 memory. On multi-socket systems this causes remote memory traffic on every worker->work and worker->temp_inactive_list access. Replace the single allocation with kzalloc_node(size, GFP_NOIO, i) per group so each node's workers live in local memory. Because the workers are now separate per-node allocations, both free sites -- free_thread_groups() and the reallocation path in raid5_store_group_thread_cnt() -- are updated to free each group's allocation individually instead of only group 0's. Also fix a latent bug: the original kcalloc() had its nmemb and size arguments swapped (harmless due to commutativity but semantically wrong). Assisted-by: Claude:claude-opus-4-8 [Claude Code] Signed-off-by: Hiroshi Nishida --- drivers/md/raid5.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8e9edaaca667..c8787ab7b309 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -7297,8 +7297,12 @@ raid5_store_group_thread_cnt(struct mddev *mddev, const char *page, size_t len) conf->worker_groups = new_groups; spin_unlock_irq(&conf->device_lock); - if (old_groups) - kfree(old_groups[0].workers); + if (old_groups) { + int node; + + for (node = 0; node < num_possible_nodes(); node++) + kfree(old_groups[node].workers); + } kfree(old_groups); } } @@ -7336,7 +7340,6 @@ static int alloc_thread_groups(struct r5conf *conf, int cnt, int *group_cnt, { int i, j, k; ssize_t size; - struct r5worker *workers; if (cnt == 0) { *group_cnt = 0; @@ -7344,24 +7347,24 @@ static int alloc_thread_groups(struct r5conf *conf, int cnt, int *group_cnt, return 0; } *group_cnt = num_possible_nodes(); - size = sizeof(struct r5worker) * cnt; - workers = kcalloc(size, *group_cnt, GFP_NOIO); *worker_groups = kzalloc_objs(struct r5worker_group, *group_cnt, GFP_NOIO); - if (!*worker_groups || !workers) { - kfree(workers); - kfree(*worker_groups); + if (!*worker_groups) return -ENOMEM; - } + size = sizeof(struct r5worker) * cnt; for (i = 0; i < *group_cnt; i++) { - struct r5worker_group *group; + struct r5worker_group *group = &(*worker_groups)[i]; + struct r5worker *workers; + + workers = kzalloc_node(size, GFP_NOIO, i); + if (!workers) + goto out_free; - group = &(*worker_groups)[i]; INIT_LIST_HEAD(&group->handle_list); INIT_LIST_HEAD(&group->loprio_list); group->conf = conf; - group->workers = workers + i * cnt; + group->workers = workers; for (j = 0; j < cnt; j++) { struct r5worker *worker = group->workers + j; @@ -7374,12 +7377,22 @@ static int alloc_thread_groups(struct r5conf *conf, int cnt, int *group_cnt, } return 0; + +out_free: + while (--i >= 0) + kfree((*worker_groups)[i].workers); + kfree(*worker_groups); + *worker_groups = NULL; + return -ENOMEM; } static void free_thread_groups(struct r5conf *conf) { + int i; + if (conf->worker_groups) - kfree(conf->worker_groups[0].workers); + for (i = 0; i < conf->group_cnt; i++) + kfree(conf->worker_groups[i].workers); kfree(conf->worker_groups); conf->worker_groups = NULL; } -- 2.43.0