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>
index | next in thread | previous in thread | raw e-mail
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);
}
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404230211.i3N2Bwh6004161>
