From: Matthew Dillon Date: Mon, 2 Jul 2007 16:52:25 +0000 (+0000) Subject: The vkernel's copyin/copyout implementation is not MP safe, acquire and X-Git-Tag: v2.0.1~2685 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/7e522155fcc2402ed0ff7c7fe19baaa752128b41 The vkernel's copyin/copyout implementation is not MP safe, acquire and release the MP lock. --- diff --git a/sys/platform/vkernel/platform/copyio.c b/sys/platform/vkernel/platform/copyio.c index 7781e2beaa..3893d40ac9 100644 --- a/sys/platform/vkernel/platform/copyio.c +++ b/sys/platform/vkernel/platform/copyio.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/platform/vkernel/platform/copyio.c,v 1.7 2007/01/11 10:15:18 dillon Exp $ + * $DragonFly: src/sys/platform/vkernel/platform/copyio.c,v 1.8 2007/07/02 16:52:25 dillon Exp $ */ #include @@ -117,6 +117,9 @@ copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *res) /* * Copy a binary buffer from user space to kernel space. * + * NOTE: on a real system copyin/copyout are MP safe, but the current + * implementation on a vkernel is not so we get the mp lock. + * * Returns 0 on success, EFAULT on failure. */ int @@ -129,6 +132,7 @@ copyin(const void *udaddr, void *kaddr, size_t len) size_t n; error = 0; + get_mplock(); while (len) { m = vm_fault_page(&vm->vm_map, trunc_page((vm_offset_t)udaddr), VM_PROT_READ, @@ -147,6 +151,7 @@ copyin(const void *udaddr, void *kaddr, size_t len) vm_page_unhold(m); sf_buf_free(sf); } + rel_mplock(); return (error); } @@ -165,6 +170,7 @@ copyout(const void *kaddr, void *udaddr, size_t len) size_t n; error = 0; + get_mplock(); while (len) { m = vm_fault_page(&vm->vm_map, trunc_page((vm_offset_t)udaddr), VM_PROT_READ|VM_PROT_WRITE, @@ -183,6 +189,7 @@ copyout(const void *kaddr, void *udaddr, size_t len) vm_page_unhold(m); sf_buf_free(sf); } + rel_mplock(); return (error); }