From patchwork Fri Feb 2 11:31:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Muhammad Usama Anjum X-Patchwork-Id: 13542777 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C76E8C4828E for ; Fri, 2 Feb 2024 11:31:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B18206B009B; Fri, 2 Feb 2024 06:31:53 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A7E706B009C; Fri, 2 Feb 2024 06:31:53 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8CED46B009D; Fri, 2 Feb 2024 06:31:53 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 739636B009B for ; Fri, 2 Feb 2024 06:31:53 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 147CD80EE7 for ; Fri, 2 Feb 2024 11:31:53 +0000 (UTC) X-FDA: 81746649306.03.F68028B Received: from madrid.collaboradmins.com (madrid.collaboradmins.com [46.235.227.194]) by imf16.hostedemail.com (Postfix) with ESMTP id 565E5180007 for ; Fri, 2 Feb 2024 11:31:51 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=collabora.com header.s=mail header.b=WEAjLbWa; dmarc=pass (policy=quarantine) header.from=collabora.com; spf=pass (imf16.hostedemail.com: domain of usama.anjum@collabora.com designates 46.235.227.194 as permitted sender) smtp.mailfrom=usama.anjum@collabora.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1706873511; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=JqsXsqCJsYmUXKuLrKWWOhAOIXpLGdY9KIga4HqM8Ug=; b=U++TNurZZnQ02imLBN9BTQVyWOzqD87K8yyqwwHvE1r8WPJytGuKOZepPvzqz9tI3ZoXUo RsWLN9/F5oYQMrxwv4xy7+h7LIuhIDeBxyHn+hS48cehjpJ6/lEaWTnlgjUscyiW3ySAB5 wz1OAIYB0o1DhWBHz2E9BCIQcK2b/ko= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=collabora.com header.s=mail header.b=WEAjLbWa; dmarc=pass (policy=quarantine) header.from=collabora.com; spf=pass (imf16.hostedemail.com: domain of usama.anjum@collabora.com designates 46.235.227.194 as permitted sender) smtp.mailfrom=usama.anjum@collabora.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1706873511; a=rsa-sha256; cv=none; b=lv4G7zDkXD8dVP95oUzdsVrkQlIfIGJy0n9GjmCL3CRBUik5FEZvPAX6gAkk716WoFxPQe 3URGDk4YECH6UqA0cZhHvvmscCSGUuxAczx0Eb7WGoUNVOm9MsQ3knNYGhm/Bh0Nmju/Cj ja0AlHd7V8sQh2dIt/5k1uL48QXr3YI= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1706873510; bh=phT1qh4JSwaGJfIJ4Mc7ECbFwdGcURcGclR3lGXRi70=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WEAjLbWayzjN6Pxwfewo5zbvo+TqxcG9RBVlIOFiIsocjc0v5NWc4vhbNRXRja6ju sOZ0vy51FvzZJV0SMW08/uheGsKGfdWfYexBzLXRRfD5y6f96TCc+Bzj86yaysA4Pn HyI3E+jVC7ra46aqIzIojEC29d+6BTOGX1FV0S4A46ImS+N7sIbHk5+kpwRdaHlpMz cO9OjnJhPWkLt6t8AITDwX+C6NR6T4b5Ncd0EfqisX48hc4Y+Md5Evvq0+EPf+mXhG pcG0mqkq9O1tKVEasvlyoiIsahSoDlWUU8OSiqQJ9PGJEmAjIoG65/NWIz1jHQnAAm AAvnrWIgqkGGw== Received: from localhost.localdomain (cola.collaboradmins.com [195.201.22.229]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: usama.anjum) by madrid.collaboradmins.com (Postfix) with ESMTPSA id 9B12B3782093; Fri, 2 Feb 2024 11:31:48 +0000 (UTC) From: Muhammad Usama Anjum To: Andrew Morton , Shuah Khan Cc: Muhammad Usama Anjum , kernel@collabora.com, linux-mm@kvack.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 10/12] selftests/mm: thuge-gen: conform to TAP format output Date: Fri, 2 Feb 2024 16:31:17 +0500 Message-ID: <20240202113119.2047740-11-usama.anjum@collabora.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240202113119.2047740-1-usama.anjum@collabora.com> References: <20240202113119.2047740-1-usama.anjum@collabora.com> MIME-Version: 1.0 X-Rspam-User: X-Stat-Signature: hxhfkbijaumukm93w45w7nexuqt17w55 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 565E5180007 X-HE-Tag: 1706873511-926156 X-HE-Meta: U2FsdGVkX18sfDJ2an//SL/4I5CSK4Lqc7HEiYDSqkeJMZU5/Ioe+QaIHe1oMjNK5Ro4FXRdMtJxSA+jT9ySI4o16f+xeZh2eW1vWfEcdTqcTDDPMB/WGgS8a0yZVWh8KHGAH3mr6l1+4okZuRvT7arDnsHIo9+RT2zafRQjPTDa2utcRROhhMbNDwruVBXlWfc23doHiS160inCWLB3jguO56YNtz8QUK+Lu+fgaBTpiQoPQgJVnnUHZGXUnap6womoO9e7EWYdflQ05EMfQ8YbT3hpYmswvHb/iuNlghsJEryx5oU7StsPaBoStmlATxC1apl+OEvntASFScVU3w1n44gATaBOS84253k7JBNP4ZHKnlTrE1WkUACNpJRmcs+KnlQEzL8GPdY+mjZIqURLLc6zrA51Dzxfw/FAjQ39w1cibulylQKmKoHxb8aZyQ2Ox8YArQLFO4zN2JNzNIQNxWFHfUrlgiOw1qTk1cI3RdMtoSEM9l/rRuSKLDbWEwujpQSNSZH//sEzLPKbCGAt6Jgh88rSr95l7JrXuim5EPWS8BewUbjGTBUINnFiNzMJakqhmpmCkkE4zVVCk3HasJsYmUIgDOWGhCnXOf+P+Z7W3oajlkhso+pnpxZJLQ8X6FLGzB22xyshwDX5XevZBB732SNQ7hjwRmUlKu3vuxdo2S80l64hvanCppSA7JX6XwFZsUcrPXZ51E9aAQSslV+WNHGKh9CU5f0BwaYtn6l7YYADQ3ziT1Cejnwri8OzPF1mAjeIOxG+yXL2GbVeuMAVYugbfKsTqX5n+OYuTI6fan6J/qD5Wcrb5uPRJ3j1kEkZzuoz0Hf0ciHb74Mw138dFgI3zjbKXcH9RVN8Y4PhK7h96UoT0wK+rEbUF2rNvzcpjQC9zdk3A1OlbnVfHP+ioOUrMfs1631/MMeD0elJE1EUISvazuCw0nDYAPwUuIGaiXI22W8QJZQ sxwrpVi1 ozRSOKwQiP5BE3reYar2dTyLtXKnHUfyOUxPn+aTn5Mufg5LkD3hB76Le/2O7mWnkUT+2TxxB8jdYL0WXK9d5lY444zy+gamvM6RsntEjUOGTKKb3tht1af5gx/KTwXYtNSPjJ20xRpp5M/NH2kSNtOB14HJiebz9yFbaaGhCGaaFDQNQjFPSS/yFXgmKKZqR4Bb9s9Hdd36Pss9qqDeMYDN7mlv2RWj3ayT3Psgmp1yFCEsmzQQ7DV09Ww== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Conform the layout, informational and status messages to TAP. No functional change is intended other than the layout of output messages. Also remove un-needed logging which isn't enabled. Skip a hugepage size if it has less free pages to avoid unnecessary failures. For examples, some systems may not have 1GB hugepage free. So skip 1GB for testing in this test instead of failing the entire test. Signed-off-by: Muhammad Usama Anjum --- tools/testing/selftests/mm/thuge-gen.c | 147 +++++++++++++------------ 1 file changed, 75 insertions(+), 72 deletions(-) diff --git a/tools/testing/selftests/mm/thuge-gen.c b/tools/testing/selftests/mm/thuge-gen.c index 622987f12c89a..ea7fd8fe28763 100644 --- a/tools/testing/selftests/mm/thuge-gen.c +++ b/tools/testing/selftests/mm/thuge-gen.c @@ -4,7 +4,7 @@ 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. + 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. @@ -26,8 +26,7 @@ #include #include #include "vm_util.h" - -#define err(x) perror(x), exit(1) +#include "../kselftest.h" #define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) #define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT) @@ -44,11 +43,8 @@ #define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT) #define NUM_PAGESIZES 5 - #define NUM_PAGES 4 -#define Dprintf(fmt...) // printf(fmt) - unsigned long page_sizes[NUM_PAGESIZES]; int num_page_sizes; @@ -60,28 +56,15 @@ int ilog2(unsigned long v) return l; } -void find_pagesizes(void) -{ - glob_t g; - int i; - glob("/sys/kernel/mm/hugepages/hugepages-*kB", 0, NULL, &g); - assert(g.gl_pathc <= NUM_PAGESIZES); - for (i = 0; i < g.gl_pathc; i++) { - sscanf(g.gl_pathv[i], "/sys/kernel/mm/hugepages/hugepages-%lukB", - &page_sizes[i]); - page_sizes[i] <<= 10; - printf("Found %luMB\n", page_sizes[i] >> 20); - } - num_page_sizes = g.gl_pathc; - globfree(&g); -} - void show(unsigned long ps) { char buf[100]; + if (ps == getpagesize()) return; - printf("%luMB: ", ps >> 20); + + ksft_print_msg("%luMB: ", ps >> 20); + fflush(stdout); snprintf(buf, sizeof buf, "cat /sys/kernel/mm/hugepages/hugepages-%lukB/free_hugepages", @@ -105,7 +88,7 @@ unsigned long read_sysfs(int warn, char *fmt, ...) f = fopen(buf, "r"); if (!f) { if (warn) - printf("missing %s\n", buf); + ksft_print_msg("missing %s\n", buf); return 0; } if (getline(&line, &linelen, f) > 0) { @@ -119,123 +102,143 @@ unsigned long read_sysfs(int warn, char *fmt, ...) unsigned long read_free(unsigned long ps) { return read_sysfs(ps != getpagesize(), - "/sys/kernel/mm/hugepages/hugepages-%lukB/free_hugepages", - ps >> 10); + "/sys/kernel/mm/hugepages/hugepages-%lukB/free_hugepages", + ps >> 10); } void test_mmap(unsigned long size, unsigned flags) { char *map; unsigned long before, after; - int err; before = read_free(size); map = mmap(NULL, size*NUM_PAGES, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB|flags, -1, 0); + if (map == MAP_FAILED) + ksft_exit_fail_msg("mmap: %s\n", strerror(errno)); - if (map == (char *)-1) err("mmap"); memset(map, 0xff, size*NUM_PAGES); after = read_free(size); - Dprintf("before %lu after %lu diff %ld size %lu\n", - before, after, before - after, size); - assert(size == getpagesize() || (before - after) == NUM_PAGES); + show(size); - err = munmap(map, size * NUM_PAGES); - assert(!err); + ksft_test_result(size == getpagesize() || (before - after) == NUM_PAGES, + "%s mmap\n", __func__); + + if (munmap(map, size * NUM_PAGES)) + ksft_exit_fail_msg("%s: unmap %s\n", __func__, strerror(errno)); } void test_shmget(unsigned long size, unsigned flags) { int id; unsigned long before, after; - int err; + struct shm_info i; + char *map; before = read_free(size); id = shmget(IPC_PRIVATE, size * NUM_PAGES, IPC_CREAT|0600|flags); - if (id < 0) err("shmget"); - - struct shm_info i; - if (shmctl(id, SHM_INFO, (void *)&i) < 0) err("shmctl"); - Dprintf("alloc %lu res %lu\n", i.shm_tot, i.shm_rss); + if (id < 0) { + if (errno == EPERM) { + ksft_test_result_skip("shmget requires root privileges: %s\n", + strerror(errno)); + return; + } + ksft_exit_fail_msg("shmget: %s\n", strerror(errno)); + } + if (shmctl(id, SHM_INFO, (void *)&i) < 0) + ksft_exit_fail_msg("shmctl: %s\n", strerror(errno)); - Dprintf("id %d\n", id); - char *map = shmat(id, NULL, 0600); - if (map == (char*)-1) err("shmat"); + map = shmat(id, NULL, 0600); + if (map == MAP_FAILED) + ksft_exit_fail_msg("shmat: %s\n", strerror(errno)); shmctl(id, IPC_RMID, NULL); memset(map, 0xff, size*NUM_PAGES); after = read_free(size); - Dprintf("before %lu after %lu diff %ld size %lu\n", - before, after, before - after, size); - assert(size == getpagesize() || (before - after) == NUM_PAGES); show(size); - err = shmdt(map); - assert(!err); + ksft_test_result(size == getpagesize() || (before - after) == NUM_PAGES, + "%s: mmap\n", __func__); + if (shmdt(map)) + ksft_exit_fail_msg("%s: shmdt: %s\n", __func__, strerror(errno)); } -void sanity_checks(void) +void find_pagesizes(void) { - int i; unsigned long largest = getpagesize(); + int i; + glob_t g; - for (i = 0; i < num_page_sizes; i++) { - if (page_sizes[i] > largest) + glob("/sys/kernel/mm/hugepages/hugepages-*kB", 0, NULL, &g); + assert(g.gl_pathc <= NUM_PAGESIZES); + for (i = 0; (i < g.gl_pathc) && (num_page_sizes < NUM_PAGESIZES); i++) { + sscanf(g.gl_pathv[i], "/sys/kernel/mm/hugepages/hugepages-%lukB", + &page_sizes[num_page_sizes]); + page_sizes[num_page_sizes] <<= 10; + ksft_print_msg("Found %luMB\n", page_sizes[i] >> 20); + + if (page_sizes[num_page_sizes] > largest) largest = page_sizes[i]; - if (read_free(page_sizes[i]) < NUM_PAGES) { - printf("Not enough huge pages for page size %lu MB, need %u\n", - page_sizes[i] >> 20, - NUM_PAGES); - exit(0); - } + 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); - if (read_sysfs(0, "/proc/sys/kernel/shmmax") < NUM_PAGES * largest) { - printf("Please do echo %lu > /proc/sys/kernel/shmmax", largest * NUM_PAGES); - exit(0); - } + if (read_sysfs(0, "/proc/sys/kernel/shmmax") < NUM_PAGES * largest) + ksft_exit_fail_msg("Please do echo %lu > /proc/sys/kernel/shmmax", + largest * NUM_PAGES); #if defined(__x86_64__) if (largest != 1U<<30) { - printf("No GB pages available on x86-64\n" - "Please boot with hugepagesz=1G hugepages=%d\n", NUM_PAGES); - exit(0); + 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) { - int i; unsigned default_hps = default_huge_page_size(); + int i; + + ksft_print_header(); find_pagesizes(); - sanity_checks(); + if (!num_page_sizes) + ksft_finished(); + + ksft_set_plan(2 * num_page_sizes + 3); for (i = 0; i < num_page_sizes; i++) { unsigned long ps = page_sizes[i]; int arg = ilog2(ps) << MAP_HUGE_SHIFT; - printf("Testing %luMB mmap with shift %x\n", ps >> 20, arg); + + ksft_print_msg("Testing %luMB mmap with shift %x\n", ps >> 20, arg); test_mmap(ps, MAP_HUGETLB | arg); } - printf("Testing default huge mmap\n"); + + ksft_print_msg("Testing default huge mmap\n"); test_mmap(default_hps, MAP_HUGETLB); - puts("Testing non-huge shmget"); + ksft_print_msg("Testing non-huge shmget\n"); test_shmget(getpagesize(), 0); for (i = 0; i < num_page_sizes; i++) { unsigned long ps = page_sizes[i]; int arg = ilog2(ps) << SHM_HUGE_SHIFT; - printf("Testing %luMB shmget with shift %x\n", ps >> 20, arg); + ksft_print_msg("Testing %luMB shmget with shift %x\n", ps >> 20, arg); test_shmget(ps, SHM_HUGETLB | arg); } - puts("default huge shmget"); + + ksft_print_msg("default huge shmget\n"); test_shmget(default_hps, SHM_HUGETLB); - return 0; + ksft_finished(); }