Module Name:    src
Committed By:   uebayasi
Date:           Wed Apr 28 13:28:43 UTC 2010

Modified Files:
        src/sys/uvm [uebayasi-xip]: uvm_extern.h uvm_page.c

Log Message:
Initial support of uvm_page_physunload(9) and uvm_page_physunload_device(9).
Note that callers of these functions are responsible to ensure that the
segment is not used.


To generate a diff of this commit:
cvs rdiff -u -r1.161.2.3 -r1.161.2.4 src/sys/uvm/uvm_extern.h
cvs rdiff -u -r1.153.2.28 -r1.153.2.29 src/sys/uvm/uvm_page.c

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

Modified files:

Index: src/sys/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.161.2.3 src/sys/uvm/uvm_extern.h:1.161.2.4
--- src/sys/uvm/uvm_extern.h:1.161.2.3	Wed Apr 28 08:22:04 2010
+++ src/sys/uvm/uvm_extern.h	Wed Apr 28 13:28:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_extern.h,v 1.161.2.3 2010/04/28 08:22:04 uebayasi Exp $	*/
+/*	$NetBSD: uvm_extern.h,v 1.161.2.4 2010/04/28 13:28:42 uebayasi Exp $	*/
 
 /*
  *
@@ -722,8 +722,10 @@
 /* Actually, uvm_page_physload takes PF#s which need their own type */
 void			*uvm_page_physload(paddr_t, paddr_t,
 			    paddr_t, paddr_t, int);
+void			uvm_page_physunload(void *);
 void			*uvm_page_physload_device(paddr_t, paddr_t,
 			    paddr_t, paddr_t, int);
+void			uvm_page_physunload_device(void *);
 void			uvm_setpagesize(void);
 
 /* uvm_pager.c */

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.153.2.28 src/sys/uvm/uvm_page.c:1.153.2.29
--- src/sys/uvm/uvm_page.c:1.153.2.28	Wed Apr 28 09:27:47 2010
+++ src/sys/uvm/uvm_page.c	Wed Apr 28 13:28:43 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.153.2.28 2010/04/28 09:27:47 uebayasi Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.153.2.29 2010/04/28 13:28:43 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.28 2010/04/28 09:27:47 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.29 2010/04/28 13:28:43 uebayasi Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -176,10 +176,8 @@
 static void uvm_pageremove(struct uvm_object *, struct vm_page *);
 #ifdef DEVICE_PAGE
 static void vm_page_device_mdpage_insert(paddr_t);
-#if 0
 static void vm_page_device_mdpage_remove(paddr_t);
 #endif
-#endif
 
 /*
  * per-object tree of pages
@@ -761,15 +759,17 @@
 static struct vm_physseg *
 uvm_page_physload_common(struct vm_physseg_freelist * const, struct vm_physseg **, int,
     const paddr_t, const paddr_t, const paddr_t, const paddr_t, const int);
-#if 0
 static void
-uvm_page_physunload_common(struct vm_physseg * const);
-#endif
+uvm_page_physunload_common(struct vm_physseg_freelist *,
+    struct vm_physseg **, struct vm_physseg *);
 static void
 uvm_page_physseg_init(void);
 static struct vm_physseg *
 uvm_physseg_insert(struct vm_physseg_freelist *, struct vm_physseg **, int,
     const paddr_t, const paddr_t);
+static void
+uvm_physseg_remove(struct vm_physseg_freelist *, struct vm_physseg **,
+    struct vm_physseg *);
 
 void *
 uvm_page_physload(paddr_t start, paddr_t end, paddr_t avail_start,
@@ -803,6 +803,19 @@
 	return seg;
 }
 
+void
+uvm_page_physunload(void *cookie)
+{
+	struct vm_physseg *seg = cookie;
+
+	panic("memory unload is not supported yet");
+
+	/* XXX */
+
+	uvm_page_physunload_common(&vm_physmem_freelist, vm_physmem_ptrs, seg);
+	vm_nphysmem--;
+}
+
 #ifdef DEVICE_PAGE
 void *
 uvm_page_physload_device(paddr_t start, paddr_t end, paddr_t avail_start,
@@ -819,6 +832,17 @@
 	vm_nphysdev++;
 	return seg;
 }
+
+void
+uvm_page_physunload_device(void *cookie)
+{
+	struct vm_physseg *seg = cookie;
+
+	for (paddr_t pf = seg->start; pf < seg->end; pf++)
+		vm_page_device_mdpage_remove(pf);
+	uvm_page_physunload_common(&vm_physdev_freelist, vm_physdev_ptrs, seg);
+	vm_nphysdev--;
+}
 #endif
 
 static struct vm_physseg *
@@ -857,6 +881,14 @@
 	return ps;
 }
 
+void
+uvm_page_physunload_common(struct vm_physseg_freelist *freelist,
+    struct vm_physseg **segs, struct vm_physseg *seg)
+{
+
+	uvm_physseg_remove(freelist, segs, seg);
+}
+
 static void
 uvm_page_physseg_init(void)
 {
@@ -917,6 +949,24 @@
 	return ps;
 }
 
+static void
+uvm_physseg_remove(struct vm_physseg_freelist *freelist, struct vm_physseg **segs,
+    struct vm_physseg *seg)
+{
+	struct vm_physseg **segp;
+
+	for (segp = segs; segp < segs + VM_PHYSSEG_MAX; segp++)
+		if (*segp == seg)
+			break;
+	if (segp == segs + VM_PHYSSEG_MAX)
+		panic("unknown segment: %p", seg);
+	SIMPLEQ_INSERT_TAIL(freelist, seg, list);
+	while (segp < segs + VM_PHYSSEG_MAX) {
+		*segp = *(segp + 1);
+		segp++;
+	}
+}
+
 /*
  * vm_physseg_find: find vm_physseg structure that belongs to a PA
  */
@@ -1248,7 +1298,6 @@
 	mutex_spin_exit(lock);
 }
 
-#if 0
 static void
 vm_page_device_mdpage_remove(paddr_t pf)
 {
@@ -1275,7 +1324,6 @@
 	KASSERT(mde != NULL);
 	kmem_free(mde, sizeof(*mde));
 }
-#endif
 
 static struct vm_page_md *
 vm_page_device_mdpage_lookup(struct vm_page *pg)

Reply via email to