[PATCH] mmc: mmc_test: use kzalloc_flex

Rosen Penev posted 1 patch 6 days, 14 hours ago
drivers/mmc/core/mmc_test.c | 28 ++++++++++------------------
1 file changed, 10 insertions(+), 18 deletions(-)
[PATCH] mmc: mmc_test: use kzalloc_flex
Posted by Rosen Penev 6 days, 14 hours ago
Simplifies allocations by using a flexible array member in these structs.

Add __counted_by to get extra runtime analysis.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/mmc/core/mmc_test.c | 28 ++++++++++------------------
 1 file changed, 10 insertions(+), 18 deletions(-)

diff --git a/drivers/mmc/core/mmc_test.c b/drivers/mmc/core/mmc_test.c
index 43fdb67d5407..f5c542855037 100644
--- a/drivers/mmc/core/mmc_test.c
+++ b/drivers/mmc/core/mmc_test.c
@@ -51,12 +51,12 @@ struct mmc_test_pages {
 
 /**
  * struct mmc_test_mem - allocated memory.
- * @arr: array of allocations
  * @cnt: number of allocations
+ * @arr: array of allocations
  */
 struct mmc_test_mem {
-	struct mmc_test_pages *arr;
 	unsigned int cnt;
+	struct mmc_test_pages arr[] __counted_by(cnt);
 };
 
 /**
@@ -135,21 +135,22 @@ struct mmc_test_dbgfs_file {
  * struct mmc_test_card - test information.
  * @card: card under test
  * @scratch: transfer buffer
- * @buffer: transfer buffer
  * @highmem: buffer for highmem tests
  * @area: information for performance tests
  * @gr: pointer to results of current testcase
+ * @buffer: transfer buffer
  */
 struct mmc_test_card {
 	struct mmc_card	*card;
 
 	u8		scratch[BUFFER_SIZE];
-	u8		*buffer;
 #ifdef CONFIG_HIGHMEM
 	struct page	*highmem;
 #endif
 	struct mmc_test_area		area;
 	struct mmc_test_general_result	*gr;
+
+	u8		buffer[];
 };
 
 enum mmc_test_prep_media {
@@ -315,7 +316,6 @@ static void mmc_test_free_mem(struct mmc_test_mem *mem)
 	while (mem->cnt--)
 		__free_pages(mem->arr[mem->cnt].page,
 			     mem->arr[mem->cnt].order);
-	kfree(mem->arr);
 	kfree(mem);
 }
 
@@ -348,14 +348,10 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
 	if (max_segs > max_page_cnt)
 		max_segs = max_page_cnt;
 
-	mem = kzalloc_obj(*mem);
+	mem = kzalloc_flex(*mem, arr, max_segs);
 	if (!mem)
 		return NULL;
 
-	mem->arr = kzalloc_objs(*mem->arr, max_segs);
-	if (!mem->arr)
-		goto out_free;
-
 	while (max_page_cnt) {
 		struct page *page;
 		unsigned int order;
@@ -3099,7 +3095,7 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
 	if (ret)
 		return ret;
 
-	test = kzalloc_obj(*test);
+	test = kzalloc_flex(*test, buffer, BUFFER_SIZE);
 	if (!test)
 		return -ENOMEM;
 
@@ -3111,7 +3107,6 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
 
 	test->card = card;
 
-	test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
 #ifdef CONFIG_HIGHMEM
 	test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER);
 	if (!test->highmem) {
@@ -3120,17 +3115,14 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
 	}
 #endif
 
-	if (test->buffer) {
-		mutex_lock(&mmc_test_lock);
-		mmc_test_run(test, testcase);
-		mutex_unlock(&mmc_test_lock);
-	}
+	mutex_lock(&mmc_test_lock);
+	mmc_test_run(test, testcase);
+	mutex_unlock(&mmc_test_lock);
 
 #ifdef CONFIG_HIGHMEM
 	__free_pages(test->highmem, BUFFER_ORDER);
 free_test_buffer:
 #endif
-	kfree(test->buffer);
 	kfree(test);
 
 	return count;
-- 
2.53.0
Re: [PATCH] mmc: mmc_test: use kzalloc_flex
Posted by Ulf Hansson 6 days, 7 hours ago
On Fri, 27 Mar 2026 at 03:59, Rosen Penev <rosenp@gmail.com> wrote:
>
> Simplifies allocations by using a flexible array member in these structs.
>
> Add __counted_by to get extra runtime analysis.
>
> Signed-off-by: Rosen Penev <rosenp@gmail.com>

Nice!

Applied for next, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/core/mmc_test.c | 28 ++++++++++------------------
>  1 file changed, 10 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc_test.c b/drivers/mmc/core/mmc_test.c
> index 43fdb67d5407..f5c542855037 100644
> --- a/drivers/mmc/core/mmc_test.c
> +++ b/drivers/mmc/core/mmc_test.c
> @@ -51,12 +51,12 @@ struct mmc_test_pages {
>
>  /**
>   * struct mmc_test_mem - allocated memory.
> - * @arr: array of allocations
>   * @cnt: number of allocations
> + * @arr: array of allocations
>   */
>  struct mmc_test_mem {
> -       struct mmc_test_pages *arr;
>         unsigned int cnt;
> +       struct mmc_test_pages arr[] __counted_by(cnt);
>  };
>
>  /**
> @@ -135,21 +135,22 @@ struct mmc_test_dbgfs_file {
>   * struct mmc_test_card - test information.
>   * @card: card under test
>   * @scratch: transfer buffer
> - * @buffer: transfer buffer
>   * @highmem: buffer for highmem tests
>   * @area: information for performance tests
>   * @gr: pointer to results of current testcase
> + * @buffer: transfer buffer
>   */
>  struct mmc_test_card {
>         struct mmc_card *card;
>
>         u8              scratch[BUFFER_SIZE];
> -       u8              *buffer;
>  #ifdef CONFIG_HIGHMEM
>         struct page     *highmem;
>  #endif
>         struct mmc_test_area            area;
>         struct mmc_test_general_result  *gr;
> +
> +       u8              buffer[];
>  };
>
>  enum mmc_test_prep_media {
> @@ -315,7 +316,6 @@ static void mmc_test_free_mem(struct mmc_test_mem *mem)
>         while (mem->cnt--)
>                 __free_pages(mem->arr[mem->cnt].page,
>                              mem->arr[mem->cnt].order);
> -       kfree(mem->arr);
>         kfree(mem);
>  }
>
> @@ -348,14 +348,10 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
>         if (max_segs > max_page_cnt)
>                 max_segs = max_page_cnt;
>
> -       mem = kzalloc_obj(*mem);
> +       mem = kzalloc_flex(*mem, arr, max_segs);
>         if (!mem)
>                 return NULL;
>
> -       mem->arr = kzalloc_objs(*mem->arr, max_segs);
> -       if (!mem->arr)
> -               goto out_free;
> -
>         while (max_page_cnt) {
>                 struct page *page;
>                 unsigned int order;
> @@ -3099,7 +3095,7 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
>         if (ret)
>                 return ret;
>
> -       test = kzalloc_obj(*test);
> +       test = kzalloc_flex(*test, buffer, BUFFER_SIZE);
>         if (!test)
>                 return -ENOMEM;
>
> @@ -3111,7 +3107,6 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
>
>         test->card = card;
>
> -       test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
>  #ifdef CONFIG_HIGHMEM
>         test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER);
>         if (!test->highmem) {
> @@ -3120,17 +3115,14 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
>         }
>  #endif
>
> -       if (test->buffer) {
> -               mutex_lock(&mmc_test_lock);
> -               mmc_test_run(test, testcase);
> -               mutex_unlock(&mmc_test_lock);
> -       }
> +       mutex_lock(&mmc_test_lock);
> +       mmc_test_run(test, testcase);
> +       mutex_unlock(&mmc_test_lock);
>
>  #ifdef CONFIG_HIGHMEM
>         __free_pages(test->highmem, BUFFER_ORDER);
>  free_test_buffer:
>  #endif
> -       kfree(test->buffer);
>         kfree(test);
>
>         return count;
> --
> 2.53.0
>