[LTP] [PATCH] hugemmap10: Account for memory policy in counter checks

Huaisheng Ye yehuaisheng@open-hieco.net
Thu Sep 17 10:40:18 CEST 2026



On 9/16/2026 16:48, Li Wang wrote:
> Hi Huaisheng,
>
> This patch make sense, minor comments inline below:
>
>>   .../kernel/mem/hugetlb/hugemmap/hugemmap10.c  | 73 ++++++++++++++++++-
>>   1 file changed, 72 insertions(+), 1 deletion(-)
>>
>> diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap10.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap10.c
>> index 5b5577a0e..6d1cd6241 100644
>> --- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap10.c
>> +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap10.c
>> @@ -13,6 +13,9 @@
>>    */
>>
>>   #define _GNU_SOURCE
>> +#include <errno.h>
>> +#include <linux/mempolicy.h>
>> +#include <stdlib.h>
>>   #include <unistd.h>
>>   #include <stdio.h>
>>   #include <sys/mount.h>
>> @@ -21,8 +24,10 @@
>>   #include <sys/types.h>
>>
>>   #include "hugetlb.h"
>> +#include "lapi/syscalls.h"
>>
>>   #define MNTPOINT "hugetlbfs/"
>> +#define ULONG_BITS (sizeof(unsigned long) * CHAR_BIT)
>>
>>   static long hpage_size;
>>   static int private_resv;
>> @@ -48,6 +53,63 @@ static void read_meminfo_huge(long *total, long *free, long *resv, long *surp)
>>   	*surp = SAFE_READ_MEMINFO(MEMINFO_HPAGE_SURP);
>>   }
>>
>> +static int node_isset(unsigned long node, const unsigned long *nodemask)
>> +{
>> +	return nodemask[node / ULONG_BITS] & (1UL << (node % ULONG_BITS));
>> +}
>> +
>> +static unsigned long read_allowed_free_hugepages(void)
>> +{
>> +	char path[PATH_MAX];
>> +	size_t mask_size = getpagesize();
>> +	unsigned long allowed_free = 0;
>> +	unsigned long maxnode = mask_size * CHAR_BIT;
>> +	unsigned long *policy_nodemask;
>> +	unsigned long *cpuset_nodemask;
>> +	unsigned long node, node_free;
>> +	int mode;
>> +
>> +	policy_nodemask = SAFE_CALLOC(1, mask_size);
>> +	cpuset_nodemask = SAFE_CALLOC(1, mask_size);
>> +
>> +	if (syscall(__NR_get_mempolicy, &mode, policy_nodemask,
>> +		    maxnode, NULL, 0)) {
>> +		if (errno == ENOSYS) {
>> +			allowed_free = prev_free;
>> +			goto out;
>> +		}
>> +		tst_brk(TBROK | TERRNO, "get_mempolicy() failed");
>> +	}
>> +
>> +	if (syscall(__NR_get_mempolicy, NULL, cpuset_nodemask,
>> +		    maxnode, NULL, MPOL_F_MEMS_ALLOWED))
>> +		tst_brk(TBROK | TERRNO,
>> +			"get_mempolicy(MPOL_F_MEMS_ALLOWED) failed");
>> +
>> +	mode &= ~MPOL_MODE_FLAGS;
>> +	for (node = 0; node < maxnode; node++) {
>> +		if (!node_isset(node, cpuset_nodemask))
>> +			continue;
>> +		if (mode == MPOL_BIND && !node_isset(node, policy_nodemask))
>> +			continue;
>> +
>> +		snprintf(path, sizeof(path),
>> +			 "/sys/devices/system/node/node%lu/hugepages/"
>> +			 "hugepages-%ldkB/free_hugepages",
>> +			 node, hpage_size / 1024);
>> +		if (access(path, R_OK))
>> +			continue;
>> +
>> +		SAFE_FILE_SCANF(path, "%lu", &node_free);
>> +		allowed_free += node_free;
>> +	}
>> +
>> +out:
>> +	free(policy_nodemask);
>> +	free(cpuset_nodemask);
>> +	return allowed_free;
>> +}
>> +
>>   static int kernel_has_private_reservations(void)
>>   {
>>   	int fd;
>> @@ -178,10 +240,14 @@ out:
>>
>>   static int map_(int s, int hpages, int flags, char *desc, int line)
>>   {
>> +	unsigned long allowed_free = 0;
>>   	long et, ef, er, es;
>> +	int creates_reservation = (flags & MAP_SHARED) || private_resv;
> Maybe we can move this definition into setup() and then replace all the
> reservation syntax globally.

Many thanks for comments.
Good suggestion, I will resend V2 later.



More information about the ltp mailing list