diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 491e76c408aad14bc0e76a2f0f7af4334a35935f..fe24288399a87abff304a6c60d60c80e2887f05f 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3127,10 +3127,20 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, if (va == NULL) goto overflow; + /* + * If required width exeeds current VA block, move + * base downwards and then recheck. + */ + if (base + end > va->va_end) { + base = pvm_determine_end_from_reverse(&va, align) - end; + term_area = area; + continue; + } + /* * If this VA does not fit, move base downwards and recheck. */ - if (base + start < va->va_start || base + end > va->va_end) { + if (base + start < va->va_start) { va = node_to_va(rb_prev(&va->rb_node)); base = pvm_determine_end_from_reverse(&va, align) - end; term_area = area;