Skip site navigation (1)Skip section navigation (2)
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>