Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Mar 2005 11:36:22 -0600
From:      Alan Cox <alc@cs.rice.edu>
To:        Richard Sharpe <rsharpe@richardsharpe.com>, freebsd-hackers@FreeBSD.ORG, alc@FreeBSD.ORG
Subject:   Re: Possible problems with mmap/munmap on FreeBSD ...
Message-ID:  <20050330173622.GJ20275@cs.rice.edu>
In-Reply-To: <20050330021831.GA26006@VARK.MIT.EDU>
References:  <Pine.LNX.4.58.0503291533320.2471@durable> <20050330021831.GA26006@VARK.MIT.EDU>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Mar 29, 2005 at 09:18:32PM -0500, 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);
> > 
> > What I notice is that all the calls to mmap return the same address.
> > 
> > A careful reading of the man pages for mmap and munmap does not suggest
> > that I am doing anything wrong.
> > 
> > Is it possible that FreeBSD is deferring flushing the dirty data, and then
> > forgets to do it when the same starting address is used etc?
> 
> 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.

Hmm.  In this code path we don't call vm_object_page_remove() on
vnode-backed objects, only default/swap-backed objects that have no
other mappings that reference them.

Regards,
Alan



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050330173622.GJ20275>