mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
selftests/mm: hugetlb-soft-offline: add setup of HugeTLB pages
hugetlb-soft-offline test uses open coded access to /proc to determine availability of huge pages and fails if there are no enough free huget pages.. Replace open coded access to /proc with hugepage helpers and add setup of HugeTLB pages to the test and make sure that the original settings are restored on the test exit. Link: https://lore.kernel.org/20260511162840.375890-44-rppt@kernel.org Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Tested-by: Luiz Capitulino <luizcap@redhat.com> Tested-by: Sarthak Sharma <sarthak.sharma@arm.com> Cc: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Barry Song <baohua@kernel.org> Cc: David Hildenbrand <david@kernel.org> Cc: Dev Jain <dev.jain@arm.com> Cc: Donet Tom <donettom@linux.ibm.com> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Lance Yang <lance.yang@linux.dev> Cc: Leon Romanovsky <leon@kernel.org> Cc: Liam Howlett <liam@infradead.org> Cc: Li Wang <li.wang@linux.dev> Cc: Lorenzo Stoakes <ljs@kernel.org> Cc: Mark Brown <broonie@kernel.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Nico Pache <npache@redhat.com> Cc: Peter Xu <peterx@redhat.com> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
2d6d040ccf
commit
c764cfa251
|
|
@ -6,9 +6,7 @@
|
|||
* - if enable_soft_offline = 1, a hugepage should be dissolved and
|
||||
* nr_hugepages/free_hugepages should be reduced by 1.
|
||||
*
|
||||
* Before running, make sure more than 2 hugepages of default_hugepagesz
|
||||
* are allocated. For example, if /proc/meminfo/Hugepagesize is 2048kB:
|
||||
* echo 8 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
|
||||
* The test allocates 8 default hugepages
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
|
@ -25,6 +23,7 @@
|
|||
#include <sys/types.h>
|
||||
|
||||
#include "kselftest.h"
|
||||
#include "hugepage_settings.h"
|
||||
|
||||
#ifndef MADV_SOFT_OFFLINE
|
||||
#define MADV_SOFT_OFFLINE 101
|
||||
|
|
@ -100,32 +99,6 @@ static int set_enable_soft_offline(int value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int read_nr_hugepages(unsigned long hugepage_size,
|
||||
unsigned long *nr_hugepages)
|
||||
{
|
||||
char buffer[256] = {0};
|
||||
char cmd[256] = {0};
|
||||
|
||||
sprintf(cmd, "cat /sys/kernel/mm/hugepages/hugepages-%ldkB/nr_hugepages",
|
||||
hugepage_size);
|
||||
FILE *cmdfile = popen(cmd, "r");
|
||||
|
||||
if (cmdfile == NULL) {
|
||||
ksft_perror(EPREFIX "failed to popen nr_hugepages");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!fgets(buffer, sizeof(buffer), cmdfile)) {
|
||||
ksft_perror(EPREFIX "failed to read nr_hugepages");
|
||||
pclose(cmdfile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*nr_hugepages = atoll(buffer);
|
||||
pclose(cmdfile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int create_hugetlbfs_file(struct statfs *file_stat)
|
||||
{
|
||||
int fd;
|
||||
|
|
@ -177,20 +150,14 @@ static void test_soft_offline_common(int enable_soft_offline)
|
|||
ksft_exit_fail_msg("Failed to set enable_soft_offline\n");
|
||||
}
|
||||
|
||||
if (read_nr_hugepages(hugepagesize_kb, &nr_hugepages_before) != 0) {
|
||||
close(fd);
|
||||
ksft_exit_fail_msg("Failed to read nr_hugepages\n");
|
||||
}
|
||||
nr_hugepages_before = hugetlb_nr_default_pages();
|
||||
|
||||
ksft_print_msg("Before MADV_SOFT_OFFLINE nr_hugepages=%ld\n",
|
||||
nr_hugepages_before);
|
||||
|
||||
ret = do_soft_offline(fd, 2 * file_stat.f_bsize, expect_errno);
|
||||
|
||||
if (read_nr_hugepages(hugepagesize_kb, &nr_hugepages_after) != 0) {
|
||||
close(fd);
|
||||
ksft_exit_fail_msg("Failed to read nr_hugepages\n");
|
||||
}
|
||||
nr_hugepages_after = hugetlb_nr_default_pages();
|
||||
|
||||
ksft_print_msg("After MADV_SOFT_OFFLINE nr_hugepages=%ld\n",
|
||||
nr_hugepages_after);
|
||||
|
|
@ -219,6 +186,10 @@ static void test_soft_offline_common(int enable_soft_offline)
|
|||
int main(int argc, char **argv)
|
||||
{
|
||||
ksft_print_header();
|
||||
|
||||
if (!hugetlb_setup_default(8))
|
||||
ksft_exit_skip("not enough hugetlb pages\n");
|
||||
|
||||
ksft_set_plan(2);
|
||||
|
||||
test_soft_offline_common(1);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user