Possible problems with mmap/munmap on FreeBSD ...

Richard Sharpe rsharpe at richardsharpe.com
Wed Mar 30 09:05:15 PST 2005


On Tue, 29 Mar 2005, David Schultz wrote:

> On Tue, Mar 29, 2005, Richard Sharpe wrote:
> > Hi,
> >
> > I am having some problems with the tdb package on FreeBSD 4.6.2 and 4.10.
> >
> > One of the things the above package does is:
> >
> >    mmap the tdb file to a region of memory
> >    store stuff in the region (memmov etc).
> >    when it needs to extend the size of the region {
> >      munmap the region
> >      write data at the end of the file
> >      mmap the region again with a larger size
> >    }
> >
> > What I am seeing is that after the munmap the data written to the region
> > is gone.
> >
> > However, if I insert an msync before the munmap, everything is nicely
> > coherent. This seems odd (in the sense that it works without the msync
> > under Linux).
> >
> > The region is mmapped with:
> >
> >    mmap(NULL, tdb->map_size,
> >         PROT_READ|(tdb->read_only? 0:PROT_WRITE),
> >         MAP_SHARED|MAP_FILE, tdb->fd, 0);
>
> It looks like all of the underlying pages are getting invalidated
> in vm_object_page_remove().  This is clearly the right thing to do
> for private mappings, but it seems wrong for shared mappings.
> Perhaps Alan has some insight.

OK, a simple test program that:

  writes some content C1 to a file
  mmaps file to S1
  writes content C2 to S1
  munmaps S1
  mmaps S1
  compares shows expected behavior
  writes content C1 to S1
  munmaps S1
  mmaps S1
  compares shows expected behavior

So, now to do things like extend the file after mmapping etc to see where
the problem lies.

Regards
-----
Richard Sharpe, rsharpe[at]richardsharpe.com, rsharpe[at]samba.org,
sharpe[at]ethereal.com, http://www.richardsharpe.com


More information about the freebsd-hackers mailing list