Date: Thu, 5 Jul 2018 02:08:57 +0000 (UTC) From: Alan Cox <alc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r335972 - head/sys/vm Message-ID: <201807050208.w6528voB098118@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: alc Date: Thu Jul 5 02:08:57 2018 New Revision: 335972 URL: https://svnweb.freebsd.org/changeset/base/335972 Log: Allow callers to vm_phys_split_pages() to specify whether insertion should occur at the head or the tail of the page queues. Modified: head/sys/vm/vm_phys.c Modified: head/sys/vm/vm_phys.c ============================================================================== --- head/sys/vm/vm_phys.c Thu Jul 5 02:04:18 2018 (r335971) +++ head/sys/vm/vm_phys.c Thu Jul 5 02:08:57 2018 (r335972) @@ -156,7 +156,7 @@ static vm_page_t vm_phys_alloc_seg_contig(struct vm_ph static void _vm_phys_create_seg(vm_paddr_t start, vm_paddr_t end, int domain); static void vm_phys_create_seg(vm_paddr_t start, vm_paddr_t end); static void vm_phys_split_pages(vm_page_t m, int oind, struct vm_freelist *fl, - int order); + int order, int tail); /* * Red-black tree helpers for vm fictitious range management. @@ -588,9 +588,16 @@ vm_phys_init(void) /* * Split a contiguous, power of two-sized set of physical pages. + * + * When this function is called by a page allocation function, the caller + * should request insertion at the head unless the order [order, oind) queues + * are known to be empty. The objective being to reduce the likelihood of + * long-term fragmentation by promoting contemporaneous allocation and + * (hopefully) deallocation. */ static __inline void -vm_phys_split_pages(vm_page_t m, int oind, struct vm_freelist *fl, int order) +vm_phys_split_pages(vm_page_t m, int oind, struct vm_freelist *fl, int order, + int tail) { vm_page_t m_buddy; @@ -600,7 +607,7 @@ vm_phys_split_pages(vm_page_t m, int oind, struct vm_f KASSERT(m_buddy->order == VM_NFREEORDER, ("vm_phys_split_pages: page %p has unexpected order %d", m_buddy, m_buddy->order)); - vm_freelist_add(fl, m_buddy, oind, 0); + vm_freelist_add(fl, m_buddy, oind, tail); } } @@ -777,7 +784,8 @@ vm_phys_alloc_freelist_pages(int domain, int freelist, m = TAILQ_FIRST(&fl[oind].pl); if (m != NULL) { vm_freelist_rem(fl, m, oind); - vm_phys_split_pages(m, oind, fl, order); + /* The order [order, oind) queues are empty. */ + vm_phys_split_pages(m, oind, fl, order, 1); return (m); } } @@ -795,7 +803,8 @@ vm_phys_alloc_freelist_pages(int domain, int freelist, if (m != NULL) { vm_freelist_rem(alt, m, oind); vm_phys_set_pool(pool, m, oind); - vm_phys_split_pages(m, oind, fl, order); + /* The order [order, oind) queues are empty. */ + vm_phys_split_pages(m, oind, fl, order, 1); return (m); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807050208.w6528voB098118>