lkml.org 
[lkml]   [2024]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/2] thermal/drivers/mediatek/lvts_thermal: Improve some memory allocation
    Date
    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@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

    \
     
     \ /
      Last update: 2024-05-27 16:27    [W:3.146 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site