Module Name:    src
Committed By:   matt
Date:           Wed Feb  1 02:27:24 UTC 2012

Modified Files:
        src/sys/kern: uipc_socket.c
        src/sys/nfs: nfs_serv.c
        src/sys/sys: socketvar.h

Log Message:
When using socket loaning, make sure the KVA used for the loan has the same
color as the UVA being loaned.


To generate a diff of this commit:
cvs rdiff -u -r1.208 -r1.209 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.162 -r1.163 src/sys/nfs/nfs_serv.c
cvs rdiff -u -r1.128 -r1.129 src/sys/sys/socketvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.208 src/sys/kern/uipc_socket.c:1.209
--- src/sys/kern/uipc_socket.c:1.208	Fri Jan 27 19:48:40 2012
+++ src/sys/kern/uipc_socket.c	Wed Feb  1 02:27:23 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.208 2012/01/27 19:48:40 para Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.209 2012/02/01 02:27:23 matt Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.208 2012/01/27 19:48:40 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.209 2012/02/01 02:27:23 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_sock_counters.h"
@@ -197,7 +197,7 @@ sokvaunreserve(vsize_t len)
  */
 
 vaddr_t
-sokvaalloc(vsize_t len, struct socket *so)
+sokvaalloc(vaddr_t sva, vsize_t len, struct socket *so)
 {
 	vaddr_t lva;
 
@@ -212,7 +212,8 @@ sokvaalloc(vsize_t len, struct socket *s
 	 * allocate kva.
 	 */
 
-	lva = uvm_km_alloc(kernel_map, len, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA);
+	lva = uvm_km_alloc(kernel_map, len, atop(sva) & uvmexp.colormask,
+	    UVM_KMF_COLORMATCH | UVM_KMF_VAONLY | UVM_KMF_WAITVA);
 	if (lva == 0) {
 		sokvaunreserve(len);
 		return (0);
@@ -349,7 +350,7 @@ sosend_loan(struct socket *so, struct ui
 
 	KASSERT(npgs <= M_EXT_MAXPAGES);
 
-	lva = sokvaalloc(len, so);
+	lva = sokvaalloc(sva, len, so);
 	if (lva == 0)
 		return 0;
 

Index: src/sys/nfs/nfs_serv.c
diff -u src/sys/nfs/nfs_serv.c:1.162 src/sys/nfs/nfs_serv.c:1.163
--- src/sys/nfs/nfs_serv.c:1.162	Mon Nov 21 09:07:59 2011
+++ src/sys/nfs/nfs_serv.c	Wed Feb  1 02:27:24 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_serv.c,v 1.162 2011/11/21 09:07:59 hannken Exp $	*/
+/*	$NetBSD: nfs_serv.c,v 1.163 2012/02/01 02:27:24 matt Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -55,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.162 2011/11/21 09:07:59 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.163 2012/02/01 02:27:24 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -699,7 +699,8 @@ nfsrv_read(struct nfsrv_descript *nfsd, 
 			KASSERT(npages <= M_EXT_MAXPAGES); /* XXX */
 
 			/* allocate kva for mbuf data */
-			lva = sokvaalloc(npages << PAGE_SHIFT, slp->ns_so);
+			lva = sokvaalloc(pgoff, npages << PAGE_SHIFT,
+			    slp->ns_so);
 			if (lva == 0) {
 				/* fall back to VOP_READ */
 				goto loan_fail;

Index: src/sys/sys/socketvar.h
diff -u src/sys/sys/socketvar.h:1.128 src/sys/sys/socketvar.h:1.129
--- src/sys/sys/socketvar.h:1.128	Wed Dec 21 19:27:47 2011
+++ src/sys/sys/socketvar.h	Wed Feb  1 02:27:23 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: socketvar.h,v 1.128 2011/12/21 19:27:47 christos Exp $	*/
+/*	$NetBSD: socketvar.h,v 1.129 2012/02/01 02:27:23 matt Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -508,7 +508,7 @@ void	sblastmbufchk(struct sockbuf *, con
 #endif /* SOCKBUF_DEBUG */
 
 /* sosend loan */
-vaddr_t	sokvaalloc(vsize_t, struct socket *);
+vaddr_t	sokvaalloc(vaddr_t, vsize_t, struct socket *);
 void	sokvafree(vaddr_t, vsize_t);
 void	soloanfree(struct mbuf *, void *, size_t, void *);
 

Reply via email to