Date: Tue, 21 Oct 1997 20:30:28 -0600 From: "Mike Durian" <durian@plutotech.com> To: "Mike Durian" <durian@plutotech.com> Cc: hackers@FreeBSD.ORG Subject: Re: user vm addr to kernel vm addr Message-ID: <199710220230.UAA15838@pluto.plutotech.com> In-Reply-To: Your message of "Mon, 20 Oct 1997 20:01:11 MDT."
next in thread | raw e-mail | index | archive | help
On Mon, 20 Oct 1997 20:01:11 MDT, "Mike Durian" <durian@plutotech.com> wrote: > In my virtual file system I'd like to speed up reads and writes >by copying directly from the uio structure to a vm address of >a buffer in the user process running on behalf of the filesystem. >I'm currently shoving all the data through a socket that the >user process reads from and copies into a buffer. I'd like to >go direct and skip the socket writing part. Does that make sense? > Anyway, I want to copy from a uio to a different process's vm space. >I can get the vm address of the destination buffer over a socket and >think I can use vm_fault_wire to make sure it stays accessable, but >I don't know how to convert that user space vm address into a >kernel space vm address that I can then use with copyout. > Is there an easy (or any) way to do this? I'm following up to my own post. I should mention that the user process containing the vm buffer that I want to convert is *not* curproc. I want to go between that buffer and a struct uio in my VOP_READ and VOP_WRITE functions. I did find something that works, but perhaps someone has a better/cleaner way of doing it. I don't think I need to do the vm_fault_wire either. for each page in the vm buffer vm_map_lookup to get the vm object vm_page_lookup to get the page for the object kmem_alloc_pageable to allocate kernel vm space pmap_qenter to map the pages into the kernel vm address uiomove copy from the new kernel address to uio pmap_qremove to unmap the pages kmem_free to release the kernel vm space mike
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199710220230.UAA15838>