Skip to content

Commit

Permalink
Add mincore() test for anonymous mappings
Browse files Browse the repository at this point in the history
References: #461

Signed-off-by: Shwetha Subramanian. <shwetha@zilogic.com>
Reviewed-by: Vijay Kumar B. <vijaykumar@zilogic.com>
Acked-by: Jan Stancek <jstancek@redhat.com>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
  • Loading branch information
Shwetha Subramanian authored and metan-ucw committed Jul 8, 2020
1 parent 74a6d5a commit 759887a
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 0 deletions.
1 change: 1 addition & 0 deletions runtest/syscalls
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,7 @@ open_tree02 open_tree02

mincore01 mincore01
mincore02 mincore02
mincore03 mincore03

madvise01 madvise01
madvise02 madvise02
Expand Down
1 change: 1 addition & 0 deletions testcases/kernel/syscalls/mincore/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/mincore01
/mincore02
/mincore03
83 changes: 83 additions & 0 deletions testcases/kernel/syscalls/mincore/mincore03.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) Zilogic Systems Pvt. Ltd., 2020
* Email: code@zilogic.com
*/

/*
* mincore03
* Testcase 1: Test shows that pages mapped as anonymous and
* not faulted, are reported as not resident in memory by mincore().
* Testcase 2: Test shows that pages mapped as anonymous and faulted,
* are reported as resident in memory by mincore().
*/

#include <stdbool.h>
#include <unistd.h>
#include <sys/mman.h>
#include "tst_test.h"

#define NUM_PAGES 3

static struct tcase {
bool mlock;
int expected_pages;
char *desc;
} tcases[] = {
{ false, 0, "untouched pages are not resident"},
{ true, NUM_PAGES, "locked pages are resident"},
};

static int size, page_size;
static void *ptr;

static void cleanup(void)
{
if (ptr)
SAFE_MUNMAP(ptr, size);
}

static void setup(void)
{
page_size = getpagesize();
size = page_size * NUM_PAGES;
}

static void test_mincore(unsigned int test_nr)
{
const struct tcase *tc = &tcases[test_nr];
unsigned char vec[NUM_PAGES];
int locked_pages;
int count, mincore_ret;

ptr = SAFE_MMAP(NULL, size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (tc->mlock)
SAFE_MLOCK(ptr, size);

mincore_ret = mincore(ptr, size, vec);
if (mincore_ret == -1)
tst_brk(TBROK | TERRNO, "mincore failed");
locked_pages = 0;
for (count = 0; count < NUM_PAGES; count++)
if (vec[count] & 1)
locked_pages++;

if (locked_pages == tc->expected_pages)
tst_res(TPASS, "mincore() reports %s", tc->desc);
else
tst_res(TFAIL, "mincore reports resident pages as %d, but expected %d",
locked_pages, tc->expected_pages);

if (tc->mlock)
SAFE_MUNLOCK(ptr, size);
SAFE_MUNMAP(ptr, size);
ptr = NULL;
}

static struct tst_test test = {
.tcnt = ARRAY_SIZE(tcases),
.setup = setup,
.cleanup = cleanup,
.test = test_mincore,
};

0 comments on commit 759887a

Please sign in to comment.