From patchwork Tue Oct 1 07:58:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunsheng Lin X-Patchwork-Id: 13895543 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 1F00BE7716C for ; Thu, 5 Dec 2024 15:21:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9A34F6B0138; Thu, 5 Dec 2024 10:19:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 72B356B0104; Thu, 5 Dec 2024 10:19:12 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 932366B00C5; Thu, 5 Dec 2024 10:19:09 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 03872280036 for ; Tue, 1 Oct 2024 03:59:18 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id B38D0C0DEE for ; Tue, 1 Oct 2024 07:59:18 +0000 (UTC) X-FDA: 82624283196.26.09856F9 Received: from mail-pg1-f196.google.com (mail-pg1-f196.google.com [209.85.215.196]) by imf16.hostedemail.com (Postfix) with ESMTP id C67EB18000D for ; Tue, 1 Oct 2024 07:59:15 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=DwcmrNtJ; spf=pass (imf16.hostedemail.com: domain of yunshenglin0825@gmail.com designates 209.85.215.196 as permitted sender) smtp.mailfrom=yunshenglin0825@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1727769491; a=rsa-sha256; cv=none; b=3+va5fErAy7V82Jr3lMYlQdaLoxoS8w1iaGfUo6xld0YyzEykPB2jHfMeUV8MDAbjcGlE/ nNIxf0BRIB7xIQ6HApR7JOxb+EOC3HTT/yqTnqBczIgCgwVLmsuvF00WfWRVrM17L2aPHb IzSaPpfqUQx8AYcIM91h5YIMGMBbOZ4= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=DwcmrNtJ; spf=pass (imf16.hostedemail.com: domain of yunshenglin0825@gmail.com designates 209.85.215.196 as permitted sender) smtp.mailfrom=yunshenglin0825@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1727769491; 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=H586TTxS7HHj3h80507DWrTpplgeZKusQMfeMa39Y/Q=; b=cS7Ask45dC2/uNagPT13CYgJOsagdiWRvOsUjKTyY7reZoUJVuYilwvyOOPLiMM9tcvY5u XW/U34YKS7MFfxbt+pS3pjmTOJvnleHxu3di7yyvhA0JwOgZp9VRCz6Cbmjx/I/CxC6KR5 rFt/X7SyGGeSc6Ye6JINC9qqZYo4Jqo= Received: by mail-pg1-f196.google.com with SMTP id 41be03b00d2f7-7c3e1081804so2357515a12.3 for ; Tue, 01 Oct 2024 00:59:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727769554; x=1728374354; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=H586TTxS7HHj3h80507DWrTpplgeZKusQMfeMa39Y/Q=; b=DwcmrNtJzi71f0aD5ZBqjJRXxkrHw2bipGUZM6I/UR0ggGCyyzCsHPsFXIx82zZcsD 7mGt18ruO42NQ3lbqEMuL/S8Rjjdn18VKFV6KTJWd+ajUbWlr/FomJ/Hqg3nn0inP/oZ n7G+IqpNs3ypjAxrM+fZk2W4sp9ZEVqSjRjPq2nTfmo9e4r7zG/MPzz3JT7B4JKZQSHd y1N1JLSKWMve1fiMvNxQ9gr9FyTtxYwQqHu9hbzyU/7iNQSH2ayR8mLxc2WUNGRM9Lj9 K/o2uJ44FMFX4ybWOoxdXbR3Fz6RmsGpW0RHXkCAoYbgUnYR5WeLGrwtbgLec/lXZEbd hTtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727769554; x=1728374354; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=H586TTxS7HHj3h80507DWrTpplgeZKusQMfeMa39Y/Q=; b=Ttv4VxdBF4X2RbfmyMNBJea71q2fBRLMJWff1TmN7VYayjaD5LuhRJl6gJbxKpSYak eav9dSSA28zhgL+mx0mdVss7siGn2Ljr+EyfnhnB6QTldxmSnwJUa2w23rDAHmHzli1A 5wke+DHjIm5Cp4KiDKPfrytwLO4gNfih3UcBU7V06RBbKC3adz2EGY/ShTx6v/+uTBvx QaOpLBgkS5F7zSC7wnTQb1/c78y1+bQr7lWuA7zCRtkvN11ekeSDAcX7ZlRHwa3/rSgZ o3Lh/kXWu6y+rHeni9y3v7OuHaeMI3j8Va+7sIB4x6YaUYi9InQNg6A1aOFN3ZkCXCmg n1yg== X-Forwarded-Encrypted: i=1; AJvYcCX9psjUE/m4Vl7pTIzYk6pxF5s5x2Jul74z5lKo/zVUsdDN0PfCJOmMw83v/dn11wUNkIFDw6fG2A==@kvack.org X-Gm-Message-State: AOJu0YyUAygGSmqbR4JuoKUN5/tGUk8Ma5X51Ozpn0HOsMz7Z2ghg+xB 3vp8D8Mmio4QG+MgwCR2f870N5W9Lt6uM0KImb4wwJ+qacQpoukY X-Google-Smtp-Source: AGHT+IFUHxqszULLRLQpplxPUD5qSMOLhqfZNILyVQvIkZOeh87qa37mKjy54ctMsxpD3dVg4Eh9qQ== X-Received: by 2002:a05:6a21:3489:b0:1c6:fb2a:4696 with SMTP id adf61e73a8af0-1d4fa68768bmr23506067637.19.1727769554166; Tue, 01 Oct 2024 00:59:14 -0700 (PDT) Received: from yunshenglin-MS-7549.. ([2409:8a55:301b:e120:88bd:a0fb:c6d6:c4a2]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e06e16d6d2sm13168168a91.2.2024.10.01.00.59.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Oct 2024 00:59:13 -0700 (PDT) From: Yunsheng Lin X-Google-Original-From: Yunsheng Lin To: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Yunsheng Lin , Alexander Duyck , Alexander Duyck , Andrew Morton , Shuah Khan , linux-mm@kvack.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v19 01/14] mm: page_frag: add a test module for page_frag Date: Tue, 1 Oct 2024 15:58:44 +0800 Message-Id: <20241001075858.48936-2-linyunsheng@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241001075858.48936-1-linyunsheng@huawei.com> References: <20241001075858.48936-1-linyunsheng@huawei.com> MIME-Version: 1.0 X-Stat-Signature: pys73goy9xhpbwequo7taragryu7ru8e X-Rspamd-Queue-Id: C67EB18000D X-Rspam-User: X-Rspamd-Server: rspam10 X-HE-Tag: 1727769555-259300 X-HE-Meta: U2FsdGVkX1/l7rSXBpyBVPlgl8iwDZjz2c7jH+WI5ad7apN97pRC4T0Ji6x9cHOENrClwetza50Uog0mQ9e6urJ81wnqoVrF4GI++FsJ3oO679+8FQz9276lhAneWJf40Uxiu0Gv0d+iCTlf66iyTZh15QLQXlolfYi4pwlsFaVNhrrRR/F4wPdoISad2BTEfeRA+BSK/uMPXlOXdLv8IdcTZBGjX/a5rjcUzb+tMsH7NxGM/334U4UQNp9o1umTenlgIsCplADxM1liR4qAXzUTrXOl3OI8j15NhOuP7D63f3FA1UnUIRNBPQe2CE7xsvu8ct9TtokC5LHBNn9tex0ryu7ACAa/PThig47XnzlDzsRTfDePjrykYOdJKAmIXju2TSJw3H1f9IWyVgdgUNZe4d+UmPu2L9CQih/Y7R9Bw/5WGmHiGL3wzzS5s8gQpdRz+jRwLpRDtfEAkStMFsmpLa9qQQc2FuGd4lasa2k3iiALJsuesjcwZ39+6YLNV7qOqZLVHcy8+R/B/rGa7zOBwlxWndMzaq3aFKjUDHJJa2CWXLtvKxoZ18pEIBDl15PZvKFopm+1bY6x2NJPoLnmnbZWNG06HNc/+iukmyRmluiT0pDmAAmq3kT5ZCz1MpqZjnOz2PZ86NVOJq+2Om5Xmh1nYCfSoJm3b3UefucFfy6+QrGW7sRPj6+BrwHE6uusNLoxO2N9RnSPQtD+RlS1IrlU6HeRCbA6N8/swv9AXxpl6z+a55RiQ5VCE3ZS4ngLX4pd2HWFR1lDoyGIV6EGJ/kkdfooMt6PbPZ+XsPa3U++loyvYP3aFJ/IE33m5xWppsW4TlW+lTKd8Y6vyqEelKo9DVYoAOWECWMOdz8IZ9zcV6UNWMYUL+hyU3LpDbiQsMaux5fEtKZeLe/Rta7wvl2aDNsRGrqpkVJl/ScCc83sfiD1SkORBdWTd+qlCiH1qQrwpkNQ7vVCpvZ eOuwDDUt I4dRKT7MlRpxFSN0qjoPwJ6TYBMQ9aH3VgRTtg+xDE7BoHxKRWwFB7/Tg3EIU/hvRLQC0IA3XvIwBY/S0754QizJCgXt2PmXU7o7B4z7BbDbUsdWccPe7ivx3CrtajMqAbbQ1NETUTHgvluiW4Kk/CXihALmIf4Wc6qPn9I4u+pZ2fc+EY3/KH3p1us9/IGKEVmfzF0A3yHdIgu5aIE5mc7EF9/JtDqwbsPjmXcAe8oLj4hjrbvNT+KRzZwzbjAugF/ye5sKcugMf0uAr07AeBYirEft0LRtyewHyXGDfXkxhXJUfICF5wxKFenmWJC0ny0Drto/4sXaGbDimaLK0XRQCf9bSiPtL4CJMeJHu8iutjwbHdHkP2kIRhsOB7VqP2u7jge5CyybO6R1LZRj5HidREC5f3h68Mql1avpZCzu0mNtayRzIWE4V9O4Kn5DlbNpCC5+8iGGLd/ov2MQK/4Hi0b69ioemicvM/pu3dkHpKkSsvlgrhqZGrb7/CnqyqdWPhV/UbakFfEpWLmf5K0dsBXPgeSM4lVFL6Np7npyRsuz9nduVaOG5Qui3nFJ9uVH7e6jsgGNhvGqNPuGhRL8U7e8GyG1Ddv2glbi4hXwXle4IilaQnnjLaPjjUuFAJn5k 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: The testing is done by ensuring that the fragment allocated from a frag_frag_cache instance is pushed into a ptr_ring instance in a kthread binded to a specified cpu, and a kthread binded to a specified cpu will pop the fragment from the ptr_ring and free the fragment. CC: Alexander Duyck Signed-off-by: Yunsheng Lin Reviewed-by: Alexander Duyck --- tools/testing/selftests/mm/Makefile | 3 + tools/testing/selftests/mm/page_frag/Makefile | 18 ++ .../selftests/mm/page_frag/page_frag_test.c | 173 ++++++++++++++++++ tools/testing/selftests/mm/run_vmtests.sh | 8 + tools/testing/selftests/mm/test_page_frag.sh | 171 +++++++++++++++++ 5 files changed, 373 insertions(+) create mode 100644 tools/testing/selftests/mm/page_frag/Makefile create mode 100644 tools/testing/selftests/mm/page_frag/page_frag_test.c create mode 100755 tools/testing/selftests/mm/test_page_frag.sh diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile index 02e1204971b0..acec529baaca 100644 --- a/tools/testing/selftests/mm/Makefile +++ b/tools/testing/selftests/mm/Makefile @@ -36,6 +36,8 @@ MAKEFLAGS += --no-builtin-rules CFLAGS = -Wall -I $(top_srcdir) $(EXTRA_CFLAGS) $(KHDR_INCLUDES) $(TOOLS_INCLUDES) LDLIBS = -lrt -lpthread -lm +TEST_GEN_MODS_DIR := page_frag + TEST_GEN_FILES = cow TEST_GEN_FILES += compaction_test TEST_GEN_FILES += gup_longterm @@ -126,6 +128,7 @@ TEST_FILES += test_hmm.sh TEST_FILES += va_high_addr_switch.sh TEST_FILES += charge_reserved_hugetlb.sh TEST_FILES += hugetlb_reparenting_test.sh +TEST_FILES += test_page_frag.sh # required by charge_reserved_hugetlb.sh TEST_FILES += write_hugetlb_memory.sh diff --git a/tools/testing/selftests/mm/page_frag/Makefile b/tools/testing/selftests/mm/page_frag/Makefile new file mode 100644 index 000000000000..58dda74d50a3 --- /dev/null +++ b/tools/testing/selftests/mm/page_frag/Makefile @@ -0,0 +1,18 @@ +PAGE_FRAG_TEST_DIR := $(realpath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) +KDIR ?= $(abspath $(PAGE_FRAG_TEST_DIR)/../../../../..) + +ifeq ($(V),1) +Q = +else +Q = @ +endif + +MODULES = page_frag_test.ko + +obj-m += page_frag_test.o + +all: + +$(Q)make -C $(KDIR) M=$(PAGE_FRAG_TEST_DIR) modules + +clean: + +$(Q)make -C $(KDIR) M=$(PAGE_FRAG_TEST_DIR) clean diff --git a/tools/testing/selftests/mm/page_frag/page_frag_test.c b/tools/testing/selftests/mm/page_frag/page_frag_test.c new file mode 100644 index 000000000000..eeb2b6bc681a --- /dev/null +++ b/tools/testing/selftests/mm/page_frag/page_frag_test.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Test module for page_frag cache + * + * Copyright (C) 2024 Yunsheng Lin + */ + +#include +#include +#include +#include +#include +#include + +static struct ptr_ring ptr_ring; +static int nr_objs = 512; +static atomic_t nthreads; +static struct completion wait; +static struct page_frag_cache test_nc; +static int test_popped; +static int test_pushed; + +static int nr_test = 2000000; +module_param(nr_test, int, 0); +MODULE_PARM_DESC(nr_test, "number of iterations to test"); + +static bool test_align; +module_param(test_align, bool, 0); +MODULE_PARM_DESC(test_align, "use align API for testing"); + +static int test_alloc_len = 2048; +module_param(test_alloc_len, int, 0); +MODULE_PARM_DESC(test_alloc_len, "alloc len for testing"); + +static int test_push_cpu; +module_param(test_push_cpu, int, 0); +MODULE_PARM_DESC(test_push_cpu, "test cpu for pushing fragment"); + +static int test_pop_cpu; +module_param(test_pop_cpu, int, 0); +MODULE_PARM_DESC(test_pop_cpu, "test cpu for popping fragment"); + +static int page_frag_pop_thread(void *arg) +{ + struct ptr_ring *ring = arg; + + pr_info("page_frag pop test thread begins on cpu %d\n", + smp_processor_id()); + + while (test_popped < nr_test) { + void *obj = __ptr_ring_consume(ring); + + if (obj) { + test_popped++; + page_frag_free(obj); + } else { + cond_resched(); + } + } + + if (atomic_dec_and_test(&nthreads)) + complete(&wait); + + pr_info("page_frag pop test thread exits on cpu %d\n", + smp_processor_id()); + + return 0; +} + +static int page_frag_push_thread(void *arg) +{ + struct ptr_ring *ring = arg; + + pr_info("page_frag push test thread begins on cpu %d\n", + smp_processor_id()); + + while (test_pushed < nr_test) { + void *va; + int ret; + + if (test_align) { + va = page_frag_alloc_align(&test_nc, test_alloc_len, + GFP_KERNEL, SMP_CACHE_BYTES); + + WARN_ONCE((unsigned long)va & (SMP_CACHE_BYTES - 1), + "unaligned va returned\n"); + } else { + va = page_frag_alloc(&test_nc, test_alloc_len, GFP_KERNEL); + } + + if (!va) + continue; + + ret = __ptr_ring_produce(ring, va); + if (ret) { + page_frag_free(va); + cond_resched(); + } else { + test_pushed++; + } + } + + pr_info("page_frag push test thread exits on cpu %d\n", + smp_processor_id()); + + if (atomic_dec_and_test(&nthreads)) + complete(&wait); + + return 0; +} + +static int __init page_frag_test_init(void) +{ + struct task_struct *tsk_push, *tsk_pop; + ktime_t start; + u64 duration; + int ret; + + test_nc.va = NULL; + atomic_set(&nthreads, 2); + init_completion(&wait); + + if (test_alloc_len > PAGE_SIZE || test_alloc_len <= 0 || + !cpu_active(test_push_cpu) || !cpu_active(test_pop_cpu)) + return -EINVAL; + + ret = ptr_ring_init(&ptr_ring, nr_objs, GFP_KERNEL); + if (ret) + return ret; + + tsk_push = kthread_create_on_cpu(page_frag_push_thread, &ptr_ring, + test_push_cpu, "page_frag_push"); + if (IS_ERR(tsk_push)) + return PTR_ERR(tsk_push); + + tsk_pop = kthread_create_on_cpu(page_frag_pop_thread, &ptr_ring, + test_pop_cpu, "page_frag_pop"); + if (IS_ERR(tsk_pop)) { + kthread_stop(tsk_push); + return PTR_ERR(tsk_pop); + } + + start = ktime_get(); + wake_up_process(tsk_push); + wake_up_process(tsk_pop); + + pr_info("waiting for test to complete\n"); + + while (!wait_for_completion_timeout(&wait, msecs_to_jiffies(10000))) + pr_info("page_frag_test progress: pushed = %d, popped = %d\n", + test_pushed, test_popped); + + duration = (u64)ktime_us_delta(ktime_get(), start); + pr_info("%d of iterations for %s testing took: %lluus\n", nr_test, + test_align ? "aligned" : "non-aligned", duration); + + ptr_ring_cleanup(&ptr_ring, NULL); + page_frag_cache_drain(&test_nc); + + return -EAGAIN; +} + +static void __exit page_frag_test_exit(void) +{ +} + +module_init(page_frag_test_init); +module_exit(page_frag_test_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Yunsheng Lin "); +MODULE_DESCRIPTION("Test module for page_frag"); diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh index c5797ad1d37b..2c5394584af4 100755 --- a/tools/testing/selftests/mm/run_vmtests.sh +++ b/tools/testing/selftests/mm/run_vmtests.sh @@ -75,6 +75,8 @@ separated by spaces: read-only VMAs - mdwe test prctl(PR_SET_MDWE, ...) +- page_frag + test handling of page fragment allocation and freeing example: ./run_vmtests.sh -t "hmm mmap ksm" EOF @@ -456,6 +458,12 @@ CATEGORY="mkdirty" run_test ./mkdirty CATEGORY="mdwe" run_test ./mdwe_test +CATEGORY="page_frag" run_test ./test_page_frag.sh smoke + +CATEGORY="page_frag" run_test ./test_page_frag.sh aligned + +CATEGORY="page_frag" run_test ./test_page_frag.sh nonaligned + echo "SUMMARY: PASS=${count_pass} SKIP=${count_skip} FAIL=${count_fail}" | tap_prefix echo "1..${count_total}" | tap_output diff --git a/tools/testing/selftests/mm/test_page_frag.sh b/tools/testing/selftests/mm/test_page_frag.sh new file mode 100755 index 000000000000..d750d910c899 --- /dev/null +++ b/tools/testing/selftests/mm/test_page_frag.sh @@ -0,0 +1,171 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) 2024 Yunsheng Lin +# Copyright (C) 2018 Uladzislau Rezki (Sony) +# +# This is a test script for the kernel test driver to test the +# correctness and performance of page_frag's implementation. +# Therefore it is just a kernel module loader. You can specify +# and pass different parameters in order to: +# a) analyse performance of page fragment allocations; +# b) stressing and stability check of page_frag subsystem. + +DRIVER="./page_frag/page_frag_test.ko" +CPU_LIST=$(grep -m 2 processor /proc/cpuinfo | cut -d ' ' -f 2) +TEST_CPU_0=$(echo $CPU_LIST | awk '{print $1}') + +if [ $(echo $CPU_LIST | wc -w) -gt 1 ]; then + TEST_CPU_1=$(echo $CPU_LIST | awk '{print $2}') + NR_TEST=100000000 +else + TEST_CPU_1=$TEST_CPU_0 + NR_TEST=1000000 +fi + +# 1 if fails +exitcode=1 + +# Kselftest framework requirement - SKIP code is 4. +ksft_skip=4 + +# +# Static templates for testing of page_frag APIs. +# Also it is possible to pass any supported parameters manually. +# +SMOKE_PARAM="test_push_cpu=$TEST_CPU_0 test_pop_cpu=$TEST_CPU_1" +NONALIGNED_PARAM="$SMOKE_PARAM test_alloc_len=75 nr_test=$NR_TEST" +ALIGNED_PARAM="$NONALIGNED_PARAM test_align=1" + +check_test_requirements() +{ + uid=$(id -u) + if [ $uid -ne 0 ]; then + echo "$0: Must be run as root" + exit $ksft_skip + fi + + if ! which insmod > /dev/null 2>&1; then + echo "$0: You need insmod installed" + exit $ksft_skip + fi + + if [ ! -f $DRIVER ]; then + echo "$0: You need to compile page_frag_test module" + exit $ksft_skip + fi +} + +run_nonaligned_check() +{ + echo "Run performance tests to evaluate how fast nonaligned alloc API is." + + insmod $DRIVER $NONALIGNED_PARAM > /dev/null 2>&1 + echo "Done." + echo "Check the kernel ring buffer to see the summary." +} + +run_aligned_check() +{ + echo "Run performance tests to evaluate how fast aligned alloc API is." + + insmod $DRIVER $ALIGNED_PARAM > /dev/null 2>&1 + echo "Done." + echo "Check the kernel ring buffer to see the summary." +} + +run_smoke_check() +{ + echo "Run smoke test." + + insmod $DRIVER $SMOKE_PARAM > /dev/null 2>&1 + echo "Done." + echo "Check the kernel ring buffer to see the summary." +} + +usage() +{ + echo -n "Usage: $0 [ aligned ] | [ nonaligned ] | | [ smoke ] | " + echo "manual parameters" + echo + echo "Valid tests and parameters:" + echo + modinfo $DRIVER + echo + echo "Example usage:" + echo + echo "# Shows help message" + echo "$0" + echo + echo "# Smoke testing" + echo "$0 smoke" + echo + echo "# Performance testing for nonaligned alloc API" + echo "$0 nonaligned" + echo + echo "# Performance testing for aligned alloc API" + echo "$0 aligned" + echo + exit 0 +} + +function validate_passed_args() +{ + VALID_ARGS=`modinfo $DRIVER | awk '/parm:/ {print $2}' | sed 's/:.*//'` + + # + # Something has been passed, check it. + # + for passed_arg in $@; do + key=${passed_arg//=*/} + valid=0 + + for valid_arg in $VALID_ARGS; do + if [[ $key = $valid_arg ]]; then + valid=1 + break + fi + done + + if [[ $valid -ne 1 ]]; then + echo "Error: key is not correct: ${key}" + exit $exitcode + fi + done +} + +function run_manual_check() +{ + # + # Validate passed parameters. If there is wrong one, + # the script exists and does not execute further. + # + validate_passed_args $@ + + echo "Run the test with following parameters: $@" + insmod $DRIVER $@ > /dev/null 2>&1 + echo "Done." + echo "Check the kernel ring buffer to see the summary." +} + +function run_test() +{ + if [ $# -eq 0 ]; then + usage + else + if [[ "$1" = "smoke" ]]; then + run_smoke_check + elif [[ "$1" = "nonaligned" ]]; then + run_nonaligned_check + elif [[ "$1" = "aligned" ]]; then + run_aligned_check + else + run_manual_check $@ + fi + fi +} + +check_test_requirements +run_test $@ + +exit 0