[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