// SPDX-License-Identifier: GPL-2.0 /* Test selecting other page sizes for mmap/shmget.
Before running this huge pages for each huge page size must have been reserved. For large pages beyond MAX_PAGE_ORDER (like 1GB on x86) boot options must be used. 1GB wouldn't be tested if it isn't available. Also shmmax must be increased. And you need to run as root to work around some weird permissions in shm. And nothing using huge pages should run in parallel. When the program aborts you may need to clean up the shm segments with ipcrm -m by hand, like this sudo ipcs | awk '$1 == "0x00000000" {print $2}' | xargs -n1 sudo ipcrm -m
(warning this will remove all if someone else uses them) */
if (page_sizes[num_page_sizes] > largest)
largest = page_sizes[i];
if (read_free(page_sizes[num_page_sizes]) >= NUM_PAGES)
num_page_sizes++; else
ksft_print_msg("SKIP for size %lu MB as not enough huge pages, need %u\n",
page_sizes[num_page_sizes] >> 20, NUM_PAGES);
}
globfree(&g);
read_sysfs("/proc/sys/kernel/shmmax", &shmmax_val); if (shmmax_val < NUM_PAGES * largest)
ksft_exit_fail_msg("Please do echo %lu > /proc/sys/kernel/shmmax",
largest * NUM_PAGES);
#ifdefined(__x86_64__) if (largest != 1U<<30) {
ksft_exit_fail_msg("No GB pages available on x86-64\n" "Please boot with hugepagesz=1G hugepages=%d\n", NUM_PAGES);
} #endif
}
int main(void)
{ unsigned default_hps = default_huge_page_size(); int i;
ksft_print_header();
find_pagesizes();
if (!num_page_sizes)
ksft_finished();
ksft_set_plan(2 * num_page_sizes + 3);
for (i = 0; i < num_page_sizes; i++) { unsignedlong ps = page_sizes[i]; int arg = ilog2(ps) << MAP_HUGE_SHIFT;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.