Skip to content

Commit 665d3e0

Browse files
LiBaokun96tytso
authored andcommitted
ext4: reduce unnecessary memory allocation in alloc_flex_gd()
When a large flex_bg file system is resized, the number of groups to be added may be small, and a large amount of memory that will not be used will be allocated. Therefore, resize_bg can be set to the size after the number of new_group_data to be used is aligned upwards to the power of 2. This does not affect the disk layout after online resize and saves some memory. Signed-off-by: Baokun Li <[email protected]> Reviewed-by: Jan Kara <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 5d1935a commit 665d3e0

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

fs/ext4/resize.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,10 @@ struct ext4_new_flex_group_data {
235235
*
236236
* Returns NULL on failure otherwise address of the allocated structure.
237237
*/
238-
static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned int flexbg_size)
238+
static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned int flexbg_size,
239+
ext4_group_t o_group, ext4_group_t n_group)
239240
{
241+
ext4_group_t last_group;
240242
struct ext4_new_flex_group_data *flex_gd;
241243

242244
flex_gd = kmalloc(sizeof(*flex_gd), GFP_NOFS);
@@ -248,6 +250,14 @@ static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned int flexbg_size)
248250
else
249251
flex_gd->resize_bg = flexbg_size;
250252

253+
/* Avoid allocating large 'groups' array if not needed */
254+
last_group = o_group | (flex_gd->resize_bg - 1);
255+
if (n_group <= last_group)
256+
flex_gd->resize_bg = 1 << fls(n_group - o_group + 1);
257+
else if (n_group - last_group < flex_gd->resize_bg)
258+
flex_gd->resize_bg = 1 << max(fls(last_group - o_group + 1),
259+
fls(n_group - last_group));
260+
251261
flex_gd->groups = kmalloc_array(flex_gd->resize_bg,
252262
sizeof(struct ext4_new_group_data),
253263
GFP_NOFS);
@@ -2131,7 +2141,7 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
21312141
if (err)
21322142
goto out;
21332143

2134-
flex_gd = alloc_flex_gd(flexbg_size);
2144+
flex_gd = alloc_flex_gd(flexbg_size, o_group, n_group);
21352145
if (flex_gd == NULL) {
21362146
err = -ENOMEM;
21372147
goto out;

0 commit comments

Comments
 (0)