From owner-freebsd-hackers@FreeBSD.ORG Thu Apr 22 19:12:02 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 98E0516A4CE for ; Thu, 22 Apr 2004 19:12:02 -0700 (PDT) Received: from apollo.backplane.com (apollo.backplane.com [216.240.41.2]) by mx1.FreeBSD.org (Postfix) with ESMTP id 839AC43D45 for ; Thu, 22 Apr 2004 19:12:02 -0700 (PDT) (envelope-from dillon@apollo.backplane.com) Received: from apollo.backplane.com (localhost [127.0.0.1]) i3N2Bw7Z004162; Thu, 22 Apr 2004 19:12:00 -0700 (PDT) (envelope-from dillon@apollo.backplane.com) Received: (from dillon@localhost) by apollo.backplane.com (8.12.9p2/8.12.9/Submit) id i3N2Bwh6004161; Thu, 22 Apr 2004 19:11:58 -0700 (PDT) (envelope-from dillon) Date: Thu, 22 Apr 2004 19:11:58 -0700 (PDT) From: Matthew Dillon Message-Id: <200404230211.i3N2Bwh6004161@apollo.backplane.com> To: Stephan Uphoff References: <200404230103.VAA18066@stups.com> cc: hackers@freebsd.org cc: Julian Elischer Subject: Re: how to flush out cache.? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 23 Apr 2004 02:12:02 -0000 Sigh. Run this program. Note that the file contains an 'A' in the first byte after you run it (hexdump -C test.dat). Thus, msync() is not destroying the page until AFTER it finishes flushing it to disk. /* * x.c */ #include #include #include #include #include int main(int ac, char **av) { int fd; char *ptr; fd = open("test.dat", O_RDWR|O_CREAT|O_TRUNC, 0666); ftruncate(fd, 4096); ptr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); *ptr = 'A'; msync(ptr, 4096, MS_INVALIDATE); return(0); } Now run this program. Note that the file still contains an 'A' after you run it. Thus, again, msync() is not destroying the page until after it has been synchronized with the file. I also added some additional code to re-read *ptr after the msync and observed the I/O go through to the disk, so it does appear to be destroying the page. But it is definitely flushing it to disk first. If you can demonstrate a case where the page is being destroying when it shouldn't be, then there's a bug that needs fixing. Right now though it seems to operate as expected. -Matt /* * y.c */ #include #include #include #include #include int main(int ac, char **av) { int fd; char *ptr; fd = open("test.dat", O_RDWR|O_CREAT|O_TRUNC, 0666); ftruncate(fd, 4096); ptr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); *ptr = 'A'; munmap(ptr, 4096); ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, fd, 0); msync(ptr, 4096, MS_INVALIDATE); return(0); }