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 |