From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C273C4320A for ; Sun, 1 Aug 2021 15:44:03 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1DF0F610A8 for ; Sun, 1 Aug 2021 15:44:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 1DF0F610A8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id 260436B005D; Sun, 1 Aug 2021 11:44:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 20D138D0001; Sun, 1 Aug 2021 11:44:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0ADDC6B0070; Sun, 1 Aug 2021 11:44:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0048.hostedemail.com [216.40.44.48]) by kanga.kvack.org (Postfix) with ESMTP id E27316B005D for ; Sun, 1 Aug 2021 11:43:59 -0400 (EDT) Received: from smtpin09.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 8DC1C8249980 for ; Sun, 1 Aug 2021 15:43:59 +0000 (UTC) X-FDA: 78426932598.09.D0ABE96 Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) by imf18.hostedemail.com (Postfix) with ESMTP id 4D0934003056 for ; Sun, 1 Aug 2021 15:43:59 +0000 (UTC) Received: by mail-lj1-f171.google.com with SMTP id b21so20570298ljo.13 for ; Sun, 01 Aug 2021 08:43:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=YEjBF3EFihUm9hC1OBOnczDySCO1R9ENPttMMc1lNxs=; b=d/JciGk5DyQlK9x7u8W7Nnmqf1iHCu3fmhSnKn2EbmYiCzJ3T0c/snLSIjaPqvCkfd NXHKpRZHA7qSPEZfUT/eFfKMhDWEP+/9lhpIRecfS7mPO5Qm4KM8qDVnMRVMrUNBV6oA nluqUkJGRhK+7tV9a0jC8euWvj9bpiQk5Kq0zsoRBTyJ56R2xjJXzCsOSGwZIQ38oCZP E+7j92p1b6DXI9Z9PgBGsrZcgwDJPsWl+XCURS535utV/QtThMlG8nZw3mED3BtrTSaI g0itDQpu0IGBrwOMzTEjy80JjHhG2EWJsLCvZfxWFexhBrYyjTGxeEisjvyrVFqB4bb3 eKTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=YEjBF3EFihUm9hC1OBOnczDySCO1R9ENPttMMc1lNxs=; b=i+DfaV8k+m8E0yKV6u2J1x7jpJiuC0DqIqL2K/pz7yseSzMeDgJle1cI0O0eo3dZlL rnD84LOLy2TAXZ+7EOiw3bMiG7pI33OFRR22kDyRXbXEi0Yy6qMiVqr2s/7V8NPoTrRT xCqgAC/imarZgSQTqdGkvemxejQn7y/se3ZDRC4xd4p4ObLzsWLOINZiSi1w2GeCUF0V N8uR1Fj178MRVBCEECWtV7EvQ+NmVeZb31iKaeZb0zkeHaOcCICjvjg21/vCnMxEr/yu cxglurYU62SLQYq2jrxwDPj1/TSlhWpYBW/2LWcsEQzJlRv1biWVpZW0mpwV7yxO6Clo 3HTg== X-Gm-Message-State: AOAM530ZayQTDsZGZmzynvKMQf5RwXUsNcc5799VrV1eJLPyzsmMT2Wr n3koak+DklPRF/wwDyRhtrs= X-Google-Smtp-Source: ABdhPJzFc8TqZENCJ7iHVLn/n13u6Yi3JCp+TDaDFBzQ/pTUU0qJmGuNbRXx8tIJ8TrP7L3TNbr0/g== X-Received: by 2002:a2e:a591:: with SMTP id m17mr8581400ljp.237.1627832638076; Sun, 01 Aug 2021 08:43:58 -0700 (PDT) Received: from asus ([147.30.82.254]) by smtp.gmail.com with ESMTPSA id a10sm702601lfb.93.2021.08.01.08.43.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Aug 2021 08:43:57 -0700 (PDT) Date: Sun, 1 Aug 2021 21:43:54 +0600 From: Zhansaya Bagdauletkyzy To: akpm@linux-foundation.org, shuah@kernel.org Cc: linux-mm@kvack.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, tyhicks@linux.microsoft.com, pasha.tatashin@soleen.com Subject: [PATCH 2/2] selftests: vm: add COW time test for KSM pages Message-ID: <26a3cc3d02dc4fa65cc9b135be76e7d795c44877.1627828548.git.zhansayabagdaulet@gmail.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 4D0934003056 Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=gmail.com header.s=20161025 header.b="d/JciGk5"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf18.hostedemail.com: domain of zhansayabagdaulet@gmail.com designates 209.85.208.171 as permitted sender) smtp.mailfrom=zhansayabagdaulet@gmail.com X-Stat-Signature: cnfhtqofp6fg5o9ot6fw74437zayu1p7 X-HE-Tag: 1627832639-15936 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: Since merged pages are copied every time they need to be modified, the write access time is different between shared and non-shared pages. Add ksm_cow_time() function which evaluates latency of these COW breaks. First, duplicated pages are merged and then the time required to write to each of the pages is detected. The test is run as follows: ./ksm_tests -C -p 5000 The output: Total COW time: 0.012612 s The number of pages: 5000 Average speed: 1623 MB/s Signed-off-by: Zhansaya Bagdauletkyzy --- tools/testing/selftests/vm/ksm_tests.c | 66 ++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/vm/ksm_tests.c b/tools/testing/selftests/vm/ksm_tests.c index 91c6ff496655..3ffd899b2bd9 100644 --- a/tools/testing/selftests/vm/ksm_tests.c +++ b/tools/testing/selftests/vm/ksm_tests.c @@ -33,7 +33,8 @@ enum ksm_test_name { CHECK_KSM_UNMERGE, CHECK_KSM_ZERO_PAGE_MERGE, CHECK_KSM_NUMA_MERGE, - KSM_MERGE_TIME + KSM_MERGE_TIME, + KSM_COW_TIME }; static int ksm_write_sysfs(const char *file_path, unsigned long val) @@ -98,7 +99,9 @@ static void print_help(void) " -U (page unmerging)\n" " -P evaluate merging time and speed.\n" " For this test, the size of duplicated memory area (in MB)\n" - " must be provided using -s option\n\n"); + " must be provided using -s option\n" + " -C evaluate the time required to break COW of merged pages.\n" + " The number of pages can be defined using -p option.\n\n"); printf(" -a: specify the access protections of pages.\n" " must be of the form [rwx].\n" @@ -457,6 +460,56 @@ static int ksm_merge_time(int mapping, int prot, int timeout, size_t map_size) return KSFT_FAIL; } +static int ksm_cow_time(int mapping, int prot, int timeout, size_t page_size, long page_count) +{ + void *map_ptr; + struct timespec start_time, end_time; + long cow_time_s, cow_time_ns; + int avg_speed; + + if (clock_gettime(CLOCK_MONOTONIC_RAW, &start_time)) { + perror("clock_gettime"); + return KSFT_FAIL; + } + + map_ptr = allocate_memory(NULL, prot, mapping, '*', page_size * page_count); + if (!map_ptr) + return KSFT_FAIL; + + if (ksm_merge_pages(map_ptr, page_size * page_count, start_time, timeout)) + goto err_out; + + if (clock_gettime(CLOCK_MONOTONIC_RAW, &start_time)) { + perror("clock_gettime"); + goto err_out; + } + for (size_t i = 0; i < page_count; i++) + memset(map_ptr + page_size * i, '-', 1); + if (clock_gettime(CLOCK_MONOTONIC_RAW, &end_time)) { + perror("clock_gettime"); + goto err_out; + } + + cow_time_ns = (end_time.tv_sec - start_time.tv_sec) * NSEC_PER_SEC + + (end_time.tv_nsec - start_time.tv_nsec); + cow_time_s = cow_time_ns / NSEC_PER_SEC; + cow_time_ns %= NSEC_PER_SEC; + avg_speed = (page_size * page_count) / (cow_time_s * USEC_PER_SEC + + cow_time_ns / NSEC_PER_USEC); + + printf("Total COW time: %ld.%06ld s\n", cow_time_s, cow_time_ns / NSEC_PER_USEC); + printf("The number of pages: %ld\n", page_count); + printf("Average speed: %d MB/s\n", avg_speed); + + munmap(map_ptr, page_size * page_count); + return KSFT_PASS; + +err_out: + printf("Not OK\n"); + munmap(map_ptr, page_size * page_count); + return KSFT_FAIL; +} + int main(int argc, char *argv[]) { int ret, opt; @@ -470,7 +523,7 @@ int main(int argc, char *argv[]) bool merge_across_nodes = KSM_MERGE_ACROSS_NODES_DEFAULT; long size_MB = 0; - while ((opt = getopt(argc, argv, "ha:p:l:z:m:s:MUZNP")) != -1) { + while ((opt = getopt(argc, argv, "ha:p:l:z:m:s:MUZNPC")) != -1) { switch (opt) { case 'a': prot = str_to_prot(optarg); @@ -524,6 +577,9 @@ int main(int argc, char *argv[]) case 'P': test_name = KSM_MERGE_TIME; break; + case 'C': + test_name = KSM_COW_TIME; + break; default: return KSFT_FAIL; } @@ -573,6 +629,10 @@ int main(int argc, char *argv[]) ret = ksm_merge_time(MAP_PRIVATE | MAP_ANONYMOUS, prot, ksm_scan_limit_sec, size_MB); break; + case KSM_COW_TIME: + ret = ksm_cow_time(MAP_PRIVATE | MAP_ANONYMOUS, prot, ksm_scan_limit_sec, + page_size, page_count); + break; } if (ksm_restore(&ksm_sysfs_old)) { -- 2.25.1