Page MenuHomeFreeBSD

D17704.id49621.diff
No OneTemporary

D17704.id49621.diff

Index: sys/kern/kern_cpuset.c
===================================================================
--- sys/kern/kern_cpuset.c
+++ sys/kern/kern_cpuset.c
@@ -492,20 +492,29 @@
}
/*
- * Are any of the domains in the mask empty? If so, silently
- * remove them. If only empty domains are present, we must
- * return failure.
+ * Are any of the domains in the mask empty? If so, silently
+ * remove them and update the domainset accordingly. If only empty
+ * domains are present, we must return failure.
*/
static bool
domainset_empty_vm(struct domainset *domain)
{
- int i, max;
+ int i, j, max;
max = DOMAINSET_FLS(&domain->ds_mask) + 1;
- for (i = 0; i < max; i++) {
- if (DOMAINSET_ISSET(i, &domain->ds_mask) &&
- VM_DOMAIN_EMPTY(i))
+ for (i = 0; i < max; i++)
+ if (DOMAINSET_ISSET(i, &domain->ds_mask) && VM_DOMAIN_EMPTY(i))
DOMAINSET_CLR(i, &domain->ds_mask);
+ domain->ds_cnt = DOMAINSET_COUNT(&domain->ds_mask);
+ max = DOMAINSET_FLS(&domain->ds_mask) + 1;
+ for (i = j = 0; i < max; i++) {
+ if (DOMAINSET_ISSET(i, &domain->ds_mask))
+ domain->ds_order[j++] = i;
+ else if (domain->ds_policy == DOMAINSET_POLICY_PREFER &&
+ domain->ds_prefer == i) {
+ domain->ds_policy = DOMAINSET_POLICY_ROUNDROBIN;
+ domain->ds_prefer = -1;
+ }
}
return (DOMAINSET_EMPTY(&domain->ds_mask));
@@ -1423,7 +1432,8 @@
/* Remove empty domains from the global policies. */
LIST_FOREACH(dset, &cpuset_domains, ds_link)
- (void)domainset_empty_vm(dset);
+ if (domainset_empty_vm(dset))
+ panic("empty global domainset %p", dset);
}
/*
Index: sys/vm/uma_core.c
===================================================================
--- sys/vm/uma_core.c
+++ sys/vm/uma_core.c
@@ -3608,29 +3608,30 @@
void
uma_prealloc(uma_zone_t zone, int items)
{
+ struct vm_domainset_iter di;
uma_domain_t dom;
uma_slab_t slab;
uma_keg_t keg;
- int domain, slabs;
+ int domain, flags, slabs;
keg = zone_first_keg(zone);
if (keg == NULL)
return;
KEG_LOCK(keg);
slabs = items / keg->uk_ipers;
- domain = 0;
if (slabs * keg->uk_ipers < items)
slabs++;
+ flags = M_WAITOK;
+ vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain, &flags);
while (slabs-- > 0) {
- slab = keg_alloc_slab(keg, zone, domain, M_WAITOK);
+ slab = keg_alloc_slab(keg, zone, domain, flags);
if (slab == NULL)
return;
MPASS(slab->us_keg == keg);
dom = &keg->uk_domain[slab->us_domain];
LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link);
- do {
- domain = (domain + 1) % vm_ndomains;
- } while (VM_DOMAIN_EMPTY(domain));
+ if (vm_domainset_iter_policy(&di, &domain) != 0)
+ break;
}
KEG_UNLOCK(keg);
}
Index: sys/vm/vm_init.c
===================================================================
--- sys/vm/vm_init.c
+++ sys/vm/vm_init.c
@@ -123,12 +123,18 @@
domainset_init();
/*
- * Initializes resident memory structures. From here on, all physical
+ * Initialize resident memory structures. From here on, all physical
* memory is accounted for, and we use only virtual addresses.
*/
vm_set_page_size();
virtual_avail = vm_page_startup(virtual_avail);
+ /*
+ * Set an initial domain policy for thread0 so that allocations
+ * can work.
+ */
+ domainset_zero();
+
#ifdef UMA_MD_SMALL_ALLOC
/* Announce page availability to UMA. */
uma_startup1();
Index: sys/vm/vm_kern.c
===================================================================
--- sys/vm/vm_kern.c
+++ sys/vm/vm_kern.c
@@ -800,7 +800,6 @@
vmd = vm_pagequeue_domain(m);
vm_domain_free_lock(vmd);
vm_phys_free_pages(m, 0);
- vmd->vmd_page_count++;
vm_domain_free_unlock(vmd);
vm_domain_freecnt_inc(vmd, 1);
Index: sys/vm/vm_page.c
===================================================================
--- sys/vm/vm_page.c
+++ sys/vm/vm_page.c
@@ -855,11 +855,6 @@
*/
vm_reserv_init();
#endif
- /*
- * Set an initial domain policy for thread0 so that allocations
- * can work.
- */
- domainset_zero();
return (vaddr);
}
Index: sys/vm/vm_pageout.c
===================================================================
--- sys/vm/vm_pageout.c
+++ sys/vm/vm_pageout.c
@@ -2072,41 +2072,41 @@
static void
vm_pageout(void)
{
- int error;
- int i;
+ struct proc *p;
+ struct thread *td;
+ int error, first, i;
+
+ p = curproc;
+ td = curthread;
swap_pager_swap_init();
- snprintf(curthread->td_name, sizeof(curthread->td_name), "dom0");
- error = kthread_add(vm_pageout_laundry_worker, NULL, curproc, NULL,
- 0, 0, "laundry: dom0");
- if (error != 0)
- panic("starting laundry for domain 0, error %d", error);
- for (i = 1; i < vm_ndomains; i++) {
+ for (first = -1, i = 0; i < vm_ndomains; i++) {
if (VM_DOMAIN_EMPTY(i)) {
if (bootverbose)
printf("domain %d empty; skipping pageout\n",
i);
continue;
}
-
- error = kthread_add(vm_pageout_worker, (void *)(uintptr_t)i,
- curproc, NULL, 0, 0, "dom%d", i);
- if (error != 0) {
- panic("starting pageout for domain %d, error %d\n",
- i, error);
+ if (first == -1)
+ first = i;
+ else {
+ error = kthread_add(vm_pageout_worker,
+ (void *)(uintptr_t)i, p, NULL, 0, 0, "dom%d", i);
+ if (error != 0)
+ panic("starting pageout for domain %d: %d\n",
+ i, error);
}
error = kthread_add(vm_pageout_laundry_worker,
- (void *)(uintptr_t)i, curproc, NULL, 0, 0,
- "laundry: dom%d", i);
+ (void *)(uintptr_t)i, p, NULL, 0, 0, "laundry: dom%d", i);
if (error != 0)
- panic("starting laundry for domain %d, error %d",
- i, error);
+ panic("starting laundry for domain %d: %d", i, error);
}
- error = kthread_add(uma_reclaim_worker, NULL, curproc, NULL,
- 0, 0, "uma");
+ error = kthread_add(uma_reclaim_worker, NULL, p, NULL, 0, 0, "uma");
if (error != 0)
panic("starting uma_reclaim helper, error %d\n", error);
- vm_pageout_worker((void *)(uintptr_t)0);
+
+ snprintf(td->td_name, sizeof(td->td_name), "dom%d", first);
+ vm_pageout_worker((void *)(uintptr_t)first);
}
/*

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 4, 8:37 PM (5 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30841999
Default Alt Text
D17704.id49621.diff (5 KB)

Event Timeline