X-Git-Url: https://git.stricted.de/?a=blobdiff_plain;f=mm%2Fvmalloc.c;h=0a77f6632f482df1be3609558d94bf334863388b;hb=f5aa73ff5c0753e91c658b6ce6af8baeac9608df;hp=d365724feb05206fc0b37c852f5859499f1cb6b3;hpb=e0fd9affeb64088eff407dfc98bbd3a5c17ea479;p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git diff --git a/mm/vmalloc.c b/mm/vmalloc.c index d365724feb05..0a77f6632f48 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -388,12 +388,12 @@ nocache: addr = ALIGN(first->va_end, align); if (addr < vstart) goto nocache; - if (addr + size - 1 < addr) + if (addr + size < addr) goto overflow; } else { addr = ALIGN(vstart, align); - if (addr + size - 1 < addr) + if (addr + size < addr) goto overflow; n = vmap_area_root.rb_node; @@ -420,14 +420,21 @@ nocache: if (addr + cached_hole_size < first->va_start) cached_hole_size = first->va_start - addr; addr = ALIGN(first->va_end, align); - if (addr + size - 1 < addr) + if (addr + size < addr) goto overflow; + /* if (list_is_last(&first->list, &vmap_area_list)) goto found; first = list_entry(first->list.next, struct vmap_area, list); + */ + n = rb_next(&first->rb_node); + if (n) + first = rb_entry(n, struct vmap_area, rb_node); + else + goto found; } found: @@ -931,8 +938,13 @@ again: int i; spin_lock(&vb->lock); - if (vb->free < 1UL << order) + if (vb->free < 1UL << order) { + if (vb->free + vb->dirty == VMAP_BBMAP_BITS && vb->dirty != VMAP_BBMAP_BITS) { + /* free left too small, handle as fragmented scenario */ + purge = 1; + } goto next; + } i = bitmap_find_free_region(vb->alloc_map, VMAP_BBMAP_BITS, order);