Re: [PATCH 2/2] lib/raid6: use kmalloc() in raid6_select_algo()

David Laight <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.kernel.mm,gmane.linux.raid
Message-ID <20260520140657.2b5b5f3b@pumpkin>
On Wed, 20 May 2026 11:17:52 +0300
"Mike Rapoport (Microsoft)" <[email protected]> wrote:

> raid6_select_algo() allocates an order 3 (8 pages) buffer that is used
> as a scratch area for selection of the best algorithm.

Should this code really be using a 4k buffer rather than a PAGE_SIZE one?

-- David

> 
> For such large allocations kmalloc() would fall back to alloc_pages() but
> still kmalloc() is a better API as it does not require unnecessary
> castings and may provide more debugging possibilities.
> 
> Replace __get_free_pages() call with kmalloc().
> 
> Link: https://lore.kernel.org/all/[email protected]
> Signed-off-by: Mike Rapoport (Microsoft) <[email protected]>
> ---
>  lib/raid6/algos.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/raid6/algos.c b/lib/raid6/algos.c
> index 799e0e5eac26..89e627c62e30 100644
> --- a/lib/raid6/algos.c
> +++ b/lib/raid6/algos.c
> @@ -12,6 +12,7 @@
>   */
>  
>  #include <linux/raid/pq.h>
> +#include <linux/slab.h>
>  #ifndef __KERNEL__
>  #include <sys/mman.h>
>  #include <stdio.h>
> @@ -129,7 +130,6 @@ const struct raid6_recov_calls *const raid6_recov_algos[] = {
>  #endif
>  
>  #define RAID6_TEST_DISKS	8
> -#define RAID6_TEST_DISKS_ORDER	3
>  
>  static inline const struct raid6_recov_calls *raid6_choose_recov(void)
>  {
> @@ -250,7 +250,7 @@ int __init raid6_select_algo(void)
>  	int i, cycle;
>  
>  	/* prepare the buffer and fill it circularly with gfmul table */
> -	disk_ptr = (char *)__get_free_pages(GFP_KERNEL, RAID6_TEST_DISKS_ORDER);
> +	disk_ptr = kmalloc(PAGE_SIZE * RAID6_TEST_DISKS, GFP_KERNEL);
>  	if (!disk_ptr) {
>  		pr_err("raid6: Yikes!  No memory available.\n");
>  		return -ENOMEM;
> @@ -275,7 +275,7 @@ int __init raid6_select_algo(void)
>  	/* select raid recover functions */
>  	rec_best = raid6_choose_recov();
>  
> -	free_pages((unsigned long)disk_ptr, RAID6_TEST_DISKS_ORDER);
> +	kfree(disk_ptr);
>  
>  	return gen_best && rec_best ? 0 : -EINVAL;
>  }
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.