Hi Andrew, On Wed, 7 Mar 2012 23:32:20 -0800 Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > > Actually they're different. I reworked the earlier patch as below. OK. But some comments. > diff -puN arch/x86/mm/hugetlbpage.c~hugetlb-drop-prev_vma-in-hugetlb_get_unmapped_area_topdown arch/x86/mm/hugetlbpage.c > --- a/arch/x86/mm/hugetlbpage.c~hugetlb-drop-prev_vma-in-hugetlb_get_unmapped_area_topdown > +++ a/arch/x86/mm/hugetlbpage.c > @@ -308,7 +308,7 @@ static unsigned long hugetlb_get_unmappe > { > struct hstate *h = hstate_file(file); > struct mm_struct *mm = current->mm; > - struct vm_area_struct *vma, *prev_vma; > + struct vm_area_struct *vma; You still remove prev_vma ... > unsigned long base = mm->mmap_base, addr = addr0; > unsigned long largest_hole = mm->cached_hole_size; > int first_time = 1; > @@ -334,25 +334,16 @@ try_again: > * i.e. return with success: > */ > vma = find_vma(mm, addr); > - if (!vma) > - return addr; > - > - /* > - * new region fits between prev_vma->vm_end and > - * vma->vm_start, use it: > - */ > - prev_vma = vma->vm_prev; > - if (addr + len <= vma->vm_start && > - (!prev_vma || (addr >= prev_vma->vm_end))) { > + if (vma) > + prev_vma = vma->vm_prev; But then assign to it ... > + if (!vma || addr + len <= vma->vm_start) { > /* remember the address as a hint for next time */ > mm->cached_hole_size = largest_hole; > return (mm->free_area_cache = addr); > - } else { > + } else if (mm->free_area_cache == vma->vm_end) { > /* pull free_area_cache down to the first hole */ > - if (mm->free_area_cache == vma->vm_end) { > - mm->free_area_cache = vma->vm_start; > - mm->cached_hole_size = largest_hole; > - } > + mm->free_area_cache = vma->vm_start; > + mm->cached_hole_size = largest_hole; > } > > /* remember the largest hole we saw so far */ But it never gets used. -- Cheers, Stephen Rothwell sfr@xxxxxxxxxxxxxxxx
Attachment:
pgpDNHbhZw5XZ.pgp
Description: PGP signature