[PATCH 2/2] thermal/drivers/mediatek/lvts_thermal: Improve some memory allocation

Christophe JAILLET christophe.jaillet at wanadoo.fr
Sun Apr 7 13:01:49 PDT 2024


lvts_debugfs_init() is called with lvts_td->num_lvts_ctrl being 2, 3 or 4.
sizeof(struct debugfs_regset32) is small. 32 byres on a x86_64.

So, given the overhead of devm_kzalloc(), it is better to allocate all
needed regset at once.

The overhead of devm_kzalloc() is 40 bytes on a x86_64, and because of
rounding in memory allocation, it leads to:
 2 * (32 + 40) = 2 * 72	--> 2 96 bytes allocations for a total of 192 bytes
 3 * (32 + 40) = 3 * 72	--> 3 96 bytes allocations for a total of 288 bytes
 4 * (32 + 40) = 4 * 72	--> 4 96 bytes allocations for a total of 384 bytes

using a single devm_kcalloc():
 2 * 32 + 40 = 104	--> 1 allocation for a total of 128
 3 * 32 + 40 = 136	--> 1 allocation for a total of 192
 4 * 32 + 40 = 168	--> 1 allocation for a total of 192

So, this saves both a few bytes and reduce memory fragmentation.

Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr>
---
Compile tested-only
---
 drivers/thermal/mediatek/lvts_thermal.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c
index 3003dc350766..b133f731c5ba 100644
--- a/drivers/thermal/mediatek/lvts_thermal.c
+++ b/drivers/thermal/mediatek/lvts_thermal.c
@@ -204,7 +204,7 @@ static const struct debugfs_reg32 lvts_regs[] = {
 
 static int lvts_debugfs_init(struct device *dev, struct lvts_domain *lvts_td)
 {
-	struct debugfs_regset32 *regset;
+	struct debugfs_regset32 *regsets;
 	struct lvts_ctrl *lvts_ctrl;
 	struct dentry *dentry;
 	char name[64];
@@ -214,8 +214,14 @@ static int lvts_debugfs_init(struct device *dev, struct lvts_domain *lvts_td)
 	if (IS_ERR(lvts_td->dom_dentry))
 		return 0;
 
+	regsets = devm_kcalloc(dev, lvts_td->num_lvts_ctrl,
+			       sizeof(*regsets), GFP_KERNEL);
+	if (!regsets)
+		return 0;
+
 	for (i = 0; i < lvts_td->num_lvts_ctrl; i++) {
 
+		struct debugfs_regset32 *regset = &regsets[i];
 		lvts_ctrl = &lvts_td->lvts_ctrl[i];
 
 		sprintf(name, "controller%d", i);
@@ -223,10 +229,6 @@ static int lvts_debugfs_init(struct device *dev, struct lvts_domain *lvts_td)
 		if (IS_ERR(dentry))
 			continue;
 
-		regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL);
-		if (!regset)
-			continue;
-
 		regset->base = lvts_ctrl->base;
 		regset->regs = lvts_regs;
 		regset->nregs = ARRAY_SIZE(lvts_regs);
-- 
2.44.0




More information about the linux-arm-kernel mailing list