Date: Fri, 30 Mar 2018 01:33:10 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r331754 - user/jeff/numa/sys/vm Message-ID: <201803300133.w2U1XAmV065080@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Fri Mar 30 01:33:10 2018 New Revision: 331754 URL: https://svnweb.freebsd.org/changeset/base/331754 Log: Re-implement the page free cache with UMA. Change the limits so the import function doesn't grab the lock if it's not going to succeed. Modified: user/jeff/numa/sys/vm/uma.h user/jeff/numa/sys/vm/uma_core.c user/jeff/numa/sys/vm/vm_page.c user/jeff/numa/sys/vm/vm_page.h Modified: user/jeff/numa/sys/vm/uma.h ============================================================================== --- user/jeff/numa/sys/vm/uma.h Fri Mar 30 01:31:06 2018 (r331753) +++ user/jeff/numa/sys/vm/uma.h Fri Mar 30 01:33:10 2018 (r331754) @@ -286,6 +286,10 @@ uma_zone_t uma_zcache_create(char *name, int size, uma * NUMA aware Zone. Implements a best * effort first-touch policy. */ +#define UMA_ZONE_NOBUCKETCACHE 0x20000 /* + * Don't cache full buckets. Limit + * UMA to per-cpu state. + */ /* * These flags are shared between the keg and zone. In zones wishing to add Modified: user/jeff/numa/sys/vm/uma_core.c ============================================================================== --- user/jeff/numa/sys/vm/uma_core.c Fri Mar 30 01:31:06 2018 (r331753) +++ user/jeff/numa/sys/vm/uma_core.c Fri Mar 30 01:33:10 2018 (r331754) @@ -2965,7 +2965,13 @@ zfree_start: /* ub_cnt is pointing to the last free item */ KASSERT(bucket->ub_cnt != 0, ("uma_zfree: Attempting to insert an empty bucket onto the full list.\n")); - LIST_INSERT_HEAD(&zdom->uzd_buckets, bucket, ub_link); + if ((zone->uz_flags & UMA_ZONE_NOBUCKETCACHE) != 0) { + ZONE_UNLOCK(zone); + bucket_drain(zone, bucket); + bucket_free(zone, bucket, udata); + goto zfree_restart; + } else + LIST_INSERT_HEAD(&zdom->uzd_buckets, bucket, ub_link); } /* Modified: user/jeff/numa/sys/vm/vm_page.c ============================================================================== --- user/jeff/numa/sys/vm/vm_page.c Fri Mar 30 01:31:06 2018 (r331753) +++ user/jeff/numa/sys/vm/vm_page.c Fri Mar 30 01:33:10 2018 (r331754) @@ -134,7 +134,6 @@ extern int vmem_startup_count(void); struct vm_domain vm_dom[MAXMEMDOM]; static DPCPU_DEFINE(struct vm_batchqueue, pqbatch[MAXMEMDOM][PQ_COUNT]); -static DPCPU_DEFINE(struct vm_batchqueue, freeqbatch[MAXMEMDOM]); struct mtx_padalign __exclusive_cache_line pa_lock[PA_LOCK_COUNT]; @@ -221,8 +220,7 @@ vm_page_init_cache_zones(void *dummy __unused) 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); + 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); @@ -1781,6 +1779,11 @@ again: } #endif vmd = VM_DOMAIN(domain); + if (object != NULL && vmd->vmd_pgcache != NULL) { + m = uma_zalloc(vmd->vmd_pgcache, M_NOWAIT); + if (m != NULL) + goto found; + } if (vm_domain_allocate(vmd, req, 1)) { /* * If not, allocate it from the free page queues. @@ -2188,22 +2191,23 @@ vm_page_import(void *arg, void **store, int cnt, int d int i, j, n; vmd = arg; + /* Only import if we can bring in a full bucket. */ + if (cnt == 1 || !vm_domain_allocate(vmd, VM_ALLOC_NORMAL, cnt)) + return (0); domain = vmd->vmd_domain; - n = 64; /* Starting stride. */ + n = 64; /* Starting stride, arbitrary. */ vm_domain_free_lock(vmd); for (i = 0; i < cnt; i+=n) { n = vm_phys_alloc_npages(domain, VM_FREELIST_DEFAULT, &m, MIN(n, cnt-i)); if (n == 0) break; - if (!vm_domain_allocate(vmd, VM_ALLOC_NORMAL, n)) { - vm_phys_free_contig(m, n); - break; - } for (j = 0; j < n; j++) store[i+j] = m++; } vm_domain_free_unlock(vmd); + if (cnt != i) + vm_domain_freecnt_inc(vmd, cnt - i); return (i); } @@ -3431,36 +3435,6 @@ vm_page_free_prep(vm_page_t m) return (true); } -void -vm_page_free_phys_pglist(struct pglist *tq) -{ - struct vm_domain *vmd; - vm_page_t m; - int cnt; - - if (TAILQ_EMPTY(tq)) - return; - vmd = NULL; - cnt = 0; - TAILQ_FOREACH(m, tq, listq) { - if (vmd != vm_pagequeue_domain(m)) { - if (vmd != NULL) { - vm_domain_free_unlock(vmd); - vm_domain_freecnt_inc(vmd, cnt); - cnt = 0; - } - vmd = vm_pagequeue_domain(m); - vm_domain_free_lock(vmd); - } - vm_phys_free_pages(m, 0); - cnt++; - } - if (vmd != NULL) { - vm_domain_free_unlock(vmd); - vm_domain_freecnt_inc(vmd, cnt); - } -} - /* * vm_page_free_toq: * @@ -3473,35 +3447,20 @@ vm_page_free_phys_pglist(struct pglist *tq) void vm_page_free_toq(vm_page_t m) { - struct vm_batchqueue *cpubq, bq; struct vm_domain *vmd; - int domain, freed; if (!vm_page_free_prep(m)) return; - domain = vm_phys_domain(m); - vmd = VM_DOMAIN(domain); - - critical_enter(); - cpubq = DPCPU_PTR(freeqbatch[domain]); - if (vm_batchqueue_insert(cpubq, m)) { - critical_exit(); + vmd = vm_pagequeue_domain(m); + if (m->pool == VM_FREEPOOL_DEFAULT && vmd->vmd_pgcache != NULL) { + uma_zfree(vmd->vmd_pgcache, m); return; } - memcpy(&bq, cpubq, sizeof(bq)); - vm_batchqueue_init(cpubq); - critical_exit(); - vm_domain_free_lock(vmd); vm_phys_free_pages(m, 0); - freed = 1; - VM_BATCHQ_FOREACH(&bq, m) { - vm_phys_free_pages(m, 0); - freed++; - } vm_domain_free_unlock(vmd); - vm_domain_freecnt_inc(vmd, freed); + vm_domain_freecnt_inc(vmd, 1); } /* Modified: user/jeff/numa/sys/vm/vm_page.h ============================================================================== --- user/jeff/numa/sys/vm/vm_page.h Fri Mar 30 01:31:06 2018 (r331753) +++ user/jeff/numa/sys/vm/vm_page.h Fri Mar 30 01:33:10 2018 (r331754) @@ -532,7 +532,6 @@ void vm_page_dequeue(vm_page_t m); void vm_page_dequeue_lazy(vm_page_t m); void vm_page_dequeue_locked(vm_page_t m); vm_page_t vm_page_find_least(vm_object_t, vm_pindex_t); -void vm_page_free_phys_pglist(struct pglist *tq); bool vm_page_free_prep(vm_page_t m); vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr); void vm_page_initfake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201803300133.w2U1XAmV065080>