Date: Thu, 22 Apr 2004 19:11:58 -0700 (PDT) From: Matthew Dillon <dillon@apollo.backplane.com> To: Stephan Uphoff <ups@tree.com> Cc: Julian Elischer <julian@elischer.org> Subject: Re: how to flush out cache.? Message-ID: <200404230211.i3N2Bwh6004161@apollo.backplane.com> References: <200404230103.VAA18066@stups.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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 <sys/types.h> #include <sys/mman.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> 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 <sys/types.h> #include <sys/mman.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> 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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404230211.i3N2Bwh6004161>