Lines Matching refs:aobj

51  * An anonymous UVM object (aobj) manages anonymous-memory.  In addition to
58 * Note: for hash tables, we break the address space of the aobj into blocks
78 #define UAO_SWHASH_HASH(aobj, idx) \
79 (&(aobj)->u_swhash[(((idx) >> UAO_SWHASH_CLUSTER_SHIFT) \
80 & (aobj)->u_swhashmask)])
87 #define UAO_USES_SWHASH(aobj) \
88 ((aobj)->u_pages > UAO_SWHASH_THRESHOLD)
122 * => only one of u_swslots and u_swhash is used in any given aobj
130 * offset -> swapslot mappings for the aobj.
200 uao_find_swhash_elt(struct uvm_aobj *aobj, int pageidx, boolean_t create)
206 swhash = UAO_SWHASH_HASH(aobj, pageidx); /* first hash to get bucket */
241 * uao_find_swslot: find the swap slot number for an aobj/pageidx
246 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
253 if (aobj->u_flags & UAO_FLAG_NOSWAP)
259 if (UAO_USES_SWHASH(aobj)) {
261 uao_find_swhash_elt(aobj, pageidx, FALSE);
272 return aobj->u_swslots[pageidx];
276 * uao_set_swslot: set the swap slot for a page in an aobj.
286 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
295 if (aobj->u_flags & UAO_FLAG_NOSWAP) {
307 if (UAO_USES_SWHASH(aobj)) {
314 uao_find_swhash_elt(aobj, pageidx, slot ? TRUE : FALSE);
341 oldslot = aobj->u_swslots[pageidx];
342 aobj->u_swslots[pageidx] = slot;
351 * uao_free: free all resources held by an aobj, and then free the aobj
353 * => the aobj should be dead
356 uao_free(struct uvm_aobj *aobj)
358 struct uvm_object *uobj = &aobj->u_obj;
365 if (UAO_USES_SWHASH(aobj)) {
369 hashfree(aobj->u_swhash, UAO_SWHASH_BUCKETS(aobj->u_pages), M_UVMAOBJ);
371 free(aobj->u_swslots, M_UVMAOBJ, aobj->u_pages * sizeof(int));
375 * finally free the aobj itself
378 pool_put(&uvm_aobj_pool, aobj);
387 * Shrink an aobj to a given number of pages. The procedure is always the same:
406 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
412 KASSERT(UAO_USES_SWHASH(aobj));
418 if (UAO_SWHASH_BUCKETS(aobj->u_pages) == UAO_SWHASH_BUCKETS(pages)) {
419 uao_shrink_flush(uobj, pages, aobj->u_pages);
420 aobj->u_pages = pages;
429 uao_shrink_flush(uobj, pages, aobj->u_pages);
435 for (i = 0; i < UAO_SWHASH_BUCKETS(aobj->u_pages); i++) {
436 while (LIST_EMPTY(&aobj->u_swhash[i]) == 0) {
437 elt = LIST_FIRST(&aobj->u_swhash[i]);
443 hashfree(aobj->u_swhash, UAO_SWHASH_BUCKETS(aobj->u_pages), M_UVMAOBJ);
445 aobj->u_swhash = new_swhash;
446 aobj->u_pages = pages;
447 aobj->u_swhashmask = new_hashmask;
455 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
464 uao_shrink_flush(uobj, pages, aobj->u_pages);
468 elt = uao_find_swhash_elt(aobj, i, FALSE);
480 hashfree(aobj->u_swhash, UAO_SWHASH_BUCKETS(aobj->u_pages), M_UVMAOBJ);
482 aobj->u_swslots = new_swslots;
483 aobj->u_pages = pages;
491 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
499 uao_shrink_flush(uobj, pages, aobj->u_pages);
502 new_swslots[i] = aobj->u_swslots[i];
504 free(aobj->u_swslots, M_UVMAOBJ, aobj->u_pages * sizeof(int));
506 aobj->u_swslots = new_swslots;
507 aobj->u_pages = pages;
515 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
517 KASSERT(pages < aobj->u_pages);
521 * 1. aobj uses hash and must be converted to array.
522 * 2. aobj uses array and array size needs to be adjusted.
523 * 3. aobj uses hash and hash size needs to be adjusted.
527 else if (aobj->u_pages > UAO_SWHASH_THRESHOLD)
534 * Grow an aobj to a given number of pages. Right now we only adjust the swap
544 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
547 KASSERT(aobj->u_pages <= UAO_SWHASH_THRESHOLD);
554 for (i = 0; i < aobj->u_pages; i++)
555 new_swslots[i] = aobj->u_swslots[i];
557 free(aobj->u_swslots, M_UVMAOBJ, aobj->u_pages * sizeof(int));
559 aobj->u_swslots = new_swslots;
560 aobj->u_pages = pages;
568 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
580 if (UAO_SWHASH_BUCKETS(aobj->u_pages) == UAO_SWHASH_BUCKETS(pages)) {
581 aobj->u_pages = pages;
585 KASSERT(UAO_SWHASH_BUCKETS(aobj->u_pages) < UAO_SWHASH_BUCKETS(pages));
592 for (i = 0; i < UAO_SWHASH_BUCKETS(aobj->u_pages); i++) {
593 while (LIST_EMPTY(&aobj->u_swhash[i]) == 0) {
594 elt = LIST_FIRST(&aobj->u_swhash[i]);
600 hashfree(aobj->u_swhash, UAO_SWHASH_BUCKETS(aobj->u_pages), M_UVMAOBJ);
602 aobj->u_swhash = new_swhash;
603 aobj->u_pages = pages;
604 aobj->u_swhashmask = new_hashmask;
612 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
624 old_swslots = aobj->u_swslots;
625 aobj->u_swhash = new_swhash;
626 aobj->u_swhashmask = new_hashmask;
628 for (i = 0; i < aobj->u_pages; i++) {
630 elt = uao_find_swhash_elt(aobj, i, TRUE);
636 free(old_swslots, M_UVMAOBJ, aobj->u_pages * sizeof(int));
637 aobj->u_pages = pages;
645 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
647 KASSERT(pages > aobj->u_pages);
651 * 1. aobj uses hash and hash size needs to be adjusted.
652 * 2. aobj uses array and array size needs to be adjusted.
653 * 3. aobj uses array and must be converted to hash.
657 else if (aobj->u_pages > UAO_SWHASH_THRESHOLD)
665 * uao_create: create an aobj of the given size and return its uvm_object.
679 struct uvm_aobj *aobj;
683 * Allocate a new aobj, unless kernel object is requested.
687 aobj = &kernel_object_store;
688 aobj->u_pages = pages;
689 aobj->u_flags = UAO_FLAG_NOSWAP;
694 aobj = &kernel_object_store;
697 aobj = pool_get(&uvm_aobj_pool, PR_WAITOK);
698 aobj->u_pages = pages;
699 aobj->u_flags = 0;
715 if (UAO_USES_SWHASH(aobj)) {
716 aobj->u_swhash = hashinit(UAO_SWHASH_BUCKETS(pages),
717 M_UVMAOBJ, mflags, &aobj->u_swhashmask);
718 if (aobj->u_swhash == NULL) {
720 pool_put(&uvm_aobj_pool, aobj);
726 aobj->u_swslots = mallocarray(pages, sizeof(int),
728 if (aobj->u_swslots == NULL) {
730 pool_put(&uvm_aobj_pool, aobj);
738 aobj->u_flags &= ~UAO_FLAG_NOSWAP; /* clear noswap */
739 return &aobj->u_obj;
747 uvm_obj_init(&aobj->u_obj, &aobj_pager, refs);
751 uvm_obj_setlock(&aobj->u_obj, &bootstrap_kernel_object_lock);
755 * now that aobj is ready, add it to the global list
758 LIST_INSERT_HEAD(&uao_list, aobj, u_list);
761 return &aobj->u_obj;
767 * uao_init: set up aobj pager subsystem
804 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
821 * Remove the aobj from the global list.
824 LIST_REMOVE(aobj, u_list);
828 * Free all the pages left in the aobj. For each page, when the
841 uao_dropswap(&aobj->u_obj, pg->offset >> PAGE_SHIFT);
850 uao_free(aobj);
869 struct uvm_aobj *aobj = (struct uvm_aobj *) uobj;
878 stop = (voff_t)aobj->u_pages << PAGE_SHIFT;
882 if (stop > ((voff_t)aobj->u_pages << PAGE_SHIFT)) {
885 stop = (voff_t)aobj->u_pages << PAGE_SHIFT;
994 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
1168 * remove the swap slot from the aobj
1169 * and mark the aobj as having no real slot.
1173 swslot = uao_set_swslot(&aobj->u_obj, pageidx,
1212 * uao_dropswap: release any swap resources from this aobj page.
1214 * => aobj must be locked or have a reference count of 0.
1231 * page in every page in every aobj that is paged-out to a range of swslots.
1233 * => aobj must be locked and is returned locked.
1239 struct uvm_aobj *aobj;
1245 if ((aobj = LIST_FIRST(&uao_list)) == NULL) {
1249 uao_reference(&aobj->u_obj);
1260 if ((nextaobj = LIST_NEXT(aobj, u_list)) != NULL) {
1268 rw_enter(aobj->u_obj.vmobjlock, RW_WRITE);
1269 rv = uao_pagein(aobj, startslot, endslot);
1270 rw_exit(aobj->u_obj.vmobjlock);
1273 uao_detach(&aobj->u_obj);
1281 aobj = nextaobj;
1283 } while (aobj);
1293 * page in any pages from aobj in the given range.
1298 uao_pagein(struct uvm_aobj *aobj, int startslot, int endslot)
1302 if (UAO_USES_SWHASH(aobj)) {
1307 for (bucket = aobj->u_swhashmask; bucket >= 0; bucket--) {
1308 for (elt = LIST_FIRST(&aobj->u_swhash[bucket]);
1330 rv = uao_pagein_page(aobj,
1342 for (i = 0; i < aobj->u_pages; i++) {
1343 int slot = aobj->u_swslots[i];
1355 rv = uao_pagein_page(aobj, i);
1371 uao_pagein_page(struct uvm_aobj *aobj, int pageidx)
1373 struct uvm_object *uobj = &aobj->u_obj;
1381 rv = uao_get(&aobj->u_obj, (voff_t)pageidx << PAGE_SHIFT,
1406 uao_dropswap(&aobj->u_obj, pageidx);
1423 * => aobj must be locked and is returned locked.
1429 struct uvm_aobj *aobj = (struct uvm_aobj *)uobj;
1439 if (UAO_USES_SWHASH(aobj)) {
1440 int i, hashbuckets = aobj->u_swhashmask + 1;
1450 for (elt = LIST_FIRST(&aobj->u_swhash[i]);
1479 KASSERT(uvm_pagelookup(&aobj->u_obj,
1501 if (aobj->u_pages < end) {
1502 end = aobj->u_pages;
1505 int slot = aobj->u_swslots[i];