how to flush out cache.?
Matthew Dillon
dillon at apollo.backplane.com
Thu Apr 22 19:12:02 PDT 2004
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);
}
More information about the freebsd-hackers
mailing list