lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <3a1e75dd-6b39-4506-b4d7-806915d2a6fa@csgroup.eu>
Date: Fri, 26 Sep 2025 15:48:24 +0200
From: Christophe Leroy <christophe.leroy@...roup.eu>
To: pratyush.brahma@....qualcomm.com,
 Andrew Morton <akpm@...ux-foundation.org>, Mike Rapoport <rppt@...nel.org>
Cc: linux-mm@...ck.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 2/2] mm/numa_emulation: Move the size calculation in
 split_nodes_interleave() to a separate function



Le 26/09/2025 à 12:34, pratyush.brahma@....qualcomm.com a écrit :
> From: Pratyush Brahma <pratyush.brahma@....qualcomm.com>
> 
> The size calculation in split_nodes_interleave() has several nuances.
> Move it to a separate function to improve code modularity and
> simplify the readability of split_nodes_interleave().
> 
> Signed-off-by: Pratyush Brahma <pratyush.brahma@....qualcomm.com>
> ---
>   mm/numa_emulation.c | 44 +++++++++++++++++++++++++++++---------------
>   1 file changed, 29 insertions(+), 15 deletions(-)
> 
> diff --git a/mm/numa_emulation.c b/mm/numa_emulation.c
> index 2a335b3dd46a..882c349c2a0f 100644
> --- a/mm/numa_emulation.c
> +++ b/mm/numa_emulation.c
> @@ -76,6 +76,34 @@ static int __init emu_setup_memblk(struct numa_meminfo *ei,
>   	return 0;
>   }
>   
> +static void __init __calc_split_params(u64 addr, u64 max_addr,
> +		int nr_nodes, u64 *psize, int *pbig)
> +{
> +	u64 size, usable_size;
> +	int big;
> +
> +	/* total usable memory (skip holes) */
> +	usable_size  = max_addr - addr - mem_hole_size(addr, max_addr);
> +
> +	/*
> +	 * Calculate target node size.  x86_32 freaks on __udivdi3() so do
> +	 * the division in ulong number of pages and convert back.
> +	 */
> +	size = PFN_PHYS((unsigned long)(usable_size >> PAGE_SHIFT) / nr_nodes);
> +
> +	/*
> +	 * Calculate the number of big nodes that can be allocated as a result
> +	 * of consolidating the remainder.
> +	 */
> +	big = ((size & (FAKE_NODE_MIN_SIZE - 1UL)) * nr_nodes) / FAKE_NODE_MIN_SIZE;
> +
> +	/* Align the base size down to the minimum granularity */
> +	size = ALIGN_DOWN(size, FAKE_NODE_MIN_SIZE);
> +
> +	*psize = size;
> +	*pbig  = big;

Having to return simple type values through pointers is usually the 
start of proplems.Whenever possible you shouldn't returning simple types 
via pointers.

Your function is void, it could return size instead.

And big seems independant, could be returned by another function.

> +}
> +
>   /*
>    * Sets up nr_nodes fake nodes interleaved over physical nodes ranging from addr
>    * to max_addr.
> @@ -100,21 +128,7 @@ static int __init split_nodes_interleave(struct numa_meminfo *ei,
>   		nr_nodes = MAX_NUMNODES;
>   	}
>   
> -	/*
> -	 * Calculate target node size.  x86_32 freaks on __udivdi3() so do
> -	 * the division in ulong number of pages and convert back.
> -	 */
> -	size = max_addr - addr - mem_hole_size(addr, max_addr);
> -	size = PFN_PHYS((unsigned long)(size >> PAGE_SHIFT) / nr_nodes);
> -
> -	/*
> -	 * Calculate the number of big nodes that can be allocated as a result
> -	 * of consolidating the remainder.
> -	 */
> -	big = ((size & (FAKE_NODE_MIN_SIZE - 1UL)) * nr_nodes) /
> -		FAKE_NODE_MIN_SIZE;
> -
> -	size = ALIGN_DOWN(size, FAKE_NODE_MIN_SIZE);
> +	__calc_split_params(addr, max_addr, nr_nodes, &size, &big);
>   	if (!size) {
>   		pr_err("Not enough memory for each node.  "
>   			"NUMA emulation disabled.\n");
> 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ