FreeBSD Bugzilla – Attachment 188460 Details for
Bug 223831
[patch] swap_pager.c to release multiple swap blocks at a time
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
swapoff to release multiple blocks at a time
vm_swap-multiblock-swapoff.diff (text/plain), 3.32 KB, created by
ota
on 2017-12-02 03:22:42 UTC
(
hide
)
Description:
swapoff to release multiple blocks at a time
Filename:
MIME Type:
Creator:
ota
Created:
2017-12-02 03:22:42 UTC
Size:
3.32 KB
patch
obsolete
>Index: sys/vm/swap_pager.c >=================================================================== >--- sys/vm/swap_pager.c (revision 326418) >+++ sys/vm/swap_pager.c (working copy) >@@ -1621,37 +1768,50 @@ > * We also attempt to swap in all other pages in the swap block. > * However, we only guarantee that the one at the specified index is > * paged in. >- * >- * XXX - The code to page the whole block in doesn't work, so we >- * revert to the one-by-one behavior for now. Sigh. > */ >-static inline void >+static int > swp_pager_force_pagein(vm_object_t object, vm_pindex_t pindex) > { >- vm_page_t m; >+ vm_page_t m[SWB_NPAGES]; >+ int count, i, j, npages, rv; > >- vm_object_pip_add(object, 1); >- m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL); >- if (m->valid == VM_PAGE_BITS_ALL) { >- vm_object_pip_wakeup(object); >- vm_page_dirty(m); >- vm_page_lock(m); >- vm_page_activate(m); >- vm_page_unlock(m); >- vm_page_xunbusy(m); >- vm_pager_page_unswapped(m); >- return; >+ rv = swap_pager_haspage(object, pindex, NULL, &npages); >+ KASSERT(rv == 1, ("%s: missing page %p", __func__, m)); >+ npages += 1; >+ i = vm_page_grab_pages(object, pindex, VM_ALLOC_NORMAL, m, npages); >+ vm_object_pip_add(object, npages); >+ >+ for (i = 0; i < npages;) { >+ if (m[i]->valid == VM_PAGE_BITS_ALL) { >+ vm_object_pip_wakeup(object); >+ vm_page_dirty(m[i]); >+ vm_page_lock(m[i]); >+ vm_page_activate(m[i]); >+ vm_page_unlock(m[i]); >+ vm_page_xunbusy(m[i]); >+ vm_pager_page_unswapped(m[i]); >+ i++; >+ continue; >+ } >+ >+ for (j = i + 1; j < npages; j++) >+ if (m[j]->valid == VM_PAGE_BITS_ALL) >+ break; >+ >+ count = j - i; >+ if (swap_pager_getpages(object, &m[i], count, NULL, NULL) != VM_PAGER_OK) >+ panic("swap_pager_force_pagein: read from swap failed");/*XXX*/ >+ for (; i < j; i++) { >+ vm_object_pip_wakeup(object); >+ vm_page_dirty(m[i]); >+ vm_page_lock(m[i]); >+ vm_page_launder(m[i]); >+ vm_page_unlock(m[i]); >+ vm_page_xunbusy(m[i]); >+ vm_pager_page_unswapped(m[i]); >+ } > } >- >- if (swap_pager_getpages(object, &m, 1, NULL, NULL) != VM_PAGER_OK) >- panic("swap_pager_force_pagein: read from swap failed");/*XXX*/ >- vm_object_pip_wakeup(object); >- vm_page_dirty(m); >- vm_page_lock(m); >- vm_page_launder(m); >- vm_page_unlock(m); >- vm_page_xunbusy(m); >- vm_pager_page_unswapped(m); >+ return npages; > } > > /* >@@ -1670,7 +1832,7 @@ > struct swblk *sb; > vm_object_t object; > vm_pindex_t pi; >- int i, retries; >+ int i, freedpages, offset, retries; > > sx_assert(&swdev_syscall_lock, SA_XLOCKED); > >@@ -1700,15 +1862,28 @@ > if (object->type != OBJT_SWAP) > goto next_obj; > >+ freedpages = 0; > for (pi = 0; (sb = SWAP_PCTRIE_LOOKUP_GE( > &object->un_pager.swp.swp_blks, pi)) != NULL; ) { > pi = sb->p + SWAP_META_PAGES; >- for (i = 0; i < SWAP_META_PAGES; i++) { >+ if (freedpages > SWAP_META_PAGES) { >+ freedpages -= SWAP_META_PAGES; >+ continue; >+ } else if (offset > 0) { >+ i = freedpages; >+ freedpages = 0; >+ } else >+ i = 0; >+ for (; i < SWAP_META_PAGES; i++) { > if (sb->d[i] == SWAPBLK_NONE) > continue; >- if (swp_pager_isondev(sb->d[i], sp)) >- swp_pager_force_pagein(object, >+ if (swp_pager_isondev(sb->d[i], sp)) { >+ freedpages = swp_pager_force_pagein(object, > sb->p + i); >+ offset = min(freedpages, SWAP_META_PAGES - i); >+ freedpages -= offset; >+ i += ( offset - 1 ); >+ } > } > } > next_obj:
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 223831
:
188225
|
188460
|
188607
|
188608