svn commit: r187701 - user/alc/zerocopy/sys/vm
Jeff Roberson
jroberson at jroberson.net
Sun Jan 25 19:47:28 PST 2009
On Mon, 26 Jan 2009, Alan Cox wrote:
> Author: alc
> Date: Mon Jan 26 00:52:09 2009
> New Revision: 187701
> URL: http://svn.freebsd.org/changeset/base/187701
>
> Log:
> Retire the page-based copy-on-write mechanism.
Hey if we're doing this there are some mbuf fields I could axe too. :-)
This isn't productive for anyone anyway eh? I've done page-flipping to
kernel for nfs and custom protocols but to userland it just doesn't make
sense without an api to support it.
Thanks,
Jeff
>
> Modified:
> user/alc/zerocopy/sys/vm/vm_fault.c
> user/alc/zerocopy/sys/vm/vm_page.c
> user/alc/zerocopy/sys/vm/vm_page.h
>
> Modified: user/alc/zerocopy/sys/vm/vm_fault.c
> ==============================================================================
> --- user/alc/zerocopy/sys/vm/vm_fault.c Sun Jan 25 23:08:47 2009 (r187700)
> +++ user/alc/zerocopy/sys/vm/vm_fault.c Mon Jan 26 00:52:09 2009 (r187701)
> @@ -330,25 +330,6 @@ RetryFault:;
> */
> fs.m = vm_page_lookup(fs.object, fs.pindex);
> if (fs.m != NULL) {
> - /*
> - * check for page-based copy on write.
> - * We check fs.object == fs.first_object so
> - * as to ensure the legacy COW mechanism is
> - * used when the page in question is part of
> - * a shadow object. Otherwise, vm_page_cowfault()
> - * removes the page from the backing object,
> - * which is not what we want.
> - */
> - vm_page_lock_queues();
> - if ((fs.m->cow) &&
> - (fault_type & VM_PROT_WRITE) &&
> - (fs.object == fs.first_object)) {
> - vm_page_cowfault(fs.m);
> - vm_page_unlock_queues();
> - unlock_and_deallocate(&fs);
> - goto RetryFault;
> - }
> -
> /*
> * Wait/Retry if the page is busy. We have to do this
> * if the page is busy via either VPO_BUSY or
> @@ -366,7 +347,6 @@ RetryFault:;
> * to pmap it.
> */
> if ((fs.m->oflags & VPO_BUSY) || fs.m->busy) {
> - vm_page_unlock_queues();
> VM_OBJECT_UNLOCK(fs.object);
> if (fs.object != fs.first_object) {
> VM_OBJECT_LOCK(fs.first_object);
> @@ -398,6 +378,7 @@ RetryFault:;
> vm_object_deallocate(fs.first_object);
> goto RetryFault;
> }
> + vm_page_lock_queues();
> vm_pageq_remove(fs.m);
> vm_page_unlock_queues();
>
>
> Modified: user/alc/zerocopy/sys/vm/vm_page.c
> ==============================================================================
> --- user/alc/zerocopy/sys/vm/vm_page.c Sun Jan 25 23:08:47 2009 (r187700)
> +++ user/alc/zerocopy/sys/vm/vm_page.c Mon Jan 26 00:52:09 2009 (r187701)
> @@ -2033,98 +2033,6 @@ vm_page_test_dirty(vm_page_t m)
> }
> }
>
> -int so_zerocp_fullpage = 0;
> -
> -/*
> - * Replace the given page with a copy. The copied page assumes
> - * the portion of the given page's "wire_count" that is not the
> - * responsibility of this copy-on-write mechanism.
> - *
> - * The object containing the given page must have a non-zero
> - * paging-in-progress count and be locked.
> - */
> -void
> -vm_page_cowfault(vm_page_t m)
> -{
> - vm_page_t mnew;
> - vm_object_t object;
> - vm_pindex_t pindex;
> -
> - object = m->object;
> - VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
> - KASSERT(object->paging_in_progress != 0,
> - ("vm_page_cowfault: object %p's paging-in-progress count is zero.",
> - object));
> - pindex = m->pindex;
> -
> - retry_alloc:
> - pmap_remove_all(m);
> - vm_page_remove(m);
> - mnew = vm_page_alloc(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY);
> - if (mnew == NULL) {
> - vm_page_insert(m, object, pindex);
> - vm_page_unlock_queues();
> - VM_OBJECT_UNLOCK(object);
> - VM_WAIT;
> - VM_OBJECT_LOCK(object);
> - if (m == vm_page_lookup(object, pindex)) {
> - vm_page_lock_queues();
> - goto retry_alloc;
> - } else {
> - /*
> - * Page disappeared during the wait.
> - */
> - vm_page_lock_queues();
> - return;
> - }
> - }
> -
> - if (m->cow == 0) {
> - /*
> - * check to see if we raced with an xmit complete when
> - * waiting to allocate a page. If so, put things back
> - * the way they were
> - */
> - vm_page_free(mnew);
> - vm_page_insert(m, object, pindex);
> - } else { /* clear COW & copy page */
> - if (!so_zerocp_fullpage)
> - pmap_copy_page(m, mnew);
> - mnew->valid = VM_PAGE_BITS_ALL;
> - vm_page_dirty(mnew);
> - mnew->wire_count = m->wire_count - m->cow;
> - m->wire_count = m->cow;
> - }
> -}
> -
> -void
> -vm_page_cowclear(vm_page_t m)
> -{
> -
> - mtx_assert(&vm_page_queue_mtx, MA_OWNED);
> - if (m->cow) {
> - m->cow--;
> - /*
> - * let vm_fault add back write permission lazily
> - */
> - }
> - /*
> - * sf_buf_free() will free the page, so we needn't do it here
> - */
> -}
> -
> -int
> -vm_page_cowsetup(vm_page_t m)
> -{
> -
> - mtx_assert(&vm_page_queue_mtx, MA_OWNED);
> - if (m->cow == USHRT_MAX - 1)
> - return (EBUSY);
> - m->cow++;
> - pmap_remove_write(m);
> - return (0);
> -}
> -
> #include "opt_ddb.h"
> #ifdef DDB
> #include <sys/kernel.h>
>
> Modified: user/alc/zerocopy/sys/vm/vm_page.h
> ==============================================================================
> --- user/alc/zerocopy/sys/vm/vm_page.h Sun Jan 25 23:08:47 2009 (r187700)
> +++ user/alc/zerocopy/sys/vm/vm_page.h Mon Jan 26 00:52:09 2009 (r187701)
> @@ -115,7 +115,6 @@ struct vm_page {
> u_short flags; /* see below */
> uint8_t order; /* index of the buddy queue */
> uint8_t pool;
> - u_short cow; /* page cow mapping count */
> u_int wire_count; /* wired down maps refs (P) */
> short hold_count; /* page hold count */
> u_short oflags; /* page flags (O) */
> @@ -335,9 +334,6 @@ int vm_page_bits (int, int);
> void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid);
> void vm_page_free_toq(vm_page_t m);
> void vm_page_zero_idle_wakeup(void);
> -void vm_page_cowfault (vm_page_t);
> -int vm_page_cowsetup(vm_page_t);
> -void vm_page_cowclear (vm_page_t);
>
> /*
> * vm_page_sleep_if_busy:
>
More information about the svn-src-user
mailing list