summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-04-23 21:09:47 +0000
committerkib <kib@FreeBSD.org>2009-04-23 21:09:47 +0000
commit504b87e7108e072ec7147d89bb34be81be38c7ce (patch)
tree64ea30be29c20daccd8419a2b7c6f56b10d96895 /sys/vm
parent3ca2800ae4db8531b31eb052801d061025449202 (diff)
downloadFreeBSD-src-504b87e7108e072ec7147d89bb34be81be38c7ce.zip
FreeBSD-src-504b87e7108e072ec7147d89bb34be81be38c7ce.tar.gz
Do not call vm_page_lookup() from the ddb routine, namely from "show
vmopag" implementation. The vm_page_lookup() code modifies splay tree of the object pages, and asserts that object lock is taken. First issue could cause kernel data corruption, and second one instantly panics the INVARIANTS-enabled kernel. Take the advantage of the fact that object->memq is ordered by page index, and iterate over memq to calculate the runs. While there, make the code slightly more style-compliant by moving variables declarations to the right place. Discussed with: jhb, alc Reviewed by: alc MFC after: 2 weeks
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_object.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 2e7a7c3..34332f6 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -2196,16 +2196,13 @@ vm_object_print(
DB_SHOW_COMMAND(vmopag, vm_object_print_pages)
{
vm_object_t object;
- int nl = 0;
- int c;
+ vm_pindex_t fidx;
+ vm_paddr_t pa;
+ vm_page_t m, prev_m;
+ int rcount, nl, c;
+ nl = 0;
TAILQ_FOREACH(object, &vm_object_list, object_list) {
- vm_pindex_t idx, fidx;
- vm_pindex_t osize;
- vm_paddr_t pa = -1;
- int rcount;
- vm_page_t m;
-
db_printf("new object: %p\n", (void *)object);
if (nl > 18) {
c = cngetc();
@@ -2216,12 +2213,12 @@ DB_SHOW_COMMAND(vmopag, vm_object_print_pages)
nl++;
rcount = 0;
fidx = 0;
- osize = object->size;
- if (osize > 128)
- osize = 128;
- for (idx = 0; idx < osize; idx++) {
- m = vm_page_lookup(object, idx);
- if (m == NULL) {
+ pa = -1;
+ TAILQ_FOREACH(m, &object->memq, listq) {
+ if (m->pindex > 128)
+ break;
+ if ((prev_m = TAILQ_PREV(m, pglist, listq)) != NULL &&
+ prev_m->pindex + 1 != m->pindex) {
if (rcount) {
db_printf(" index(%ld)run(%d)pa(0x%lx)\n",
(long)fidx, rcount, (long)pa);
@@ -2234,10 +2231,7 @@ DB_SHOW_COMMAND(vmopag, vm_object_print_pages)
nl++;
rcount = 0;
}
- continue;
- }
-
-
+ }
if (rcount &&
(VM_PAGE_TO_PHYS(m) == pa + rcount * PAGE_SIZE)) {
++rcount;
@@ -2254,7 +2248,7 @@ DB_SHOW_COMMAND(vmopag, vm_object_print_pages)
}
nl++;
}
- fidx = idx;
+ fidx = m->pindex;
pa = VM_PAGE_TO_PHYS(m);
rcount = 1;
}
OpenPOWER on IntegriCloud