Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754047AbXJIARc (ORCPT ); Mon, 8 Oct 2007 20:17:32 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752485AbXJIARX (ORCPT ); Mon, 8 Oct 2007 20:17:23 -0400 Received: from smtp101.mail.mud.yahoo.com ([209.191.85.211]:23632 "HELO smtp101.mail.mud.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752467AbXJIARU (ORCPT ); Mon, 8 Oct 2007 20:17:20 -0400 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com.au; h=Received:X-YMail-OSG:From:To:Subject:Date:User-Agent:Cc:References:In-Reply-To:MIME-Version:Content-Type:Message-Id; b=injblHcKwjxS6QQ1uAzd6M3EmjjuFgOiiW7OuGP/HJBQft3OzUsxlTYd0kEaK4rV7Smi43QGsYUjKw1KcU1iB0DjalOqyvlVfN5gE7tU1Xb4AySKlB/BCpaNlP1ZargeY2GoT2XlA8frLCSTMDgYPrBeNrCdhqjCadMXDfeq/T8= ; X-YMail-OSG: g2DiyL0VM1lQ7Kc0AinaZekMnC1MgLC0JDe_hzrylURN_DuM03o.Hsy4UO002bSACYy2lg1pCw-- From: Nick Piggin To: Andrew Morton , Ingo Molnar Subject: Re: [PATCH]fix VM_CAN_NONLINEAR check in sys_remap_file_pages Date: Mon, 8 Oct 2007 17:45:38 +1000 User-Agent: KMail/1.9.5 Cc: Randy Dunlap , yanzheng@21cn.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, ltp-list@lists.sourceforge.net References: <3d0408630710080445j4dea115emdfe29aac26814536@mail.gmail.com> <20071008102843.d20b56d7.randy.dunlap@oracle.com> <20071008105120.4e0e4a85.akpm@linux-foundation.org> In-Reply-To: <20071008105120.4e0e4a85.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_jAeCHpGYRU+cpXT" Message-Id: <200710081745.39254.nickpiggin@yahoo.com.au> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3937 Lines: 160 --Boundary-00=_jAeCHpGYRU+cpXT Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline On Tuesday 09 October 2007 03:51, Andrew Morton wrote: > On Mon, 8 Oct 2007 10:28:43 -0700 > > I'll now add remap_file_pages soon. > > Maybe those other 2 tests aren't strong enough (?). > > Or maybe they don't return a non-0 exit status even when they fail... > > (I'll check.) > > Perhaps Yan Zheng can tell us what test was used to demonstrate this? Was probably found by review. Otherwise, you could probably reproduce it by mmaping, say, drm device node, running remap_file_pages() on it to create a nonlinear mapping, and then finding that you get the wrong data. > > > I'm surprise that LTP doesn't have any remap_file_pages() tests. > > > > quick grep didn't find any for me. > > Me either. There are a few lying around the place which could be > integrated. > > It would be good if LTP were to have some remap_file_pages() tests > (please). As we see here, it is something which we can easily break, and > leave broken for some time. Here is Ingo's old test, since cleaned up and fixed a bit by me.... I'm sure he would distribute it GPL, but I've cc'ed him because I didn't find an explicit statement about that. --Boundary-00=_jAeCHpGYRU+cpXT Content-Type: text/x-csrc; charset="iso-8859-1"; name="remap-file-pages.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="remap-file-pages.c" /* * Copyright (C) Ingo Molnar, 2002 */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #define PAGE_SIZE 4096 #define PAGE_WORDS (PAGE_SIZE/sizeof(int)) #define CACHE_PAGES 1024 #define CACHE_SIZE (CACHE_PAGES*PAGE_SIZE) #define WINDOW_PAGES 16 #define WINDOW_SIZE (WINDOW_PAGES*PAGE_SIZE) #define WINDOW_START 0x48000000 static char cache_contents [CACHE_SIZE]; static void test_nonlinear(int fd) { char *data = NULL; int i, j, repeat = 2; for (i = 0; i < CACHE_PAGES; i++) { int *page = (int *) (cache_contents + i*PAGE_SIZE); for (j = 0; j < PAGE_WORDS; j++) page[j] = i; } if (write(fd, cache_contents, CACHE_SIZE) != CACHE_SIZE) perror("write"), exit(1); data = mmap((void *)WINDOW_START, WINDOW_SIZE, PROT_READ|PROT_WRITE, MAP_FIXED | MAP_SHARED , fd, 0); if (data == MAP_FAILED) perror("mmap"), exit(1); again: for (i = 0; i < WINDOW_PAGES; i += 2) { char *page = data + i*PAGE_SIZE; if (remap_file_pages(page, PAGE_SIZE * 2, 0, (WINDOW_PAGES-i-2), 0) == -1) perror("remap_file_pages"), exit(1); } for (i = 0; i < WINDOW_PAGES; i++) { /* * Double-check the correctness of the mapping: */ if (i & 1) { if (data[i*PAGE_SIZE] != WINDOW_PAGES-i) { printf("hm, mapped incorrect data!\n"); exit(1); } } else { if (data[i*PAGE_SIZE] != WINDOW_PAGES-i-2) { printf("hm, mapped incorrect data!\n"); exit(1); } } } if (--repeat) goto again; } int main(int argc, char **argv) { int fd; fd = open("/dev/shm/cache", O_RDWR|O_CREAT|O_TRUNC,S_IRWXU); if (fd < 0) perror("open"), exit(1); test_nonlinear(fd); if (close(fd) == -1) perror("close"), exit(1); printf("nonlinear shm file OK\n"); fd = open("/tmp/cache", O_RDWR|O_CREAT|O_TRUNC,S_IRWXU); if (fd < 0) perror("open"), exit(1); test_nonlinear(fd); if (close(fd) == -1) perror("close"), exit(1); printf("nonlinear /tmp/ file OK\n"); exit(0); } --Boundary-00=_jAeCHpGYRU+cpXT-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/