Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Jul 2006 16:39:24 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-hackers@freebsd.org
Cc:        Attilio Rao <attilio@freebsd.org>, Divacky Roman <xdivac02@stud.fit.vutbr.cz>
Subject:   Re: VM question related to faults
Message-ID:  <200607311639.24810.jhb@freebsd.org>
In-Reply-To: <3bbf2fe10607311115ua9b7b9axd9d3e6dcff2c1daf@mail.gmail.com>
References:  <20060730105731.GA64955@stud.fit.vutbr.cz> <20060730200354.GA82547@stud.fit.vutbr.cz> <3bbf2fe10607311115ua9b7b9axd9d3e6dcff2c1daf@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 31 July 2006 14:15, Attilio Rao wrote:
> 2006/7/30, Divacky Roman <xdivac02@stud.fit.vutbr.cz>:
> > On Sun, Jul 30, 2006 at 12:57:32PM +0200, Divacky Roman wrote:
> > > hi,
> > >
> > > while working on SoC linuxolator project I am in a need of this:
> > >
> > > I need to do some operation on memory like mem1 = mem1 + mem2 etc.
> > > where the mem1/mem2 access can trigger fault. (memory not mapped or something)
> >
> > to make it clear.. I am trying to access user-space memory from kernel.
> > This needs to be atomic (its an implementation of linux futexes)
> >
> > I need to check from kernel if some memory is accessible and then perform an
> > operation on this memory. All atomically.
> >
> > hence I need two things - function which checks wheter the memory is accessible
> > and something which makes it atomic (some mutex/something which prevents other
> > process to enter VM to unmap/etc. the memory in question)
> >
> > hope its a bit more clear now
> 
> You would use something like:
> 
> #include <sys/cdefs.h>
> #include <sys/param.h>
> #include <sys/time.h>
> #include <sys/lock.h>
> #include <sys/mutex.h>
> #include <sys/systm.h>
> #include <sys/resource.h>
> 
> #include <vm/vm_page.h>
> 
> ...
> int
> lock_and_fetch(const void* mem1, const void *mem2)
> {
> 
>         mtx_lock(&vm_page_queue_mtx);
>         if (fubyte(mem1) == -1 || fubyte(mem2) == -1) {
>                 mtx_unlock(&vm_page_queue_mtx);
>                 return(EINVAL);
>         }
>         /* Operations... */
>         mtx_unlock(&vm_page_queue_mtx);
> 
>         return(0);
> }
> 
> It prevents to virtual pages to be passed through queues.

Erm, but if fubyte() had to page the file in from disk you would
have to sleep while holding the vm_page_queue_mtx, and that's not
allowed.

-- 
John Baldwin



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