From patchwork Wed Oct 10 23:34:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 982143 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="DhuLsgXq"; dkim-atps=neutral Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42Vr745NcFz9s3l for ; Thu, 11 Oct 2018 10:35:12 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 3E4903E7098 for ; Thu, 11 Oct 2018 01:35:10 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-7.smtp.seeweb.it (in-7.smtp.seeweb.it [217.194.8.7]) by picard.linux.it (Postfix) with ESMTP id 345283E708F for ; Thu, 11 Oct 2018 01:34:53 +0200 (CEST) Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by in-7.smtp.seeweb.it (Postfix) with ESMTPS id 60015200744 for ; Thu, 11 Oct 2018 01:34:52 +0200 (CEST) Received: by mail-wr1-x441.google.com with SMTP id 61-v6so7547462wrb.6 for ; Wed, 10 Oct 2018 16:34:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=g2o3HnloOkAmBCKQzTWBqQev3i6knqbyNx/GQGmn5Pk=; b=DhuLsgXq6NDOjWWuQq+1t2Qw0PtMudAARFQR/VrbS/MtYm4Wbi/llqYGRkBwifIYKg QvTCubxlSRc5JzcN/GCueWiLT2BsTMGsCxDH+oWDYVMPfy/HJrWc1wOrjXJ34gH8mXe/ 9FgEFlucwbvmbUmQIFM60DNrqw30e0bZ88K4oqf61zDN0QP/b/YD0UtQ9nJYjk3ZS6r5 35jnDbYabvRl1EmA4qM+A+QV7TsDeVYYAHuIS0Jo2IvOzt9quhudRdXPXOzV7Ji95c8v Jkc4rVrI313/V9B81olwPzBr8jyiHMURxhrMqUuktzZrsj8u7oXxNnq1HvnZkYZEOc3I QRYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=g2o3HnloOkAmBCKQzTWBqQev3i6knqbyNx/GQGmn5Pk=; b=XouaoyW1EwYKEd876deOiEhid/LhRBvWiKZK90h6EU9DyQJxZrKW97NGdtkvCuJi10 QC9jTWX/+obRqx6PhJghNWShByEfDAFS0/pIqb7Y0g7hN24pKSMUnCAq8vqRwqLzwv/C xQwGk9s9u0Jkrb06twYmci9wsTJHgeNDLFK29DdYsnFLZ2pD33UudSgxapyBvPn4+Ehx OX1BcZkJFRUp2/okLHDuElVvoa/Wc56XLUy8b5iPrSrOVklrmi17a+OCeEkvTcKIVRDa knTZucRZXHy7LW4Ehf3A1PjNjR+ggDlgtrPW24O/Yf1hhbkt2PSoXHtW1iDHTKhEW9Ef Jhcw== X-Gm-Message-State: ABuFfojS4uGAotC+5hZ1RVP6yiRamoYiYk7bYVLabmlpG86JkH1zFaGc /LN9bVSR0ffCnpSGkcnedAQ= X-Google-Smtp-Source: ACcGV62+KzCJ2hdTdyyYLW4SVCBy/+EQmt9j/ADwH9rcZgCg+5MfRIugmv5LOwMgmgpR4DqHSPncng== X-Received: by 2002:adf:f986:: with SMTP id f6-v6mr3844303wrr.293.1539214491755; Wed, 10 Oct 2018 16:34:51 -0700 (PDT) Received: from localhost.localdomain ([141.226.14.107]) by smtp.gmail.com with ESMTPSA id h2-v6sm21768484wrs.34.2018.10.10.16.34.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Oct 2018 16:34:50 -0700 (PDT) From: Amir Goldstein To: Cyril Hrubis Date: Thu, 11 Oct 2018 02:34:37 +0300 Message-Id: <20181010233441.5337-3-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181010233441.5337-1-amir73il@gmail.com> References: <20181010233441.5337-1-amir73il@gmail.com> X-Virus-Scanned: clamav-milter 0.99.2 at in-7.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-7.smtp.seeweb.it Cc: linux-unionfs@vger.kernel.org, ltp@lists.linux.it, Miklos Szeredi Subject: [LTP] [PATCH v3 2/6] syscalls/readahead02: Convert to newlib and cleanup X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.18 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" * Use SAFE macros * Use SPDX-License-Identifier * No need to cleanup test file from temp dir Signed-off-by: Amir Goldstein --- .../kernel/syscalls/readahead/readahead02.c | 248 +++++------------- 1 file changed, 72 insertions(+), 176 deletions(-) diff --git a/testcases/kernel/syscalls/readahead/readahead02.c b/testcases/kernel/syscalls/readahead/readahead02.c index c9d92a6a4..c739d3ba2 100644 --- a/testcases/kernel/syscalls/readahead/readahead02.c +++ b/testcases/kernel/syscalls/readahead/readahead02.c @@ -1,25 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2012 Linux Test Project, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * Further, this software is distributed without any warranty that it - * is free of the rightful claim of any third person regarding - * infringement or the like. Any license provided herein, whether - * implied or otherwise, applies only to this software file. Patent - * licenses, if any, provided herein do not apply to combinations of - * this program with other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. */ /* @@ -43,86 +24,57 @@ #include #include #include "config.h" -#include "test.h" -#include "safe_macros.h" +#include "tst_test.h" #include "lapi/syscalls.h" -char *TCID = "readahead02"; -int TST_TOTAL = 1; - #if defined(__NR_readahead) static char testfile[PATH_MAX] = "testfile"; static const char drop_caches_fname[] = "/proc/sys/vm/drop_caches"; static const char meminfo_fname[] = "/proc/meminfo"; static size_t testfile_size = 64 * 1024 * 1024; -static int opt_fsize; static char *opt_fsizestr; static int pagesize; -static const char *fs_type; -static const char *device; -static int mount_flag; #define MNTPOINT "mntpoint" #define MIN_SANE_READAHEAD (4u * 1024u) -option_t options[] = { - {"s:", &opt_fsize, &opt_fsizestr}, +static const char mntpoint[] = MNTPOINT; + +static struct tst_option options[] = { + {"s:", &opt_fsizestr, "-s testfile size (default 64MB)"}, {NULL, NULL, NULL} }; -static void setup(void); -static void cleanup(void); - -static void help(void) -{ - printf(" -s x testfile size (default 64MB)\n"); -} - static int check_ret(long expected_ret) { - if (expected_ret == TEST_RETURN) { - tst_resm(TPASS, "expected ret success - " - "returned value = %ld", TEST_RETURN); + if (expected_ret == TST_RET) { + tst_res(TPASS, "expected ret success - " + "returned value = %ld", TST_RET); return 0; } - tst_resm(TFAIL | TTERRNO, "unexpected failure - " - "returned value = %ld, expected: %ld", - TEST_RETURN, expected_ret); + tst_res(TFAIL | TTERRNO, "unexpected failure - " + "returned value = %ld, expected: %ld", + TST_RET, expected_ret); return 1; } static int has_file(const char *fname, int required) { - int ret; struct stat buf; - ret = stat(fname, &buf); - if (ret == -1) { - if (errno == ENOENT) - if (required) - tst_brkm(TCONF, cleanup, "%s not available", - fname); - else - return 0; - else - tst_brkm(TBROK | TERRNO, cleanup, "stat %s", fname); + + if (stat(fname, &buf) == -1) { + if (errno != ENOENT) + tst_brk(TBROK | TERRNO, "stat %s", fname); + if (required) + tst_brk(TCONF, "%s not available", fname); + return 0; } return 1; } static void drop_caches(void) { - int ret; - FILE *f; - - f = fopen(drop_caches_fname, "w"); - if (f) { - ret = fprintf(f, "1"); - fclose(f); - if (ret < 1) - tst_brkm(TBROK, cleanup, "Failed to drop caches"); - } else { - tst_brkm(TBROK, cleanup, "Failed to open drop_caches"); - } + SAFE_FILE_PRINTF(drop_caches_fname, "1"); } static unsigned long parse_entry(const char *fname, const char *entry) @@ -161,32 +113,21 @@ static unsigned long get_cached_size(void) static void create_testfile(void) { - FILE *f; + int fd; char *tmp; size_t i; - tst_resm(TINFO, "creating test file of size: %zu", testfile_size); - tmp = SAFE_MALLOC(cleanup, pagesize); + tst_res(TINFO, "creating test file of size: %zu", testfile_size); + tmp = SAFE_MALLOC(pagesize); /* round to page size */ testfile_size = testfile_size & ~((long)pagesize - 1); - f = fopen(testfile, "w"); - if (!f) { - free(tmp); - tst_brkm(TBROK | TERRNO, cleanup, "Failed to create %s", - testfile); - } - + fd = SAFE_CREAT(testfile, 0644); for (i = 0; i < testfile_size; i += pagesize) - if (fwrite(tmp, pagesize, 1, f) < 1) { - free(tmp); - tst_brkm(TBROK, cleanup, "Failed to create %s", - testfile); - } - fflush(f); - fsync(fileno(f)); - fclose(f); + SAFE_WRITE(1, fd, tmp, pagesize); + SAFE_FSYNC(fd); + SAFE_CLOSE(fd); free(tmp); } @@ -215,13 +156,13 @@ static void read_testfile(int do_readahead, const char *fname, size_t fsize, off_t offset = 0; struct timeval now; - fd = SAFE_OPEN(cleanup, fname, O_RDONLY); + fd = SAFE_OPEN(fname, O_RDONLY); if (do_readahead) { cached_start = get_cached_size(); do { TEST(readahead(fd, offset, fsize - offset)); - if (TEST_RETURN != 0) { + if (TST_RET != 0) { check_ret(0); break; } @@ -232,7 +173,7 @@ static void read_testfile(int do_readahead, const char *fname, size_t fsize, if (*cached > cached_start) { max_ra_estimate = (1024 * (*cached - cached_start)); - tst_resm(TINFO, "max ra estimate: %lu", + tst_res(TINFO, "max ra estimate: %lu", max_ra_estimate); } max_ra_estimate = MAX(max_ra_estimate, @@ -242,27 +183,23 @@ static void read_testfile(int do_readahead, const char *fname, size_t fsize, i++; offset += max_ra_estimate; } while ((size_t)offset < fsize); - tst_resm(TINFO, "readahead calls made: %zu", i); + tst_res(TINFO, "readahead calls made: %zu", i); *cached = get_cached_size(); /* offset of file shouldn't change after readahead */ - offset = lseek(fd, 0, SEEK_CUR); - if (offset == (off_t) - 1) - tst_brkm(TBROK | TERRNO, cleanup, "lseek failed"); + offset = SAFE_LSEEK(fd, 0, SEEK_CUR); if (offset == 0) - tst_resm(TPASS, "offset is still at 0 as expected"); + tst_res(TPASS, "offset is still at 0 as expected"); else - tst_resm(TFAIL, "offset has changed to: %lu", offset); + tst_res(TFAIL, "offset has changed to: %lu", offset); } if (gettimeofday(&now, NULL) == -1) - tst_brkm(TBROK | TERRNO, cleanup, "gettimeofday failed"); + tst_brk(TBROK | TERRNO, "gettimeofday failed"); time_start_usec = now.tv_sec * 1000000 + now.tv_usec; read_bytes_start = get_bytes_read(); - p = mmap(NULL, fsize, PROT_READ, MAP_SHARED | MAP_POPULATE, fd, 0); - if (p == MAP_FAILED) - tst_brkm(TBROK | TERRNO, cleanup, "mmap failed"); + p = SAFE_MMAP(NULL, fsize, PROT_READ, MAP_SHARED | MAP_POPULATE, fd, 0); /* for old kernels, where MAP_POPULATE doesn't work, touch each page */ tmp = 0; @@ -270,20 +207,20 @@ static void read_testfile(int do_readahead, const char *fname, size_t fsize, tmp = tmp ^ p[i]; /* prevent gcc from optimizing out loop above */ if (tmp != 0) - tst_brkm(TBROK, NULL, "This line should not be reached"); + tst_brk(TBROK, "This line should not be reached"); if (!do_readahead) *cached = get_cached_size(); - SAFE_MUNMAP(cleanup, p, fsize); + SAFE_MUNMAP(p, fsize); *read_bytes = get_bytes_read() - read_bytes_start; if (gettimeofday(&now, NULL) == -1) - tst_brkm(TBROK | TERRNO, cleanup, "gettimeofday failed"); + tst_brk(TBROK | TERRNO, "gettimeofday failed"); time_end_usec = now.tv_sec * 1000000 + now.tv_usec; *usec = time_end_usec - time_start_usec; - SAFE_CLOSE(cleanup, fd); + SAFE_CLOSE(fd); } static void test_readahead(void) @@ -302,7 +239,7 @@ static void test_readahead(void) cached_low = get_cached_size(); cached_max = cached_max - cached_low; - tst_resm(TINFO, "read_testfile(0)"); + tst_res(TINFO, "read_testfile(0)"); read_testfile(0, testfile, testfile_size, &read_bytes, &usec, &cached); if (cached > cached_low) cached = cached - cached_low; @@ -312,7 +249,7 @@ static void test_readahead(void) sync(); drop_caches(); cached_low = get_cached_size(); - tst_resm(TINFO, "read_testfile(1)"); + tst_res(TINFO, "read_testfile(1)"); read_testfile(1, testfile, testfile_size, &read_bytes_ra, &usec_ra, &cached_ra); if (cached_ra > cached_low) @@ -320,25 +257,25 @@ static void test_readahead(void) else cached_ra = 0; - tst_resm(TINFO, "read_testfile(0) took: %ld usec", usec); - tst_resm(TINFO, "read_testfile(1) took: %ld usec", usec_ra); + tst_res(TINFO, "read_testfile(0) took: %ld usec", usec); + tst_res(TINFO, "read_testfile(1) took: %ld usec", usec_ra); if (has_file(proc_io_fname, 0)) { - tst_resm(TINFO, "read_testfile(0) read: %ld bytes", read_bytes); - tst_resm(TINFO, "read_testfile(1) read: %ld bytes", - read_bytes_ra); + tst_res(TINFO, "read_testfile(0) read: %ld bytes", read_bytes); + tst_res(TINFO, "read_testfile(1) read: %ld bytes", + read_bytes_ra); /* actual number of read bytes depends on total RAM */ if (read_bytes_ra < read_bytes) - tst_resm(TPASS, "readahead saved some I/O"); + tst_res(TPASS, "readahead saved some I/O"); else - tst_resm(TFAIL, "readahead failed to save any I/O"); + tst_res(TFAIL, "readahead failed to save any I/O"); } else { - tst_resm(TCONF, "Your system doesn't have /proc/pid/io," - " unable to determine read bytes during test"); + tst_res(TCONF, "Your system doesn't have /proc/pid/io," + " unable to determine read bytes during test"); } - tst_resm(TINFO, "cache can hold at least: %ld kB", cached_max); - tst_resm(TINFO, "read_testfile(0) used cache: %ld kB", cached); - tst_resm(TINFO, "read_testfile(1) used cache: %ld kB", cached_ra); + tst_res(TINFO, "cache can hold at least: %ld kB", cached_max); + tst_res(TINFO, "read_testfile(0) used cache: %ld kB", cached); + tst_res(TINFO, "read_testfile(1) used cache: %ld kB", cached_ra); if (cached_max * 1024 >= testfile_size) { /* @@ -346,83 +283,42 @@ static void test_readahead(void) * for readahead should be at least testfile_size/2 */ if (cached_ra * 1024 > testfile_size / 2) - tst_resm(TPASS, "using cache as expected"); + tst_res(TPASS, "using cache as expected"); else - tst_resm(TWARN, "using less cache than expected"); + tst_res(TWARN, "using less cache than expected"); } else { - tst_resm(TCONF, "Page cache on your system is too small " - "to hold whole testfile."); + tst_res(TCONF, "Page cache on your system is too small " + "to hold whole testfile."); } } -int main(int argc, char *argv[]) -{ - int lc; - - tst_parse_opts(argc, argv, options, help); - - if (opt_fsize) - testfile_size = atoi(opt_fsizestr); - - setup(); - for (lc = 0; TEST_LOOPING(lc); lc++) { - tst_count = 0; - test_readahead(); - } - cleanup(); - tst_exit(); -} - static void setup(void) { - tst_require_root(); - tst_tmpdir(); - TEST_PAUSE; + if (opt_fsizestr) + testfile_size = SAFE_STRTOL(opt_fsizestr, 1, INT_MAX); has_file(drop_caches_fname, 1); has_file(meminfo_fname, 1); /* check if readahead is supported */ - ltp_syscall(__NR_readahead, 0, 0, 0); + tst_syscall(__NR_readahead, 0, 0, 0); pagesize = getpagesize(); - if (tst_fs_type(cleanup, ".") == TST_TMPFS_MAGIC) { - tst_resm(TINFO, "TMPFS detected, creating loop device"); - - fs_type = tst_dev_fs_type(); - device = tst_acquire_device(cleanup); - if (!device) { - tst_brkm(TCONF, cleanup, - "Failed to obtain block device"); - } - - tst_mkfs(cleanup, device, fs_type, NULL, NULL); - - SAFE_MKDIR(cleanup, MNTPOINT, 0755); - SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL); - mount_flag = 1; - - sprintf(testfile, MNTPOINT"/testfile"); - } + sprintf(testfile, "%s/testfile", mntpoint); create_testfile(); } -static void cleanup(void) -{ - unlink(testfile); - if (mount_flag && tst_umount(MNTPOINT) < 0) - tst_resm(TWARN | TERRNO, "umount device:%s failed", device); - - if (device) - tst_release_device(device); - - tst_rmdir(); -} +static struct tst_test test = { + .needs_root = 1, + .needs_tmpdir = 1, + .mount_device = 1, + .mntpoint = mntpoint, + .setup = setup, + .options = options, + .test_all = test_readahead, +}; #else /* __NR_readahead */ -int main(void) -{ - tst_brkm(TCONF, NULL, "System doesn't support __NR_readahead"); -} + TST_TEST_TCONF("System doesn't support __NR_readahead"); #endif