Date: Fri, 2 Jun 2006 16:30:08 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 98351 for review Message-ID: <200606021630.k52GU8gN001621@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=98351 Change 98351 by jhb@jhb_mutex on 2006/06/02 16:29:50 Move the vm.blacklist handling up a layer so that we only try to look up the tunable once during boot instead of once for every memory page in the system. This should make Kip happy. Affected files ... .. //depot/projects/smpng/sys/vm/vm_page.c#75 edit .. //depot/projects/smpng/sys/vm/vm_pageq.c#19 edit Differences ... ==== //depot/projects/smpng/sys/vm/vm_page.c#75 (text+ko) ==== @@ -158,6 +158,36 @@ } /* + * vm_page_blacklist_lookup: + * + * See if a physical address in this page has been listed + * in the blacklist tunable. Entries in the tunable are + * separated by spaces or commas. If an invalid integer is + * encountered then the rest of the string is skipped. + */ +static int +vm_page_blacklist_lookup(char *list, vm_paddr_t pa) +{ + vm_paddr_t bad; + char *cp, *pos; + + for (pos = list; *pos != '\0'; pos = cp) { + bad = strtoq(pos, &cp, 0); + if (*cp != '\0') { + if (*cp == ' ' || *cp == ',') { + cp++; + if (cp == pos) + continue; + } else + break; + } + if (pa == trunc_page(bad)) + return (1); + } + return (0); +} + +/* * vm_page_startup: * * Initializes the resident memory module. @@ -177,6 +207,7 @@ vm_paddr_t pa; int nblocks; vm_paddr_t last_pa; + char *list; /* the biggest memory array is the second group of pages */ vm_paddr_t end; @@ -293,14 +324,23 @@ */ cnt.v_page_count = 0; cnt.v_free_count = 0; + list = getenv("vm.blacklist"); for (i = 0; phys_avail[i + 1] && npages > 0; i += 2) { pa = phys_avail[i]; last_pa = phys_avail[i + 1]; while (pa < last_pa && npages-- > 0) { + if (list != NULL && + vm_page_blacklist_lookup(list, pa)) { + printf("Skipping page with pa 0x%jx\n", + (uintmax_t)pa); + + continue; + } vm_pageq_add_new_page(pa); pa += PAGE_SIZE; } } + freeenv(list); return (vaddr); } ==== //depot/projects/smpng/sys/vm/vm_pageq.c#19 (text+ko) ==== @@ -191,37 +191,7 @@ vm_page_t vm_pageq_add_new_page(vm_paddr_t pa) { - vm_paddr_t bad; vm_page_t m; - char *cp, *list, *pos; - - /* - * See if a physical address in this page has been listed - * in the blacklist tunable. Entries in the tunable are - * separated by spaces or commas. If an invalid integer is - * encountered then the rest of the string is skipped. - */ - if (testenv("vm.blacklist")) { - list = getenv("vm.blacklist"); - for (pos = list; *pos != '\0'; pos = cp) { - bad = strtoq(pos, &cp, 0); - if (*cp != '\0') { - if (*cp == ' ' || *cp == ',') { - cp++; - if (cp == pos) - continue; - } else - break; - } - if (pa == trunc_page(bad)) { - printf("Skipping page with pa 0x%jx\n", - (uintmax_t)pa); - freeenv(list); - return (NULL); - } - } - freeenv(list); - } atomic_add_int(&cnt.v_page_count, 1); m = PHYS_TO_VM_PAGE(pa);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606021630.k52GU8gN001621>