Re: [PATCH] soc: mediatek: mtk-dvfsrc: use flex array
From: Gustavo A. R. Silva <hidden>
Date: 2026-03-06 19:21:31
Also in:
linux-hardening, linux-mediatek, lkml
On 3/5/26 08:20, Rosen Penev wrote:
quoted hunk ↗ jump to hunk
Simplifies allocation from kzalloc + kcaloc to one allocation. Allows extra runtime analysis with __counted_by. Signed-off-by: Rosen Penev <redacted> --- drivers/soc/mediatek/mtk-dvfsrc.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)diff --git a/drivers/soc/mediatek/mtk-dvfsrc.c b/drivers/soc/mediatek/mtk-dvfsrc.c index 548a28f50242..48b1fcf3e101 100644 --- a/drivers/soc/mediatek/mtk-dvfsrc.c +++ b/drivers/soc/mediatek/mtk-dvfsrc.c@@ -71,8 +71,8 @@ struct dvfsrc_opp { }; struct dvfsrc_opp_desc { - const struct dvfsrc_opp *opps; u32 num_opp; + struct dvfsrc_opp opps[] __counted_by(num_opp); }; struct dvfsrc_soc_data;@@ -489,7 +489,6 @@ static u32 dvfsrc_get_opp_gear(struct mtk_dvfsrc *dvfsrc, u8 level) static int dvfsrc_get_hw_opps_v4(struct mtk_dvfsrc *dvfsrc) { - struct dvfsrc_opp *dvfsrc_opps; struct dvfsrc_opp_desc *desc; u32 num_opps, gear_info; u8 num_vcore, num_dram;@@ -520,24 +519,19 @@ static int dvfsrc_get_hw_opps_v4(struct mtk_dvfsrc *dvfsrc) num_opps, num_vcore, num_dram, num_emi); /* Allocate everything now as anything else after that cannot fail */ - desc = devm_kzalloc(dvfsrc->dev, sizeof(*desc), GFP_KERNEL); + desc = devm_kzalloc(dvfsrc->dev, struct_size(desc, opps, num_ops + 1), GFP_KERNEL);
Mmhh... You should really consider building your code before submitting any patches. -Gustavo
if (!desc)
return -ENOMEM;
- dvfsrc_opps = devm_kcalloc(dvfsrc->dev, num_opps + 1,
- sizeof(*dvfsrc_opps), GFP_KERNEL);
- if (!dvfsrc_opps)
- return -ENOMEM;
+ desc->num_opp = num_opps + 1;
/* Read the OPP table gear indices */
for (i = 0; i <= num_opps; i++) {
gear_info = dvfsrc_get_opp_gear(dvfsrc, num_opps - i);
- dvfsrc_opps[i].vcore_opp = FIELD_GET(DVFSRC_V4_GEAR_INFO_VCORE, gear_info);
- dvfsrc_opps[i].dram_opp = FIELD_GET(DVFSRC_V4_GEAR_INFO_DRAM, gear_info);
- dvfsrc_opps[i].emi_opp = FIELD_GET(DVFSRC_V4_GEAR_INFO_EMI, gear_info);
+ desc->opps[i].vcore_opp = FIELD_GET(DVFSRC_V4_GEAR_INFO_VCORE, gear_info);
+ desc->opps[i].dram_opp = FIELD_GET(DVFSRC_V4_GEAR_INFO_DRAM, gear_info);
+ desc->opps[i].emi_opp = FIELD_GET(DVFSRC_V4_GEAR_INFO_EMI, gear_info);
};
- desc->num_opp = num_opps + 1;
- desc->opps = dvfsrc_opps;
/* Assign to main structure now that everything is done! */
dvfsrc->curr_opps = desc;