See uma.h */
| 4896 | |
| 4897 | /* See uma.h */ |
| 4898 | void |
| 4899 | uma_prealloc(uma_zone_t zone, int items) |
| 4900 | { |
| 4901 | struct vm_domainset_iter di; |
| 4902 | uma_domain_t dom; |
| 4903 | uma_slab_t slab; |
| 4904 | uma_keg_t keg; |
| 4905 | int aflags, domain, slabs; |
| 4906 | |
| 4907 | KEG_GET(zone, keg); |
| 4908 | slabs = howmany(items, keg->uk_ipers); |
| 4909 | while (slabs-- > 0) { |
| 4910 | aflags = M_NOWAIT; |
| 4911 | vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain, |
| 4912 | &aflags); |
| 4913 | for (;;) { |
| 4914 | slab = keg_alloc_slab(keg, zone, domain, M_WAITOK, |
| 4915 | aflags); |
| 4916 | if (slab != NULL) { |
| 4917 | dom = &keg->uk_domain[slab->us_domain]; |
| 4918 | /* |
| 4919 | * keg_alloc_slab() always returns a slab on the |
| 4920 | * partial list. |
| 4921 | */ |
| 4922 | LIST_REMOVE(slab, us_link); |
| 4923 | LIST_INSERT_HEAD(&dom->ud_free_slab, slab, |
| 4924 | us_link); |
| 4925 | dom->ud_free_slabs++; |
| 4926 | KEG_UNLOCK(keg, slab->us_domain); |
| 4927 | break; |
| 4928 | } |
| 4929 | if (vm_domainset_iter_policy(&di, &domain) != 0) |
| 4930 | vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0); |
| 4931 | } |
| 4932 | } |
| 4933 | } |
| 4934 | |
| 4935 | /* |
| 4936 | * Returns a snapshot of memory consumption in bytes. |
no test coverage detected