Sat Aug 27 09:11:53 2011 UTC ()
Add an optional pglist argument to uvm_obj_wirepages, to be
filled with the list of pages that were wired.
(christos)
diff -r1.121 -r1.122 src/sys/kern/sysv_shm.c
diff -r1.174 -r1.175 src/sys/uvm/uvm_extern.h
diff -r1.10 -r1.11 src/sys/uvm/uvm_object.c
--- src/sys/kern/sysv_shm.c 2011/07/30 06:19:02 1.121
+++ src/sys/kern/sysv_shm.c 2011/08/27 09:11:52 1.122
@@ -1,4 +1,4 @@
-/* $NetBSD: sysv_shm.c,v 1.121 2011/07/30 06:19:02 uebayasi Exp $ */
+/* $NetBSD: sysv_shm.c,v 1.122 2011/08/27 09:11:52 christos Exp $ */
/*-
* Copyright (c) 1999, 2007 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.121 2011/07/30 06:19:02 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.122 2011/08/27 09:11:52 christos Exp $");
#define SYSVSHM
@@ -268,7 +268,7 @@
(shmseg->shm_perm.mode & SHMSEG_WIRED) == 0) {
/* Wire the object and map, then tag it */
error = uvm_obj_wirepages(shmseg->_shm_internal,
- 0, size);
+ 0, size, NULL);
if (error)
return EIO;
error = uvm_map_pageable(&p->p_vmspace->vm_map,
@@ -734,7 +734,7 @@
shmseg->_shm_internal = uao_create(size, 0);
if (lockmem) {
/* Wire the pages and tag it */
- error = uvm_obj_wirepages(shmseg->_shm_internal, 0, size);
+ error = uvm_obj_wirepages(shmseg->_shm_internal, 0, size, NULL);
if (error) {
uao_detach(shmseg->_shm_internal);
mutex_enter(&shm_lock);
--- src/sys/uvm/uvm_extern.h 2011/06/16 09:21:03 1.174
+++ src/sys/uvm/uvm_extern.h 2011/08/27 09:11:53 1.175
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_extern.h,v 1.174 2011/06/16 09:21:03 hannken Exp $ */
+/* $NetBSD: uvm_extern.h,v 1.175 2011/08/27 09:11:53 christos Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -706,7 +706,8 @@
const struct uvm_pagerops *, bool, u_int);
void uvm_obj_setlock(struct uvm_object *, kmutex_t *);
void uvm_obj_destroy(struct uvm_object *, bool);
-int uvm_obj_wirepages(struct uvm_object *, off_t, off_t);
+int uvm_obj_wirepages(struct uvm_object *, off_t, off_t,
+ struct pglist *);
void uvm_obj_unwirepages(struct uvm_object *, off_t, off_t);
/* uvm_page.c */
--- src/sys/uvm/uvm_object.c 2011/06/18 21:14:43 1.10
+++ src/sys/uvm/uvm_object.c 2011/08/27 09:11:53 1.11
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_object.c,v 1.10 2011/06/18 21:14:43 rmind Exp $ */
+/* $NetBSD: uvm_object.c,v 1.11 2011/08/27 09:11:53 christos Exp $ */
/*
* Copyright (c) 2006, 2010 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_object.c,v 1.10 2011/06/18 21:14:43 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_object.c,v 1.11 2011/08/27 09:11:53 christos Exp $");
#include "opt_ddb.h"
@@ -123,7 +123,8 @@
* => caller must pass page-aligned start and end values
*/
int
-uvm_obj_wirepages(struct uvm_object *uobj, off_t start, off_t end)
+uvm_obj_wirepages(struct uvm_object *uobj, off_t start, off_t end,
+ struct pglist *list)
{
int i, npages, error;
struct vm_page *pgs[FETCH_PAGECOUNT], *pg = NULL;
@@ -177,6 +178,8 @@
mutex_enter(&uvm_pageqlock);
for (i = 0; i < npages; i++) {
uvm_pagewire(pgs[i]);
+ if (list != NULL)
+ TAILQ_INSERT_TAIL(list, pgs[i], pageq.queue);
}
mutex_exit(&uvm_pageqlock);