summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/vm/uma_core.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-04-04 09:36:57 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-04-04 14:46:23 +0200
commitde8a76da2f374792594ce03a203b3f30e4889f6f (patch)
tree12b5e1e59358005c3c522955c08aee4795e4829c /freebsd/sys/vm/uma_core.c
parentEnable bridging by default (diff)
downloadrtems-libbsd-de8a76da2f374792594ce03a203b3f30e4889f6f.tar.bz2
Update to FreeBSD head 2017-04-04
Git mirror commit 642b174daddbd0efd9bb5f242c43f4ab4db6869f.
Diffstat (limited to 'freebsd/sys/vm/uma_core.c')
-rw-r--r--freebsd/sys/vm/uma_core.c45
1 files changed, 26 insertions, 19 deletions
diff --git a/freebsd/sys/vm/uma_core.c b/freebsd/sys/vm/uma_core.c
index 357895c0..58fd5336 100644
--- a/freebsd/sys/vm/uma_core.c
+++ b/freebsd/sys/vm/uma_core.c
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
#include <rtems/bsd/sys/param.h>
#include <sys/systm.h>
#include <sys/bitset.h>
+#include <sys/eventhandler.h>
#include <sys/kernel.h>
#include <sys/types.h>
#include <sys/queue.h>
@@ -1270,15 +1271,16 @@ keg_small_init(uma_keg_t keg)
u_int memused;
u_int wastedspace;
u_int shsize;
+ u_int slabsize;
if (keg->uk_flags & UMA_ZONE_PCPU) {
u_int ncpus = (mp_maxid + 1) ? (mp_maxid + 1) : MAXCPU;
- keg->uk_slabsize = sizeof(struct pcpu);
+ slabsize = sizeof(struct pcpu);
keg->uk_ppera = howmany(ncpus * sizeof(struct pcpu),
PAGE_SIZE);
} else {
- keg->uk_slabsize = UMA_SLAB_SIZE;
+ slabsize = UMA_SLAB_SIZE;
keg->uk_ppera = 1;
}
@@ -1288,8 +1290,8 @@ keg_small_init(uma_keg_t keg)
* allocation bits for we round it up.
*/
rsize = keg->uk_size;
- if (rsize < keg->uk_slabsize / SLAB_SETSIZE)
- rsize = keg->uk_slabsize / SLAB_SETSIZE;
+ if (rsize < slabsize / SLAB_SETSIZE)
+ rsize = slabsize / SLAB_SETSIZE;
if (rsize & keg->uk_align)
rsize = (rsize & ~keg->uk_align) + (keg->uk_align + 1);
keg->uk_rsize = rsize;
@@ -1303,12 +1305,12 @@ keg_small_init(uma_keg_t keg)
else
shsize = sizeof(struct uma_slab);
- keg->uk_ipers = (keg->uk_slabsize - shsize) / rsize;
+ keg->uk_ipers = (slabsize - shsize) / rsize;
KASSERT(keg->uk_ipers > 0 && keg->uk_ipers <= SLAB_SETSIZE,
("%s: keg->uk_ipers %u", __func__, keg->uk_ipers));
memused = keg->uk_ipers * rsize + shsize;
- wastedspace = keg->uk_slabsize - memused;
+ wastedspace = slabsize - memused;
/*
* We can't do OFFPAGE if we're internal or if we've been
@@ -1329,9 +1331,9 @@ keg_small_init(uma_keg_t keg)
* Historically this was not done because the VM could not
* efficiently handle contiguous allocations.
*/
- if ((wastedspace >= keg->uk_slabsize / UMA_MAX_WASTE) &&
- (keg->uk_ipers < (keg->uk_slabsize / keg->uk_rsize))) {
- keg->uk_ipers = keg->uk_slabsize / keg->uk_rsize;
+ if ((wastedspace >= slabsize / UMA_MAX_WASTE) &&
+ (keg->uk_ipers < (slabsize / keg->uk_rsize))) {
+ keg->uk_ipers = slabsize / keg->uk_rsize;
KASSERT(keg->uk_ipers > 0 && keg->uk_ipers <= SLAB_SETSIZE,
("%s: keg->uk_ipers %u", __func__, keg->uk_ipers));
#ifdef UMA_DEBUG
@@ -1340,8 +1342,8 @@ keg_small_init(uma_keg_t keg)
"maximum wasted space allowed = %d, "
"calculated ipers = %d, "
"new wasted space = %d\n", keg->uk_name, wastedspace,
- keg->uk_slabsize / UMA_MAX_WASTE, keg->uk_ipers,
- keg->uk_slabsize - keg->uk_ipers * keg->uk_rsize);
+ slabsize / UMA_MAX_WASTE, keg->uk_ipers,
+ slabsize - keg->uk_ipers * keg->uk_rsize);
#endif
keg->uk_flags |= UMA_ZONE_OFFPAGE;
}
@@ -1374,7 +1376,6 @@ keg_large_init(uma_keg_t keg)
("%s: Cannot large-init a UMA_ZONE_PCPU keg", __func__));
keg->uk_ppera = howmany(keg->uk_size, PAGE_SIZE);
- keg->uk_slabsize = keg->uk_ppera * PAGE_SIZE;
keg->uk_ipers = 1;
keg->uk_rsize = keg->uk_size;
@@ -1426,7 +1427,6 @@ keg_cachespread_init(uma_keg_t keg)
pages = MIN(pages, (128 * 1024) / PAGE_SIZE);
keg->uk_rsize = rsize;
keg->uk_ppera = pages;
- keg->uk_slabsize = UMA_SLAB_SIZE;
keg->uk_ipers = ((pages * PAGE_SIZE) + trailer) / rsize;
keg->uk_flags |= UMA_ZONE_OFFPAGE | UMA_ZONE_VTOSLAB;
KASSERT(keg->uk_ipers <= SLAB_SETSIZE,
@@ -1566,7 +1566,8 @@ keg_ctor(void *mem, int size, void *udata, int flags)
printf("UMA: %s(%p) size %d(%d) flags %#x ipers %d ppera %d out %d free %d\n",
zone->uz_name, zone, keg->uk_size, keg->uk_rsize, keg->uk_flags,
keg->uk_ipers, keg->uk_ppera,
- (keg->uk_ipers * keg->uk_pages) - keg->uk_free, keg->uk_free);
+ (keg->uk_pages / keg->uk_ppera) * keg->uk_ipers - keg->uk_free,
+ keg->uk_free);
#endif
LIST_INSERT_HEAD(&keg->uk_zones, zone, uz_link);
@@ -3018,7 +3019,7 @@ uma_zone_set_max(uma_zone_t zone, int nitems)
keg->uk_maxpages = (nitems / keg->uk_ipers) * keg->uk_ppera;
if (keg->uk_maxpages * keg->uk_ipers < nitems)
keg->uk_maxpages += keg->uk_ppera;
- nitems = keg->uk_maxpages * keg->uk_ipers;
+ nitems = (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers;
KEG_UNLOCK(keg);
return (nitems);
@@ -3035,7 +3036,7 @@ uma_zone_get_max(uma_zone_t zone)
if (keg == NULL)
return (0);
KEG_LOCK(keg);
- nitems = keg->uk_maxpages * keg->uk_ipers;
+ nitems = (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers;
KEG_UNLOCK(keg);
return (nitems);
@@ -3197,13 +3198,14 @@ uma_zone_reserve_kva(uma_zone_t zone, int count)
if (pages * keg->uk_ipers < count)
pages++;
+ pages *= keg->uk_ppera;
#ifdef UMA_MD_SMALL_ALLOC
if (keg->uk_ppera > 1) {
#else
if (1) {
#endif
- kva = kva_alloc((vm_size_t)pages * UMA_SLAB_SIZE);
+ kva = kva_alloc((vm_size_t)pages * PAGE_SIZE);
if (kva == 0)
return (0);
} else
@@ -3305,6 +3307,11 @@ uma_reclaim_worker(void *arg __unused)
"umarcl", 0);
if (uma_reclaim_needed) {
uma_reclaim_needed = 0;
+#ifndef __rtems__
+ sx_xunlock(&uma_drain_lock);
+ EVENTHANDLER_INVOKE(vm_lowmem, VM_LOW_KMEM);
+ sx_xlock(&uma_drain_lock);
+#endif /* __rtems__ */
uma_reclaim_locked(true);
}
}
@@ -3405,8 +3412,8 @@ uma_print_keg(uma_keg_t keg)
"out %d free %d limit %d\n",
keg->uk_name, keg, keg->uk_size, keg->uk_rsize, keg->uk_flags,
keg->uk_ipers, keg->uk_ppera,
- (keg->uk_ipers * keg->uk_pages) - keg->uk_free, keg->uk_free,
- (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers);
+ (keg->uk_pages / keg->uk_ppera) * keg->uk_ipers - keg->uk_free,
+ keg->uk_free, (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers);
printf("Part slabs:\n");
LIST_FOREACH(slab, &keg->uk_part_slab, us_link)
slab_print(slab);