Hi Mike!
On 4/29/26 2:12 AM, Mike Rapoport wrote:
> From: "Mike Rapoport (Microsoft)" <[email protected]>
>
> hugetlb-shm test fails if there are no free huge pages prepared by a
> wrapper script and shm liimts in proc are too low.
>
> Add setup of HugeTLB pages and shm limits to the test and make sure that
> the original settings are restored on the test exit.
>
> Signed-off-by: Mike Rapoport (Microsoft) <[email protected]>
> ---
> tools/testing/selftests/mm/hugetlb-shm.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/tools/testing/selftests/mm/hugetlb-shm.c
> b/tools/testing/selftests/mm/hugetlb-shm.c
> index 0f70b1a50b6b..7b5a5cefe458 100644
> --- a/tools/testing/selftests/mm/hugetlb-shm.c
> +++ b/tools/testing/selftests/mm/hugetlb-shm.c
> @@ -29,9 +29,24 @@
> #include <sys/mman.h>
>
> #include "vm_util.h"
> +#include "hugepage_settings.h"
>
> #define LENGTH (256UL*1024*1024)
>
> +static void prepare(void)
> +{
> + unsigned long length, hugepage_size, nr;
> +
> + hugepage_size = default_huge_page_size();
> + length = (LENGTH + hugepage_size) & ~(hugepage_size - 1);
Same issue here as in hugetlb-mremap.c.
length = (LENGTH + hugepage_size) & ~(hugepage_size - 1)
will add an extra hugepage if LENGTH is already aligned. Should this be
(LENGTH + hugepage_size - 1) & ~(hugepage_size - 1) instead?
> + nr = length / hugepage_size;
> +
> + if (!hugetlb_setup_default(nr))
> + ksft_exit_skip("Not enough free huge pages\n");
> +
> + shm_limits_prepare(length);
> +}
> +
> int main(void)
> {
> int shmid;
> @@ -41,6 +56,8 @@ int main(void)
> ksft_print_header();
> ksft_set_plan(1);
>
> + prepare();
> +
> shmid = shmget(2, LENGTH, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
> if (shmid < 0)
> ksft_exit_fail_perror("shmget");
> @@ -78,3 +95,5 @@ int main(void)
> ksft_test_result_pass("hugepage using SysV shmget/shmat\n");
> ksft_finished();
> }
> +
> +SHM_LIMITS_RESTORE()