Subject: Re: kern/34771: uobj_wirepages and uobj_unwirepages for UVM
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Mindaugas <unex@linija.org>
List: netbsd-bugs
Date: 10/10/2006 15:30:02
The following reply was made to PR kern/34771; it has been noted by GNATS.

From: Mindaugas <unex@linija.org>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: kern/34771: uobj_wirepages and uobj_unwirepages for UVM
Date: Tue, 10 Oct 2006 18:27:50 +0300

 This is a multi-part message in MIME format.
 
 --Multipart=_Tue__10_Oct_2006_18_27_50_+0300_+d7KEQ1_o7zAbC8V
 Content-Type: text/plain; charset=US-ASCII
 Content-Transfer-Encoding: 7bit
 
 Of course, uvm_object.c goes to src/sys/uvm :)
 
 -- 
 Best regards,
 Mindaugas
 
 --Multipart=_Tue__10_Oct_2006_18_27_50_+0300_+d7KEQ1_o7zAbC8V
 Content-Type: application/octet-stream;
  name="uobj_wiring.patch"
 Content-Disposition: attachment;
  filename="uobj_wiring.patch"
 Content-Transfer-Encoding: quoted-printable
 
 Index: sys/uvm/files.uvm
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 RCS file: /cvsroot/src/sys/uvm/files.uvm,v
 retrieving revision 1.6
 diff -u -r1.6 files.uvm
 --- sys/uvm/files.uvm	30 Sep 2006 15:38:06 -0000	1.6
 +++ sys/uvm/files.uvm	9 Oct 2006 22:19:18 -0000
 @@ -25,6 +25,7 @@
  file	uvm/uvm_meter.c
  file	uvm/uvm_mmap.c
  file	uvm/uvm_mremap.c		compat_linux
 +file	uvm/uvm_object.c
  file	uvm/uvm_page.c
  file	uvm/uvm_pager.c
  file	uvm/uvm_pdaemon.c
 Index: sys/uvm/uvm_extern.h
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 RCS file: /cvsroot/src/sys/uvm/uvm_extern.h,v
 retrieving revision 1.119
 diff -u -r1.119 uvm_extern.h
 --- sys/uvm/uvm_extern.h	5 Oct 2006 14:48:33 -0000	1.119
 +++ sys/uvm/uvm_extern.h	9 Oct 2006 22:19:18 -0000
 @@ -653,6 +653,12 @@
  			    struct proc *, int);
  #define	UVM_MREMAP_FIXED	1
 =20
 +/* uvm_object.c */
 +int			uobj_wirepages(struct uvm_object *uobj, off_t start,
 +			    off_t end);
 +void			uobj_unwirepages(struct uvm_object *uobj, off_t start,
 +			    off_t end);
 +
  /* uvm_page.c */
  struct vm_page		*uvm_pagealloc_strat(struct uvm_object *,
  			    voff_t, struct vm_anon *, int, int, int);
 
 --Multipart=_Tue__10_Oct_2006_18_27_50_+0300_+d7KEQ1_o7zAbC8V
 Content-Type: application/octet-stream;
  name="uvm_object.c"
 Content-Disposition: attachment;
  filename="uvm_object.c"
 Content-Transfer-Encoding: quoted-printable
 
 /*	$NetBSD$	*/
 
 /*
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software
  *    must display the following acknowledgement:
  *      This product includes software developed by the NetBSD
  *      Foundation, Inc. and its contributors.
  * 4. Neither the name of The NetBSD Foundation nor the names of its
  *    contributors may be used to endorse or promote products derived
  *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMI=
 TED
  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICUL=
 AR
  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF T=
 HE
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
 /*
  * uvm_object.c: operate with memory objects
  *
  * TODO:
  *  1. Support PG_RELEASED-using objects
  *
  */
 
 #include <sys/cdefs.h>
 __KERNEL_RCSID(0, "$NetBSD$");
 
 #include "opt_uvmhist.h"
 
 #include <sys/param.h>
 #include <sys/lock.h>
 
 #include <uvm/uvm.h>
 
 /* We will fetch this page count per step */
 #define	FETCH_PAGECOUNT	16
 
 /*
  * uobj_wirepages: wire the pages of entire uobj
  *
  * =3D> NOTE: this function should only be used for types of objects
  *  where PG_RELEASED flag is never set (aobj objects)
  * =3D> caller must pass page-aligned start and end values
  */
 
 int
 uobj_wirepages(struct uvm_object *uobj, off_t start, off_t end)
 {
 	int i, npages, error;
 	struct vm_page *pgs[FETCH_PAGECOUNT], *pg =3D NULL;
 	off_t offset =3D start, left;
 
 	left =3D (end - start) >> PAGE_SHIFT;
 
 	simple_lock(&uobj->vmobjlock);
 	while (left) {
 
 		npages =3D MIN(FETCH_PAGECOUNT, left);
 
 		/* Get the pages */
 		memset(pgs, 0, sizeof(pgs));
 		error =3D (*uobj->pgops->pgo_get)(uobj, offset, pgs, &npages, 0,
 			VM_PROT_READ | VM_PROT_WRITE, UVM_ADV_SEQUENTIAL,
 			PGO_ALLPAGES | PGO_SYNCIO);
 
 		if (error)
 			goto error;
 
 		simple_lock(&uobj->vmobjlock);
 		for (i =3D 0; i < npages; i++) {
 
 			KASSERT(pgs[i] !=3D NULL);
 			KASSERT(!(pgs[i]->flags & PG_RELEASED));
 
 			/*
 			 * Loan break
 			 */
 			if (pgs[i]->loan_count) {
 				while (pgs[i]->loan_count) {
 					pg =3D uvm_loanbreak(pgs[i]);
 					if (!pg) {
 						simple_unlock(&uobj->vmobjlock);
 						uvm_wait("uobjwirepg");
 						simple_lock(&uobj->vmobjlock);
 						continue;
 					}
 				}
 				pgs[i] =3D pg;
 			}
 
 			if (pgs[i]->pqflags & PQ_AOBJ) {
 				pgs[i]->flags &=3D ~(PG_CLEAN);
 				uao_dropswap(uobj, i);
 			}
 		}
 
 		/* Wire the pages */
 		uvm_lock_pageq();
 		for (i =3D 0; i < npages; i++) {
 			uvm_pagewire(pgs[i]);
 		}
 		uvm_unlock_pageq();
 
 		/* Unbusy the pages */
 		uvm_page_unbusy(pgs, npages);
 
 		left -=3D npages;
 		offset +=3D npages << PAGE_SHIFT;
 	}
 	simple_unlock(&uobj->vmobjlock);
 
 	return 0;
 
 error:
 	/* Unwire the pages which has been wired */
 	uobj_unwirepages(uobj, start, offset);
 
 	return error;
 }
 
 /*
  * uobj_unwirepages: unwire the pages of entire uobj
  *
  * =3D> NOTE: this function should only be used for types of objects
  *  where PG_RELEASED flag is never set
  * =3D> caller must pass page-aligned start and end values
  */
 
 void
 uobj_unwirepages(struct uvm_object *uobj, off_t start, off_t end)
 {
 	struct vm_page *pg;
 	off_t offset;
 
 	simple_lock(&uobj->vmobjlock);
 	uvm_lock_pageq();
 	for (offset =3D start; offset < end; offset +=3D PAGE_SIZE) {
 		pg =3D uvm_pagelookup(uobj, offset);
 
 		KASSERT(pg !=3D NULL);
 		KASSERT(!(pg->flags & PG_RELEASED));
 
 		uvm_pageunwire(pg);
 	}
 	uvm_unlock_pageq();
 	simple_unlock(&uobj->vmobjlock);
 }
 
 
 --Multipart=_Tue__10_Oct_2006_18_27_50_+0300_+d7KEQ1_o7zAbC8V--