From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.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 58C722BDC32 for ; Thu, 30 Apr 2026 22:01:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777586471; cv=none; b=FGbrdnuiOxziZwzqyDUdL9KvBdbs8qTu4/9rXWLiq+kl2y9GR71trS5lUNR8JDIezZuYkXap5zo3gFEOeWXDlP0PDsUt/Raop791QuDz9KzmD74h4YrqIZzgTW4xs0FMPGS+4PrsBXp2VNKGvRsfgDdIsDhvhbRF47Ks2dPhogQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777586471; c=relaxed/simple; bh=PliZUdjcdarMC+vMmbXRSruaLKQ7V3ErqYWXkuwC3KA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=APwL3zPVlafXBBB+LAagEqLOMcXKDqLCyafIjyisw/0mxrERqB6TyZZbTJ9IrjvgACAorg/PC0bQKmHZVTdGF8o1D/WjHCdFf0JMeAMuukkNqTjt3bv7aOsZDDVmJke/8mTOAVtaB51X9r777PRpe335xBOc7rTTnM33AFNxKeQ= 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=ApjxexXg; arc=none smtp.client-ip=209.85.215.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="ApjxexXg" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-c648bc907ebso891347a12.3 for ; Thu, 30 Apr 2026 15:01:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777586470; x=1778191270; 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=pBIWSWZQjXNPa2sD5+J+8oDnHNnLvrf+nwX2j+wXk3s=; b=ApjxexXgW8hOOYA6Mgyb/zfFuUEdHz+d0m7ZMf/7wtErThUekLSFTggw/kT1XdpfiD Z0A3KN1M0AnRqIXkxGE30JbvQrqqJw8drf1m4BiL1M8NAxZUv5go9TAAjI5inAlbfDdO YwPL0bDmTo7dnL7NrQG6obvX5FGMTJ/rIaHVXSYrbm09kZP+Tvhb0tL6J+yh/RK4L01E wxJzJttke0jUdPuxciJDoKq/SXBQc9kLI1tAGW2LIjZqYhBATBHs11nMNuCRlrexu4Ut o3TtPu7k9T7A8x0D5V+nDporXlG+XU0mkuvwQAliwQrmwubsvIOW+tTvhfegecPx1xui /kKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777586470; x=1778191270; 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=pBIWSWZQjXNPa2sD5+J+8oDnHNnLvrf+nwX2j+wXk3s=; b=I1drjQYs3R0hkupKS4ojsxfiEGF+g3HncOUZWnEBfRO6x2I56jYUKtGpiqtsu6lucE xPOWtbzJ+YVVv8pCBGx2y7pA+1c9UfYhYA8o1FtY6KKJ1okpLcFW65yO7C7DYL+hNBzC UjRemTuxqDY8FE6907mCMYG4tHXYTMWD7Rdyp8W04PQa6LVWi+AvB6rQmr0q+DUCfWZ9 T0KgD9+uYSV9B8+51he7MgThjR8/H21JIqEfPpDsHY2Je4eutMATZKyCaVTqlJkDazXn fJdRy6c+nwE0JJkbGZNctGeY+c/LDVCrEjEVfCL34Ti96hfN8bxTVrOtaxk8s9qLO6Tf SU2A== X-Forwarded-Encrypted: i=1; AFNElJ/hl/Y+NLnb8ZvhQFzXOEe2/M/ZuHirQBQBlNG4ckT/lSvEE3CxwYd/bAadnu1KW4DhumEQcvHuq7RL4NI=@vger.kernel.org X-Gm-Message-State: AOJu0Yx0/Adea9vn7/TsIv8K8XPKwJXeVNmCpITvKQChbwex7HOTcSr5 cKA3ergr64hvDgIVkGN59JVG2xw9cvSIrEfFBaxqIH0FQcZ/MJRhGtRf X-Gm-Gg: AeBDieu+gGwB+Mf/PCt7W2WmWBQ1xHHqkz7JmXIL9/wfHrJCEt43/WE92mqah3y7XvV HUi9At0whh8BVTV54oQiDOuYrays0m2FayzUlD5n+SLewT2TUtNLM3vb/fvWrYM6M0OUJEdCo65 XHfjw7mxhimAbI5MVchpokA82UsN05fEzfi2G4UOaxgbik3FNoUFQMu+TeXskVkOHmCXx1rrwXP 7sS2R6AYgRjNvDzBaDWuCrKuW/WMprKvdijWDokpXaduLobjqaWS7M9fPLB3Tp3YSYZul/ytdaD KRnsDE24s5kul3EdEyjLXHJVlRm1yMd0lZKTw+VkV+nUtnIvMiQIxViPTgh/M+foZdl4ZFWB4Td 0wCbgVDutneKQSUst4qDAh+3dMPngX7IRxFl74go/6eenJa+qPjahHNBYTGBWHipwrjdvhjKjX5 VaVZOJVrCSjPKCDy7xMqHKB0reY7HPfRqeLYCKAssdQOFy4XJihzi3IFEZfID+9LP7isB4Lx3GK vnDNp7eu+DuySEBSeRhQA+JBF97cjoXhqOibhKhnWBflw== X-Received: by 2002:a05:6a00:8e01:b0:82f:111:61d3 with SMTP id d2e1a72fcca58-8351a5d8a70mr334446b3a.44.1777586469642; Thu, 30 Apr 2026 15:01:09 -0700 (PDT) Received: from ryzen ([2601:644:8000:5b5d:7285:c2ff:fe45:8a32]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83515ad7873sm614130b3a.38.2026.04.30.15.01.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Apr 2026 15:01:08 -0700 (PDT) From: Rosen Penev To: linux-edac@vger.kernel.org Cc: Borislav Petkov , Tony Luck , Kees Cook , "Gustavo A. R. Silva" , linux-kernel@vger.kernel.org (open list), linux-hardening@vger.kernel.org (open list:KERNEL HARDENING (not covered by other areas):Keyword:\b__counted_by(_le|_be)?\b) Subject: [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx Date: Thu, 30 Apr 2026 15:00:46 -0700 Message-ID: <20260430220046.72371-3-rosenp@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260430220046.72371-1-rosenp@gmail.com> References: <20260430220046.72371-1-rosenp@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 Simplifies memory handling slightly by using a flexible array member. Signed-off-by: Rosen Penev --- drivers/edac/edac_device.c | 40 +++++++++++++------------------------- include/linux/edac.h | 2 +- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index 9c21997a50e0..a6c41ce68f13 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c @@ -569,8 +569,6 @@ static void edac_dev_release(struct device *dev) { struct edac_dev_feat_ctx *ctx = container_of(dev, struct edac_dev_feat_ctx, dev); - kfree(ctx->mem_repair); - kfree(ctx->scrub); kfree(ctx->dev.groups); kfree(ctx); } @@ -612,6 +610,7 @@ int edac_dev_register(struct device *parent, char *name, int attr_gcnt = 0; int ret = -ENOMEM; int scrub_cnt = 0; + size_t alloc_size; int feat; if (!parent || !name || !num_features || !ras_features) @@ -636,26 +635,18 @@ int edac_dev_register(struct device *parent, char *name, } } - ctx = kzalloc_obj(*ctx); + alloc_size = struct_size(ctx, scrub, scrub_cnt); + alloc_size += sizeof(*ctx->mem_repair) * mem_repair_cnt; + ctx = kzalloc(alloc_size, GFP_KERNEL); if (!ctx) return -ENOMEM; + ctx->mem_repair = ctx->scrub + scrub_cnt; + ras_attr_groups = kzalloc_objs(*ras_attr_groups, attr_gcnt + 1); if (!ras_attr_groups) goto ctx_free; - if (scrub_cnt) { - ctx->scrub = kzalloc_objs(*ctx->scrub, scrub_cnt); - if (!ctx->scrub) - goto groups_free; - } - - if (mem_repair_cnt) { - ctx->mem_repair = kzalloc_objs(*ctx->mem_repair, mem_repair_cnt); - if (!ctx->mem_repair) - goto data_mem_free; - } - attr_gcnt = 0; scrub_cnt = 0; mem_repair_cnt = 0; @@ -664,7 +655,7 @@ int edac_dev_register(struct device *parent, char *name, case RAS_FEAT_SCRUB: if (!ras_features->scrub_ops || scrub_cnt != ras_features->instance) { ret = -EINVAL; - goto data_mem_free; + goto groups_free; } dev_data = &ctx->scrub[scrub_cnt]; @@ -674,7 +665,7 @@ int edac_dev_register(struct device *parent, char *name, ret = edac_scrub_get_desc(parent, &ras_attr_groups[attr_gcnt], ras_features->instance); if (ret) - goto data_mem_free; + goto groups_free; scrub_cnt++; attr_gcnt++; @@ -682,7 +673,7 @@ int edac_dev_register(struct device *parent, char *name, case RAS_FEAT_ECS: if (!ras_features->ecs_ops) { ret = -EINVAL; - goto data_mem_free; + goto groups_free; } dev_data = &ctx->ecs; @@ -691,7 +682,7 @@ int edac_dev_register(struct device *parent, char *name, ret = edac_ecs_get_desc(parent, &ras_attr_groups[attr_gcnt], ras_features->ecs_info.num_media_frus); if (ret) - goto data_mem_free; + goto groups_free; attr_gcnt += ras_features->ecs_info.num_media_frus; break; @@ -699,7 +690,7 @@ int edac_dev_register(struct device *parent, char *name, if (!ras_features->mem_repair_ops || mem_repair_cnt != ras_features->instance) { ret = -EINVAL; - goto data_mem_free; + goto groups_free; } dev_data = &ctx->mem_repair[mem_repair_cnt]; @@ -709,14 +700,14 @@ int edac_dev_register(struct device *parent, char *name, ret = edac_mem_repair_get_desc(parent, &ras_attr_groups[attr_gcnt], ras_features->instance); if (ret) - goto data_mem_free; + goto groups_free; mem_repair_cnt++; attr_gcnt++; break; default: ret = -EINVAL; - goto data_mem_free; + goto groups_free; } } @@ -729,7 +720,7 @@ int edac_dev_register(struct device *parent, char *name, ret = dev_set_name(&ctx->dev, "%s", name); if (ret) - goto data_mem_free; + goto groups_free; ret = device_register(&ctx->dev); if (ret) { @@ -739,9 +730,6 @@ int edac_dev_register(struct device *parent, char *name, return devm_add_action_or_reset(parent, edac_dev_unreg, &ctx->dev); -data_mem_free: - kfree(ctx->mem_repair); - kfree(ctx->scrub); groups_free: kfree(ras_attr_groups); ctx_free: diff --git a/include/linux/edac.h b/include/linux/edac.h index 7a3c1c60dea7..b3ca9e3d0521 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -864,9 +864,9 @@ struct edac_dev_data { struct edac_dev_feat_ctx { struct device dev; void *private; - struct edac_dev_data *scrub; struct edac_dev_data ecs; struct edac_dev_data *mem_repair; + struct edac_dev_data scrub[]; }; struct edac_dev_feature { -- 2.54.0