Date: Thu, 1 Feb 2018 23:47:51 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r328759 - user/jeff/numa/sys/vm Message-ID: <201802012347.w11NlpZY056331@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Thu Feb 1 23:47:51 2018 New Revision: 328759 URL: https://svnweb.freebsd.org/changeset/base/328759 Log: Implement another variant of per-cpu free page caching derived from markj's patch. Modified: user/jeff/numa/sys/vm/vm_page.c Modified: user/jeff/numa/sys/vm/vm_page.c ============================================================================== --- user/jeff/numa/sys/vm/vm_page.c Thu Feb 1 22:01:53 2018 (r328758) +++ user/jeff/numa/sys/vm/vm_page.c Thu Feb 1 23:47:51 2018 (r328759) @@ -182,6 +182,9 @@ static int vm_page_reclaim_run(int req_class, int doma static void vm_domain_free_wakeup(struct vm_domain *); static int vm_domain_alloc_fail(struct vm_domain *vmd, vm_object_t object, int req); +static int vm_page_import(void *arg, void **store, int cnt, int domain, + int flags); +static void vm_page_release(void *arg, void **store, int cnt); SYSINIT(vm_page, SI_SUB_VM, SI_ORDER_SECOND, vm_page_init, NULL); @@ -195,6 +198,27 @@ vm_page_init(void *dummy) VM_ALLOC_NORMAL | VM_ALLOC_WIRED); } +/* + * The cache page zone is initialized later since we need to be able to allocate + * pages before UMA is fully initialized. + */ +static void +vm_page_init_cache_zones(void *dummy __unused) +{ + struct vm_domain *vmd; + int i; + + for (i = 0; i < vm_ndomains; i++) { + vmd = VM_DOMAIN(i); + vmd->vmd_pgcache = uma_zcache_create("vm pgcache", + sizeof(struct vm_page), NULL, NULL, NULL, NULL, + vm_page_import, vm_page_release, vmd, + /* UMA_ZONE_NOBUCKETCACHE |*/ + UMA_ZONE_MAXBUCKET | UMA_ZONE_VM); + } +} +SYSINIT(vm_page2, SI_SUB_VM_CONF, SI_ORDER_ANY, vm_page_init_cache_zones, NULL); + /* Make sure that u_long is at least 64 bits when PAGE_SIZE is 32K. */ #if PAGE_SIZE == 32768 #ifdef CTASSERT @@ -1709,6 +1733,12 @@ again: } #endif vmd = VM_DOMAIN(domain); + if (object != NULL && !vm_object_reserv(object) && + vmd->vmd_pgcache != NULL) { + m = uma_zalloc(vmd->vmd_pgcache, M_NOWAIT); + if (m != NULL) + goto found; + } vm_domain_free_lock(vmd); if (vm_domain_available(vmd, req, 1)) { /* @@ -1757,9 +1787,7 @@ again: */ if (vm_paging_needed(vmd, free_count)) pagedaemon_wakeup(vmd->vmd_domain); -#if VM_NRESERVLEVEL > 0 found: -#endif vm_page_alloc_check(m); /* @@ -2131,6 +2159,51 @@ again: if (vm_paging_needed(vmd, free_count)) pagedaemon_wakeup(domain); return (m); +} + +static int +vm_page_import(void *arg, void **store, int cnt, int domain, int flags) +{ + struct vm_domain *vmd; + vm_page_t m; + int i; + + vmd = arg; + domain = vmd->vmd_domain; + vm_domain_free_lock(vmd); + for (i = 0; i < cnt; i++) { + m = vm_phys_alloc_pages(domain, VM_FREELIST_DEFAULT, 0); + if (m == NULL) + break; + store[i] = m; + } + if (i != 0) + vm_domain_freecnt_adj(vmd, -i); + vm_domain_free_unlock(vmd); + + return (i); +} + +static void +vm_page_release(void *arg, void **store, int cnt) +{ + struct vm_domain *vmd; + vm_page_t m; + int i; + + vmd = arg; + vm_domain_free_lock(vmd); + for (i = 0; i < cnt; i++) { + m = (vm_page_t)store[i]; +#if VM_NRESERVLEVEL > 0 + KASSERT(vm_reserv_free_page(m) == false, + ("vm_page_release: Cached page belonged to reservation.")); +#endif + vm_phys_free_pages(m, 0); + } + vm_domain_freecnt_adj(vmd, i); + vm_domain_free_wakeup(vmd); + vm_domain_free_unlock(vmd); } #define VPSC_ANY 0 /* No restrictions. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802012347.w11NlpZY056331>