View | Details | Raw Unified | Return to bug 248008 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/vm/uma_core.c (-27 / +47 lines)
Lines 1404-1409 keg_free_slab(uma_keg_t keg, uma_slab_t slab, int start) Link Here
1404
	uma_total_dec(PAGE_SIZE * keg->uk_ppera);
1404
	uma_total_dec(PAGE_SIZE * keg->uk_ppera);
1405
}
1405
}
1406
1406
1407
static void
1408
keg_drain_domain(uma_keg_t keg, int domain)
1409
{
1410
	struct slabhead freeslabs;
1411
	uma_domain_t dom;
1412
	uma_slab_t slab, tmp;
1413
	int n, skip;
1414
1415
	dom = &keg->uk_domain[domain];
1416
	LIST_INIT(&freeslabs);
1417
1418
	CTR4(KTR_UMA, "keg_drain %s(%p) domain %d free items: %u",
1419
	    keg->uk_name, keg, i, dom->ud_free_items);
1420
1421
	KEG_LOCK(keg, domain);
1422
	if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0) {
1423
		skip = keg->uk_reserve;
1424
		LIST_FOREACH(slab, &dom->ud_free_slab, us_link) {
1425
			if (skip > 0)
1426
				skip -= keg->uk_ppera;
1427
			else
1428
				UMA_HASH_REMOVE(&keg->uk_hash, slab);
1429
		}
1430
	}
1431
	LIST_SWAP(&freeslabs, &dom->ud_free_slab, uma_slab, us_link);
1432
	n = dom->ud_free_slabs;
1433
	for (skip = keg->uk_reserve; skip > 0; skip -= keg->uk_ppera) {
1434
		slab = LIST_FIRST(&freeslabs);
1435
		if (slab == NULL)
1436
			break;
1437
		LIST_REMOVE(slab, us_link);
1438
		LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link);
1439
		n--;
1440
	}
1441
	dom->ud_free_slabs -= n;
1442
	dom->ud_free_items -= n * keg->uk_ipers;
1443
	dom->ud_pages -= n * keg->uk_ppera;
1444
	KEG_UNLOCK(keg, domain);
1445
1446
	LIST_FOREACH_SAFE(slab, &freeslabs, us_link, tmp)
1447
		keg_free_slab(keg, slab, keg->uk_ipers);
1448
}
1449
1407
/*
1450
/*
1408
 * Frees pages from a keg back to the system.  This is done on demand from
1451
 * Frees pages from a keg back to the system.  This is done on demand from
1409
 * the pageout daemon.
1452
 * the pageout daemon.
Lines 1413-1447 keg_free_slab(uma_keg_t keg, uma_slab_t slab, int start) Link Here
1413
static void
1456
static void
1414
keg_drain(uma_keg_t keg)
1457
keg_drain(uma_keg_t keg)
1415
{
1458
{
1416
	struct slabhead freeslabs;
1459
	int i;
1417
	uma_domain_t dom;
1418
	uma_slab_t slab, tmp;
1419
	int i, n;
1420
1460
1421
	if (keg->uk_flags & UMA_ZONE_NOFREE || keg->uk_freef == NULL)
1461
	if ((keg->uk_flags & UMA_ZONE_NOFREE) != 0)
1422
		return;
1462
		return;
1423
1463
	for (i = 0; i < vm_ndomains; i++)
1424
	for (i = 0; i < vm_ndomains; i++) {
1464
		keg_drain_domain(keg, i);
1425
		CTR4(KTR_UMA, "keg_drain %s(%p) domain %d free items: %u",
1426
		    keg->uk_name, keg, i, dom->ud_free_items);
1427
		dom = &keg->uk_domain[i];
1428
		LIST_INIT(&freeslabs);
1429
1430
		KEG_LOCK(keg, i);
1431
		if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0) {
1432
			LIST_FOREACH(slab, &dom->ud_free_slab, us_link)
1433
				UMA_HASH_REMOVE(&keg->uk_hash, slab);
1434
		}
1435
		n = dom->ud_free_slabs;
1436
		LIST_SWAP(&freeslabs, &dom->ud_free_slab, uma_slab, us_link);
1437
		dom->ud_free_slabs = 0;
1438
		dom->ud_free_items -= n * keg->uk_ipers;
1439
		dom->ud_pages -= n * keg->uk_ppera;
1440
		KEG_UNLOCK(keg, i);
1441
1442
		LIST_FOREACH_SAFE(slab, &freeslabs, us_link, tmp)
1443
			keg_free_slab(keg, slab, keg->uk_ipers);
1444
	}
1445
}
1465
}
1446
1466
1447
static void
1467
static void

Return to bug 248008