vm_object.c (15367) | vm_object.c (15809) |
---|---|
1/* 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * The Mach Operating System project at Carnegie-Mellon University. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 47 unchanged lines hidden (view full) --- 56 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 57 * School of Computer Science 58 * Carnegie Mellon University 59 * Pittsburgh PA 15213-3890 60 * 61 * any improvements or extensions that they make and grant Carnegie the 62 * rights to redistribute these changes. 63 * | 1/* 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * The Mach Operating System project at Carnegie-Mellon University. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 47 unchanged lines hidden (view full) --- 56 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 57 * School of Computer Science 58 * Carnegie Mellon University 59 * Pittsburgh PA 15213-3890 60 * 61 * any improvements or extensions that they make and grant Carnegie the 62 * rights to redistribute these changes. 63 * |
64 * $Id: vm_object.c,v 1.67 1996/03/29 06:28:48 davidg Exp $ | 64 * $Id: vm_object.c,v 1.68 1996/04/24 04:16:45 dyson Exp $ |
65 */ 66 67/* 68 * Virtual memory object module. 69 */ 70#include "opt_ddb.h" 71 72#include <sys/param.h> --- 200 unchanged lines hidden (view full) --- 273 */ 274 object->ref_count--; 275 if (object->ref_count != 0) { 276 if ((object->ref_count == 1) && 277 (object->handle == NULL) && 278 (object->type == OBJT_DEFAULT || 279 object->type == OBJT_SWAP)) { 280 vm_object_t robject; | 65 */ 66 67/* 68 * Virtual memory object module. 69 */ 70#include "opt_ddb.h" 71 72#include <sys/param.h> --- 200 unchanged lines hidden (view full) --- 273 */ 274 object->ref_count--; 275 if (object->ref_count != 0) { 276 if ((object->ref_count == 1) && 277 (object->handle == NULL) && 278 (object->type == OBJT_DEFAULT || 279 object->type == OBJT_SWAP)) { 280 vm_object_t robject; |
281 robject = object->shadow_head.tqh_first; | 281 robject = TAILQ_FIRST(&object->shadow_head); |
282 if ((robject != NULL) && 283 (robject->handle == NULL) && 284 (robject->type == OBJT_DEFAULT || 285 robject->type == OBJT_SWAP)) { 286 int s; 287 robject->ref_count += 2; 288 object->ref_count += 2; 289 290 do { | 282 if ((robject != NULL) && 283 (robject->handle == NULL) && 284 (robject->type == OBJT_DEFAULT || 285 robject->type == OBJT_SWAP)) { 286 int s; 287 robject->ref_count += 2; 288 object->ref_count += 2; 289 290 do { |
291 s = splhigh(); | 291 s = splvm(); |
292 while (robject->paging_in_progress) { 293 robject->flags |= OBJ_PIPWNT; 294 tsleep(robject, PVM, "objde1", 0); 295 } 296 297 while (object->paging_in_progress) { 298 object->flags |= OBJ_PIPWNT; 299 tsleep(object, PVM, "objde2", 0); --- 70 unchanged lines hidden (view full) --- 370 register vm_object_t object; 371{ 372 register vm_page_t p; 373 int s; 374 375 /* 376 * wait for the pageout daemon to be done with the object 377 */ | 292 while (robject->paging_in_progress) { 293 robject->flags |= OBJ_PIPWNT; 294 tsleep(robject, PVM, "objde1", 0); 295 } 296 297 while (object->paging_in_progress) { 298 object->flags |= OBJ_PIPWNT; 299 tsleep(object, PVM, "objde2", 0); --- 70 unchanged lines hidden (view full) --- 370 register vm_object_t object; 371{ 372 register vm_page_t p; 373 int s; 374 375 /* 376 * wait for the pageout daemon to be done with the object 377 */ |
378 s = splhigh(); | 378 s = splvm(); |
379 while (object->paging_in_progress) { 380 object->flags |= OBJ_PIPWNT; 381 tsleep(object, PVM, "objtrm", 0); 382 } 383 splx(s); 384 385 if (object->paging_in_progress != 0) 386 panic("vm_object_deallocate: pageout in progress"); --- 10 unchanged lines hidden (view full) --- 397 vinvalbuf(vp, V_SAVE, NOCRED, NULL, 0, 0); 398 VOP_UNLOCK(vp); 399 } 400 401 /* 402 * Now free the pages. For internal objects, this also removes them 403 * from paging queues. 404 */ | 379 while (object->paging_in_progress) { 380 object->flags |= OBJ_PIPWNT; 381 tsleep(object, PVM, "objtrm", 0); 382 } 383 splx(s); 384 385 if (object->paging_in_progress != 0) 386 panic("vm_object_deallocate: pageout in progress"); --- 10 unchanged lines hidden (view full) --- 397 vinvalbuf(vp, V_SAVE, NOCRED, NULL, 0, 0); 398 VOP_UNLOCK(vp); 399 } 400 401 /* 402 * Now free the pages. For internal objects, this also removes them 403 * from paging queues. 404 */ |
405 while ((p = object->memq.tqh_first) != NULL) { | 405 while ((p = TAILQ_FIRST(&object->memq)) != NULL) { |
406 if (p->flags & PG_BUSY) 407 printf("vm_object_terminate: freeing busy page\n"); | 406 if (p->flags & PG_BUSY) 407 printf("vm_object_terminate: freeing busy page\n"); |
408 vm_page_protect(p, VM_PROT_NONE); |
|
408 PAGE_WAKEUP(p); 409 vm_page_free(p); 410 cnt.v_pfree++; 411 } 412 413 /* 414 * Let the pager know object is dead. 415 */ --- 57 unchanged lines hidden (view full) --- 473 if (end == 0) { 474 tend = object->size; 475 } else { 476 tend = end; 477 } 478 if ((tstart == 0) && (tend == object->size)) { 479 object->flags &= ~(OBJ_WRITEABLE|OBJ_MIGHTBEDIRTY); 480 } | 409 PAGE_WAKEUP(p); 410 vm_page_free(p); 411 cnt.v_pfree++; 412 } 413 414 /* 415 * Let the pager know object is dead. 416 */ --- 57 unchanged lines hidden (view full) --- 474 if (end == 0) { 475 tend = object->size; 476 } else { 477 tend = end; 478 } 479 if ((tstart == 0) && (tend == object->size)) { 480 object->flags &= ~(OBJ_WRITEABLE|OBJ_MIGHTBEDIRTY); 481 } |
481 for(p = object->memq.tqh_first; p; p = p->listq.tqe_next) | 482 for(p = TAILQ_FIRST(&object->memq); p; p = TAILQ_NEXT(p, listq)) |
482 p->flags |= PG_CLEANCHK; 483 484rescan: | 483 p->flags |= PG_CLEANCHK; 484 485rescan: |
485 for(p = object->memq.tqh_first; p; p = np) { 486 np = p->listq.tqe_next; | 486 for(p = TAILQ_FIRST(&object->memq); p; p = np) { 487 np = TAILQ_NEXT(p, listq); |
487 488 pi = p->pindex; 489 if (((p->flags & PG_CLEANCHK) == 0) || 490 (pi < tstart) || (pi >= tend) || 491 (p->valid == 0) || (p->queue == PQ_CACHE)) { 492 p->flags &= ~PG_CLEANCHK; 493 continue; 494 } 495 496 vm_page_test_dirty(p); 497 if ((p->dirty & p->valid) == 0) { 498 p->flags &= ~PG_CLEANCHK; 499 continue; 500 } 501 | 488 489 pi = p->pindex; 490 if (((p->flags & PG_CLEANCHK) == 0) || 491 (pi < tstart) || (pi >= tend) || 492 (p->valid == 0) || (p->queue == PQ_CACHE)) { 493 p->flags &= ~PG_CLEANCHK; 494 continue; 495 } 496 497 vm_page_test_dirty(p); 498 if ((p->dirty & p->valid) == 0) { 499 p->flags &= ~PG_CLEANCHK; 500 continue; 501 } 502 |
502 s = splhigh(); | 503 s = splvm(); |
503 if ((p->flags & PG_BUSY) || p->busy) { 504 p->flags |= PG_WANTED|PG_REFERENCED; 505 tsleep(p, PVM, "vpcwai", 0); 506 splx(s); 507 goto rescan; 508 } 509 splx(s); 510 --- 81 unchanged lines hidden (view full) --- 592 * The object must be locked. 593 */ 594static void 595vm_object_deactivate_pages(object) 596 register vm_object_t object; 597{ 598 register vm_page_t p, next; 599 | 504 if ((p->flags & PG_BUSY) || p->busy) { 505 p->flags |= PG_WANTED|PG_REFERENCED; 506 tsleep(p, PVM, "vpcwai", 0); 507 splx(s); 508 goto rescan; 509 } 510 splx(s); 511 --- 81 unchanged lines hidden (view full) --- 593 * The object must be locked. 594 */ 595static void 596vm_object_deactivate_pages(object) 597 register vm_object_t object; 598{ 599 register vm_page_t p, next; 600 |
600 for (p = object->memq.tqh_first; p != NULL; p = next) { 601 next = p->listq.tqe_next; | 601 for (p = TAILQ_FIRST(&object->memq); p != NULL; p = next) { 602 next = TAILQ_NEXT(p, listq); |
602 vm_page_deactivate(p); 603 } 604} 605#endif 606 607/* 608 * Trim the object cache to size. 609 */ 610static void 611vm_object_cache_trim() 612{ 613 register vm_object_t object; 614 615 while (vm_object_cached > vm_object_cache_max) { | 603 vm_page_deactivate(p); 604 } 605} 606#endif 607 608/* 609 * Trim the object cache to size. 610 */ 611static void 612vm_object_cache_trim() 613{ 614 register vm_object_t object; 615 616 while (vm_object_cached > vm_object_cache_max) { |
616 object = vm_object_cached_list.tqh_first; | 617 object = TAILQ_FIRST(&vm_object_cached_list); |
617 618 vm_object_reference(object); 619 pager_cache(object, FALSE); 620 } 621} 622 623 624/* --- 11 unchanged lines hidden (view full) --- 636 register vm_pindex_t start; 637 register vm_pindex_t end; 638{ 639 register vm_page_t p; 640 641 if (object == NULL || (object->flags & OBJ_WRITEABLE) == 0) 642 return; 643 | 618 619 vm_object_reference(object); 620 pager_cache(object, FALSE); 621 } 622} 623 624 625/* --- 11 unchanged lines hidden (view full) --- 637 register vm_pindex_t start; 638 register vm_pindex_t end; 639{ 640 register vm_page_t p; 641 642 if (object == NULL || (object->flags & OBJ_WRITEABLE) == 0) 643 return; 644 |
644 for (p = object->memq.tqh_first; p != NULL; p = p->listq.tqe_next) { | 645 for (p = TAILQ_FIRST(&object->memq); p != NULL; p = TAILQ_NEXT(p, listq)) { |
645 vm_page_protect(p, VM_PROT_READ); 646 } 647 648 object->flags &= ~OBJ_WRITEABLE; 649} 650 651/* 652 * vm_object_pmap_remove: --- 7 unchanged lines hidden (view full) --- 660vm_object_pmap_remove(object, start, end) 661 register vm_object_t object; 662 register vm_pindex_t start; 663 register vm_pindex_t end; 664{ 665 register vm_page_t p; 666 if (object == NULL) 667 return; | 646 vm_page_protect(p, VM_PROT_READ); 647 } 648 649 object->flags &= ~OBJ_WRITEABLE; 650} 651 652/* 653 * vm_object_pmap_remove: --- 7 unchanged lines hidden (view full) --- 661vm_object_pmap_remove(object, start, end) 662 register vm_object_t object; 663 register vm_pindex_t start; 664 register vm_pindex_t end; 665{ 666 register vm_page_t p; 667 if (object == NULL) 668 return; |
668 for (p = object->memq.tqh_first; p != NULL; p = p->listq.tqe_next) { | 669 for (p = TAILQ_FIRST(&object->memq); p != NULL; p = TAILQ_NEXT(p, listq)) { |
669 if (p->pindex >= start && p->pindex < end) 670 vm_page_protect(p, VM_PROT_NONE); 671 } 672} 673 674/* 675 * vm_object_copy: 676 * --- 126 unchanged lines hidden (view full) --- 803 return; 804 805 backing_object->ref_count += 2; 806 807 backing_offset_index = OFF_TO_IDX(object->backing_object_offset); 808 backing_object_paging_offset_index = OFF_TO_IDX(backing_object->paging_offset); 809 paging_offset_index = OFF_TO_IDX(object->paging_offset); 810 size = object->size; | 670 if (p->pindex >= start && p->pindex < end) 671 vm_page_protect(p, VM_PROT_NONE); 672 } 673} 674 675/* 676 * vm_object_copy: 677 * --- 126 unchanged lines hidden (view full) --- 804 return; 805 806 backing_object->ref_count += 2; 807 808 backing_offset_index = OFF_TO_IDX(object->backing_object_offset); 809 backing_object_paging_offset_index = OFF_TO_IDX(backing_object->paging_offset); 810 paging_offset_index = OFF_TO_IDX(object->paging_offset); 811 size = object->size; |
811 p = backing_object->memq.tqh_first; | 812 p = TAILQ_FIRST(&backing_object->memq); |
812 while (p) { 813 vm_page_t next; 814 | 813 while (p) { 814 vm_page_t next; 815 |
815 next = p->listq.tqe_next; | 816 next = TAILQ_NEXT(p, listq); |
816 if ((p->flags & (PG_BUSY | PG_FICTITIOUS)) || 817 (p->queue == PQ_CACHE) || !p->valid || p->hold_count || p->wire_count || p->busy) { 818 p = next; 819 continue; 820 } | 817 if ((p->flags & (PG_BUSY | PG_FICTITIOUS)) || 818 (p->queue == PQ_CACHE) || !p->valid || p->hold_count || p->wire_count || p->busy) { 819 p = next; 820 continue; 821 } |
821 vm_page_protect(p, VM_PROT_NONE); | |
822 new_pindex = p->pindex - backing_offset_index; 823 if (p->pindex < backing_offset_index || 824 new_pindex >= size) { 825 if (backing_object->type == OBJT_SWAP) 826 swap_pager_freespace(backing_object, 827 backing_object_paging_offset_index+p->pindex, 828 1); | 822 new_pindex = p->pindex - backing_offset_index; 823 if (p->pindex < backing_offset_index || 824 new_pindex >= size) { 825 if (backing_object->type == OBJT_SWAP) 826 swap_pager_freespace(backing_object, 827 backing_object_paging_offset_index+p->pindex, 828 1); |
829 vm_page_protect(p, VM_PROT_NONE); |
|
829 vm_page_free(p); 830 } else { 831 pp = vm_page_lookup(object, new_pindex); 832 if (pp != NULL || (object->type == OBJT_SWAP && vm_pager_has_page(object, 833 paging_offset_index + new_pindex, NULL, NULL))) { 834 if (backing_object->type == OBJT_SWAP) 835 swap_pager_freespace(backing_object, 836 backing_object_paging_offset_index + p->pindex, 1); | 830 vm_page_free(p); 831 } else { 832 pp = vm_page_lookup(object, new_pindex); 833 if (pp != NULL || (object->type == OBJT_SWAP && vm_pager_has_page(object, 834 paging_offset_index + new_pindex, NULL, NULL))) { 835 if (backing_object->type == OBJT_SWAP) 836 swap_pager_freespace(backing_object, 837 backing_object_paging_offset_index + p->pindex, 1); |
838 vm_page_protect(p, VM_PROT_NONE); |
|
837 vm_page_free(p); 838 } else { 839 if (backing_object->type == OBJT_SWAP) 840 swap_pager_freespace(backing_object, 841 backing_object_paging_offset_index + p->pindex, 1); 842 vm_page_rename(p, object, new_pindex); 843 p->dirty = VM_PAGE_BITS_ALL; 844 } --- 80 unchanged lines hidden (view full) --- 925 * We can collapse the backing object. 926 * 927 * Move all in-memory pages from backing_object to the 928 * parent. Pages that have been paged out will be 929 * overwritten by any of the parent's pages that 930 * shadow them. 931 */ 932 | 839 vm_page_free(p); 840 } else { 841 if (backing_object->type == OBJT_SWAP) 842 swap_pager_freespace(backing_object, 843 backing_object_paging_offset_index + p->pindex, 1); 844 vm_page_rename(p, object, new_pindex); 845 p->dirty = VM_PAGE_BITS_ALL; 846 } --- 80 unchanged lines hidden (view full) --- 927 * We can collapse the backing object. 928 * 929 * Move all in-memory pages from backing_object to the 930 * parent. Pages that have been paged out will be 931 * overwritten by any of the parent's pages that 932 * shadow them. 933 */ 934 |
933 while ((p = backing_object->memq.tqh_first) != 0) { | 935 while ((p = TAILQ_FIRST(&backing_object->memq)) != 0) { |
934 935 new_pindex = p->pindex - backing_offset_index; 936 937 /* 938 * If the parent has a page here, or if this 939 * page falls outside the parent, dispose of 940 * it. 941 * --- 124 unchanged lines hidden (view full) --- 1066 if (backing_object->type != OBJT_DEFAULT) { 1067 return; 1068 } 1069 /* 1070 * Should have a check for a 'small' number of pages 1071 * here. 1072 */ 1073 | 936 937 new_pindex = p->pindex - backing_offset_index; 938 939 /* 940 * If the parent has a page here, or if this 941 * page falls outside the parent, dispose of 942 * it. 943 * --- 124 unchanged lines hidden (view full) --- 1068 if (backing_object->type != OBJT_DEFAULT) { 1069 return; 1070 } 1071 /* 1072 * Should have a check for a 'small' number of pages 1073 * here. 1074 */ 1075 |
1074 for (p = backing_object->memq.tqh_first; p; p = p->listq.tqe_next) { | 1076 for (p = TAILQ_FIRST(&backing_object->memq); p; p = TAILQ_NEXT(p, listq)) { |
1075 new_pindex = p->pindex - backing_offset_index; 1076 1077 /* 1078 * If the parent has a page here, or if this 1079 * page falls outside the parent, keep going. 1080 * 1081 * Otherwise, the backing_object must be left in 1082 * the chain. --- 72 unchanged lines hidden (view full) --- 1155 1156 if (object == NULL) 1157 return; 1158 1159 object->paging_in_progress++; 1160again: 1161 size = end - start; 1162 if (size > 4 || size >= object->size / 4) { | 1077 new_pindex = p->pindex - backing_offset_index; 1078 1079 /* 1080 * If the parent has a page here, or if this 1081 * page falls outside the parent, keep going. 1082 * 1083 * Otherwise, the backing_object must be left in 1084 * the chain. --- 72 unchanged lines hidden (view full) --- 1157 1158 if (object == NULL) 1159 return; 1160 1161 object->paging_in_progress++; 1162again: 1163 size = end - start; 1164 if (size > 4 || size >= object->size / 4) { |
1163 for (p = object->memq.tqh_first; p != NULL; p = next) { 1164 next = p->listq.tqe_next; | 1165 for (p = TAILQ_FIRST(&object->memq); p != NULL; p = next) { 1166 next = TAILQ_NEXT(p, listq); |
1165 if ((start <= p->pindex) && (p->pindex < end)) { | 1167 if ((start <= p->pindex) && (p->pindex < end)) { |
1166 | |
1167 if (p->wire_count != 0) { 1168 vm_page_protect(p, VM_PROT_NONE); 1169 p->valid = 0; 1170 continue; 1171 } 1172 | 1168 if (p->wire_count != 0) { 1169 vm_page_protect(p, VM_PROT_NONE); 1170 p->valid = 0; 1171 continue; 1172 } 1173 |
1173 s = splhigh(); | 1174 /* 1175 * The busy flags are only cleared at 1176 * interrupt -- minimize the spl transitions 1177 */ |
1174 if ((p->flags & PG_BUSY) || p->busy) { | 1178 if ((p->flags & PG_BUSY) || p->busy) { |
1175 p->flags |= PG_WANTED; 1176 tsleep(p, PVM, "vmopar", 0); | 1179 s = splvm(); 1180 if ((p->flags & PG_BUSY) || p->busy) { 1181 p->flags |= PG_WANTED; 1182 tsleep(p, PVM, "vmopar", 0); 1183 splx(s); 1184 goto again; 1185 } |
1177 splx(s); | 1186 splx(s); |
1178 goto again; | |
1179 } | 1187 } |
1180 splx(s); | |
1181 1182 if (clean_only) { 1183 vm_page_test_dirty(p); 1184 if (p->valid & p->dirty) 1185 continue; 1186 } 1187 vm_page_protect(p, VM_PROT_NONE); 1188 PAGE_WAKEUP(p); --- 5 unchanged lines hidden (view full) --- 1194 if ((p = vm_page_lookup(object, start)) != 0) { 1195 if (p->wire_count != 0) { 1196 p->valid = 0; 1197 vm_page_protect(p, VM_PROT_NONE); 1198 start += 1; 1199 size -= 1; 1200 continue; 1201 } | 1188 1189 if (clean_only) { 1190 vm_page_test_dirty(p); 1191 if (p->valid & p->dirty) 1192 continue; 1193 } 1194 vm_page_protect(p, VM_PROT_NONE); 1195 PAGE_WAKEUP(p); --- 5 unchanged lines hidden (view full) --- 1201 if ((p = vm_page_lookup(object, start)) != 0) { 1202 if (p->wire_count != 0) { 1203 p->valid = 0; 1204 vm_page_protect(p, VM_PROT_NONE); 1205 start += 1; 1206 size -= 1; 1207 continue; 1208 } |
1202 s = splhigh(); | 1209 /* 1210 * The busy flags are only cleared at 1211 * interrupt -- minimize the spl transitions 1212 */ |
1203 if ((p->flags & PG_BUSY) || p->busy) { | 1213 if ((p->flags & PG_BUSY) || p->busy) { |
1204 p->flags |= PG_WANTED; 1205 tsleep(p, PVM, "vmopar", 0); | 1214 s = splvm(); 1215 if ((p->flags & PG_BUSY) || p->busy) { 1216 p->flags |= PG_WANTED; 1217 tsleep(p, PVM, "vmopar", 0); 1218 splx(s); 1219 goto again; 1220 } |
1206 splx(s); | 1221 splx(s); |
1207 goto again; | |
1208 } | 1222 } |
1209 splx(s); | |
1210 if (clean_only) { 1211 vm_page_test_dirty(p); 1212 if (p->valid & p->dirty) { 1213 start += 1; 1214 size -= 1; 1215 continue; 1216 } 1217 } --- 168 unchanged lines hidden (view full) --- 1386DDB_vm_object_check() 1387{ 1388 vm_object_t object; 1389 1390 /* 1391 * make sure that internal objs are in a map somewhere 1392 * and none have zero ref counts. 1393 */ | 1223 if (clean_only) { 1224 vm_page_test_dirty(p); 1225 if (p->valid & p->dirty) { 1226 start += 1; 1227 size -= 1; 1228 continue; 1229 } 1230 } --- 168 unchanged lines hidden (view full) --- 1399DDB_vm_object_check() 1400{ 1401 vm_object_t object; 1402 1403 /* 1404 * make sure that internal objs are in a map somewhere 1405 * and none have zero ref counts. 1406 */ |
1394 for (object = vm_object_list.tqh_first; | 1407 for (object = TAILQ_FIRST(&vm_object_list); |
1395 object != NULL; | 1408 object != NULL; |
1396 object = object->object_list.tqe_next) { | 1409 object = TAILQ_NEXT(object, object_list)) { |
1397 if (object->handle == NULL && 1398 (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) { 1399 if (object->ref_count == 0) { 1400 printf("vmochk: internal obj has zero ref count: %d\n", 1401 object->size); 1402 } 1403 if (!vm_object_in_map(object)) { 1404 printf("vmochk: internal obj is not in a map: " --- 26 unchanged lines hidden (view full) --- 1431 1432 iprintf("Object 0x%x: size=0x%x, res=%d, ref=%d, ", 1433 (int) object, (int) object->size, 1434 object->resident_page_count, object->ref_count); 1435 printf("offset=0x%x, backing_object=(0x%x)+0x%x\n", 1436 (int) object->paging_offset, 1437 (int) object->backing_object, (int) object->backing_object_offset); 1438 printf("cache: next=%p, prev=%p\n", | 1410 if (object->handle == NULL && 1411 (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) { 1412 if (object->ref_count == 0) { 1413 printf("vmochk: internal obj has zero ref count: %d\n", 1414 object->size); 1415 } 1416 if (!vm_object_in_map(object)) { 1417 printf("vmochk: internal obj is not in a map: " --- 26 unchanged lines hidden (view full) --- 1444 1445 iprintf("Object 0x%x: size=0x%x, res=%d, ref=%d, ", 1446 (int) object, (int) object->size, 1447 object->resident_page_count, object->ref_count); 1448 printf("offset=0x%x, backing_object=(0x%x)+0x%x\n", 1449 (int) object->paging_offset, 1450 (int) object->backing_object, (int) object->backing_object_offset); 1451 printf("cache: next=%p, prev=%p\n", |
1439 object->cached_list.tqe_next, object->cached_list.tqe_prev); | 1452 TAILQ_NEXT(object, cached_list), TAILQ_PREV(object, cached_list)); |
1440 1441 if (!full) 1442 return; 1443 1444 indent += 2; 1445 count = 0; | 1453 1454 if (!full) 1455 return; 1456 1457 indent += 2; 1458 count = 0; |
1446 for (p = object->memq.tqh_first; p != NULL; p = p->listq.tqe_next) { | 1459 for (p = TAILQ_FIRST(&object->memq); p != NULL; p = TAILQ_NEXT(p, listq)) { |
1447 if (count == 0) 1448 iprintf("memory:="); 1449 else if (count == 6) { 1450 printf("\n"); 1451 iprintf(" ..."); 1452 count = 0; 1453 } else 1454 printf(","); 1455 count++; 1456 1457 printf("(off=0x%lx,page=0x%lx)", 1458 (u_long) p->pindex, (u_long) VM_PAGE_TO_PHYS(p)); 1459 } 1460 if (count != 0) 1461 printf("\n"); 1462 indent -= 2; 1463} 1464#endif /* DDB */ | 1460 if (count == 0) 1461 iprintf("memory:="); 1462 else if (count == 6) { 1463 printf("\n"); 1464 iprintf(" ..."); 1465 count = 0; 1466 } else 1467 printf(","); 1468 count++; 1469 1470 printf("(off=0x%lx,page=0x%lx)", 1471 (u_long) p->pindex, (u_long) VM_PAGE_TO_PHYS(p)); 1472 } 1473 if (count != 0) 1474 printf("\n"); 1475 indent -= 2; 1476} 1477#endif /* DDB */ |