[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJn8CcGGyPNOZH2g+2FaFCtg70P4QOVvzhWYDcGoJta3-ikr8Q@mail.gmail.com>
Date: Wed, 9 May 2012 17:28:56 +0800
From: Xiaotian Feng <xtfeng@...il.com>
To: Zhouping Liu <zliu@...hat.com>
Cc: linux-mm@...ck.org, linux-kernel@...r.kernel.org
Subject: Re: mm: move_pages syscall can't return ENOENT when pages are not present
On Wed, May 9, 2012 at 4:58 PM, Zhouping Liu <zliu@...hat.com> wrote:
> hi, all
>
> Recently, I found an error in move_pages syscall:
>
> depending on move_pages(2), when page is not present,
> it should fail with ENOENT, in fact, it's ok without
> any errno.
>
> the following reproducer can easily reproduce
> the issue, suggest you get more details by strace.
> inside reproducer, I try to move a non-exist page from
> node 1 to node 0.
>
> I have tested it on the latest kernel 3.4-rc5 with 2 and 4 numa nodes.
> [zliu@...upingLiu ~]$ gcc -o reproducer reproducer.c -lnuma
> [zliu@...upingLiu ~]$ ./reproducer
> from_node is 1, to_node is 0
> ERROR: move_pages expected FAIL.
>
" If nodes is not NULL, move_pages returns the number of valid
migration requests which could not currently be performed. Otherwise
it returns 0."
> I'm not in mail list, please CC me.
>
> /*
> * Copyright (C) 2012 Red Hat, Inc.
> *
> * This work is licensed under the terms of the GNU GPL, version 2. See
> * the COPYING file in the top-level directory.
> *
> * Compiled: gcc -o reproducer reproducer.c -lnuma
> * Description:
> * it's designed to check move_pages syscall, when
> * page is not present, it should fail with ENOENT.
> */
>
> #include <sys/mman.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <stdio.h>
> #include <unistd.h>
> #include <errno.h>
> #include <numa.h>
> #include <numaif.h>
>
> #define TEST_PAGES 4
>
> int main(int argc, char **argv)
> {
> void *pages[TEST_PAGES];
> int onepage;
> int nodes[TEST_PAGES];
> int status, ret;
> int i, from_node = 1, to_node = 0;
>
> onepage = getpagesize();
>
> for (i = 0; i < TEST_PAGES - 1; i++) {
> pages[i] = numa_alloc_onnode(onepage, from_node);
> nodes[i] = to_node;
> }
>
> nodes[TEST_PAGES - 1] = to_node;
>
> /*
> * the follow page is not available, also not aligned,
> * depend on move_pages(2), it can't be moved, and should
> * return ENOENT errno.
> */
> pages[TEST_PAGES - 1] = pages[TEST_PAGES - 2] - onepage * 4 + 1;
>
> printf("from_node is %u, to_node is %u\n", from_node, to_node);
> ret = move_pages(0, TEST_PAGES, pages, nodes, &status, MPOL_MF_MOVE);
> if (ret == -1) {
> if (errno != ENOENT)
> perror("move_pages expected ENOENT errno, but it's");
> else
> printf("Succeed\n");
> } else {
> printf("ERROR: move_pages expected FAIL.\n");
> }
>
> for (i = 0; i < TEST_PAGES; i++)
> numa_free(pages[i], onepage);
>
> return 0;
> }
>
> --
> Thanks,
> Zhouping
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists