summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuxu Zhuo <qiuxu.zhuo@intel.com>2025-07-31 22:55:31 +0800
committerTony Luck <tony.luck@intel.com>2025-08-19 16:24:09 -0700
commit43060ca5332462903f57c2ff9b49b69124618070 (patch)
treeb6f1131de7c283efacde56a4062a516029ceab6c
parent30b47b71fdc0091db5a4fa9503ad630aeb0ab3eb (diff)
EDAC/skx_common: Make skx_dev->imc[] a flexible array
The current skx->imc[NUM_IMC] array of memory controller instances is sized using the macro NUM_IMC. Each time EDAC support is added for a new CPU, NUM_IMC needs to be updated to ensure it is greater than or equal to the number of memory controllers for the new CPU. This approach is inconvenient and results in memory waste for older CPUs with fewer memory controllers. To address this, make skx->imc[] a flexible array and determine its size from configuration data or at runtime. Suggested-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com> Signed-off-by: Tony Luck <tony.luck@intel.com> Link: https://lore.kernel.org/r/20250731145534.2759334-5-qiuxu.zhuo@intel.com
-rw-r--r--drivers/edac/skx_common.c3
-rw-r--r--drivers/edac/skx_common.h2
2 files changed, 3 insertions, 2 deletions
diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c
index e03268e9073f..09187043c045 100644
--- a/drivers/edac/skx_common.c
+++ b/drivers/edac/skx_common.c
@@ -17,6 +17,7 @@
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/adxl.h>
+#include <linux/overflow.h>
#include <acpi/nfit.h>
#include <asm/mce.h>
#include <asm/uv/uv.h>
@@ -343,7 +344,7 @@ int skx_get_all_bus_mappings(struct res_config *cfg, struct list_head **list)
if (!pdev)
break;
ndev++;
- d = kzalloc(sizeof(*d), GFP_KERNEL);
+ d = kzalloc(struct_size(d, imc, imc_num), GFP_KERNEL);
if (!d) {
pci_dev_put(pdev);
return -ENOMEM;
diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h
index 95d61d23f89e..e7038fd45d06 100644
--- a/drivers/edac/skx_common.h
+++ b/drivers/edac/skx_common.h
@@ -172,7 +172,7 @@ struct skx_dev {
u8 colbits;
} dimms[NUM_DIMMS];
} chan[NUM_CHANNELS];
- } imc[NUM_IMC];
+ } imc[];
};
struct skx_pvt {