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