Page MenuHomeFreeBSD

D26772.id78194.diff
No OneTemporary

D26772.id78194.diff

Index: sys/vm/uma_core.c
===================================================================
--- sys/vm/uma_core.c
+++ sys/vm/uma_core.c
@@ -1414,6 +1414,52 @@
uma_total_dec(PAGE_SIZE * keg->uk_ppera);
}
+static void
+keg_drain_domain(uma_keg_t keg, int domain)
+{
+ struct slabhead freeslabs;
+ uma_domain_t dom;
+ uma_slab_t slab, tmp;
+ int n, skip;
+
+ dom = &keg->uk_domain[domain];
+ LIST_INIT(&freeslabs);
+
+ CTR4(KTR_UMA, "keg_drain %s(%p) domain %d free items: %u",
+ keg->uk_name, keg, i, dom->ud_free_items);
+
+ KEG_LOCK(keg, domain);
+ if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0) {
+ LIST_FOREACH(slab, &dom->ud_free_slab, us_link)
+ UMA_HASH_REMOVE(&keg->uk_hash, slab);
+ }
+ LIST_SWAP(&freeslabs, &dom->ud_free_slab, uma_slab, us_link);
+ n = dom->ud_free_slabs;
+
+ /*
+ * Move any reserved items back to the keg. For most kegs this is a
+ * no-op.
+ */
+ for (skip = keg->uk_reserve; skip > 0; skip -= keg->uk_ipers) {
+ slab = LIST_FIRST(&freeslabs);
+ if (slab == NULL)
+ break;
+ LIST_REMOVE(slab, us_link);
+ LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link);
+ if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0)
+ UMA_HASH_INSERT(&keg->uk_hash, slab,
+ slab_tohashslab(slab)->uhs_data);
+ n--;
+ }
+ dom->ud_free_slabs -= n;
+ dom->ud_free_items -= n * keg->uk_ipers;
+ dom->ud_pages -= n * keg->uk_ppera;
+ KEG_UNLOCK(keg, domain);
+
+ LIST_FOREACH_SAFE(slab, &freeslabs, us_link, tmp)
+ keg_free_slab(keg, slab, keg->uk_ipers);
+}
+
/*
* Frees pages from a keg back to the system. This is done on demand from
* the pageout daemon.
@@ -1423,35 +1469,12 @@
static void
keg_drain(uma_keg_t keg)
{
- struct slabhead freeslabs;
- uma_domain_t dom;
- uma_slab_t slab, tmp;
- int i, n;
+ int i;
- if (keg->uk_flags & UMA_ZONE_NOFREE || keg->uk_freef == NULL)
+ if ((keg->uk_flags & UMA_ZONE_NOFREE) != 0)
return;
-
- for (i = 0; i < vm_ndomains; i++) {
- CTR4(KTR_UMA, "keg_drain %s(%p) domain %d free items: %u",
- keg->uk_name, keg, i, dom->ud_free_items);
- dom = &keg->uk_domain[i];
- LIST_INIT(&freeslabs);
-
- KEG_LOCK(keg, i);
- if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0) {
- LIST_FOREACH(slab, &dom->ud_free_slab, us_link)
- UMA_HASH_REMOVE(&keg->uk_hash, slab);
- }
- n = dom->ud_free_slabs;
- LIST_SWAP(&freeslabs, &dom->ud_free_slab, uma_slab, us_link);
- dom->ud_free_slabs = 0;
- dom->ud_free_items -= n * keg->uk_ipers;
- dom->ud_pages -= n * keg->uk_ppera;
- KEG_UNLOCK(keg, i);
-
- LIST_FOREACH_SAFE(slab, &freeslabs, us_link, tmp)
- keg_free_slab(keg, slab, keg->uk_ipers);
- }
+ for (i = 0; i < vm_ndomains; i++)
+ keg_drain_domain(keg, i);
}
static void

File Metadata

Mime Type
text/plain
Expires
Mon, Aug 17, 9:15 PM (3 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36841553
Default Alt Text
D26772.id78194.diff (2 KB)

Event Timeline