Deleted Added
full compact
51c51
< __FBSDID("$FreeBSD: head/sys/vm/uma_core.c 246087 2013-01-29 19:06:16Z glebius $");
---
> __FBSDID("$FreeBSD: head/sys/vm/uma_core.c 247360 2013-02-26 23:35:27Z attilio $");
81a82
> #include <vm/vm_pageout.h>
216c217
< static void *obj_alloc(uma_zone_t, int, u_int8_t *, int);
---
> static void *noobj_alloc(uma_zone_t, int, u_int8_t *, int);
1033c1034
< obj_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
---
> noobj_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
1035c1036,1037
< vm_object_t object;
---
> TAILQ_HEAD(, vm_page) alloctail;
> u_long npages;
1037,1038c1039
< vm_page_t p;
< int pages, startpages;
---
> vm_page_t p, p_next;
1040a1042
> TAILQ_INIT(&alloctail);
1042,1043d1043
< object = keg->uk_obj;
< retkva = 0;
1045,1066c1045,1056
< /*
< * This looks a little weird since we're getting one page at a time.
< */
< VM_OBJECT_LOCK(object);
< p = TAILQ_LAST(&object->memq, pglist);
< pages = p != NULL ? p->pindex + 1 : 0;
< startpages = pages;
< zkva = keg->uk_kva + pages * PAGE_SIZE;
< for (; bytes > 0; bytes -= PAGE_SIZE) {
< p = vm_page_alloc(object, pages,
< VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED);
< if (p == NULL) {
< if (pages != startpages)
< pmap_qremove(retkva, pages - startpages);
< while (pages != startpages) {
< pages--;
< p = TAILQ_LAST(&object->memq, pglist);
< vm_page_unwire(p, 0);
< vm_page_free(p);
< }
< retkva = 0;
< goto done;
---
> npages = howmany(bytes, PAGE_SIZE);
> while (npages > 0) {
> p = vm_page_alloc(NULL, 0, VM_ALLOC_INTERRUPT |
> VM_ALLOC_WIRED | VM_ALLOC_NOOBJ);
> if (p != NULL) {
> /*
> * Since the page does not belong to an object, its
> * listq is unused.
> */
> TAILQ_INSERT_TAIL(&alloctail, p, listq);
> npages--;
> continue;
1067a1058,1077
> if (wait & M_WAITOK) {
> VM_WAIT;
> continue;
> }
>
> /*
> * Page allocation failed, free intermediate pages and
> * exit.
> */
> TAILQ_FOREACH_SAFE(p, &alloctail, listq, p_next) {
> vm_page_unwire(p, 0);
> vm_page_free(p);
> }
> return (NULL);
> }
> *flags = UMA_SLAB_PRIV;
> zkva = keg->uk_kva +
> atomic_fetchadd_long(&keg->uk_offset, round_page(bytes));
> retkva = zkva;
> TAILQ_FOREACH(p, &alloctail, listq) {
1069,1070d1078
< if (retkva == 0)
< retkva = zkva;
1072d1079
< pages += 1;
1074,1076d1080
< done:
< VM_OBJECT_UNLOCK(object);
< *flags = UMA_SLAB_PRIV;
3015c3019
< uma_zone_set_obj(uma_zone_t zone, struct vm_object *obj, int count)
---
> uma_zone_reserve_kva(uma_zone_t zone, int count)
3027,3036c3031,3040
< kva = kmem_alloc_nofault(kernel_map, pages * UMA_SLAB_SIZE);
<
< if (kva == 0)
< return (0);
< if (obj == NULL)
< obj = vm_object_allocate(OBJT_PHYS, pages);
< else {
< VM_OBJECT_LOCK_INIT(obj, "uma object");
< _vm_object_allocate(OBJT_PHYS, pages, obj);
< }
---
> #ifdef UMA_MD_SMALL_ALLOC
> if (keg->uk_ppera > 1) {
> #else
> if (1) {
> #endif
> kva = kmem_alloc_nofault(kernel_map, pages * UMA_SLAB_SIZE);
> if (kva == 0)
> return (0);
> } else
> kva = 0;
3039c3043
< keg->uk_obj = obj;
---
> keg->uk_offset = 0;
3041c3045,3049
< keg->uk_allocf = obj_alloc;
---
> #ifdef UMA_MD_SMALL_ALLOC
> keg->uk_allocf = (keg->uk_ppera > 1) ? noobj_alloc : uma_small_alloc;
> #else
> keg->uk_allocf = noobj_alloc;
> #endif