lkml.org 
[lkml]   [2004]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [RFC][PATCH 1/3] radix priority search tree - objrmap complexity fix
    Hi Rajesh,

    this will allow compilation with hugetlbfs, please review. thanks.

    I just finished adapting the priotree to work on my -aa tree (on top of
    anonvma and objrmap-core).

    It compiles cleanly, next is to try to boot it, in a few hours I will
    know more. If it's sort of stable I'll load it in my main desktop and
    I'll release a new 2.6-aa with it.

    The quality of the prio-tree code is excellent (so it was easy to adapt
    to my anon-vma changes that cleanups the vma merging removing useless
    locks etc..), thanks.

    As soon as the thing works the three patches
    (objrmap-core+anon-vma+prio-tree) are ready for inclusion into mainline.

    really one could nitpick that anon-vma may need a prio tree too, but
    pratically the beauty of anon-vma is that a prio tree is not needed and
    in real life it performs a lot better than a find_vma for every mm
    mapping the page.

    btw, the truncate of hugetlbfs didn't serialize correctly against the
    do_no_page page faults, that's fixed too.

    --- x/fs/hugetlbfs/inode.c.~1~ 2004-03-21 15:09:25.000000000 +0100
    +++ x/fs/hugetlbfs/inode.c 2004-03-25 23:50:32.979427008 +0100
    @@ -265,11 +265,13 @@ static void hugetlbfs_drop_inode(struct
    * vma->vm_pgoff is in PAGE_SIZE units.
    */
    static void
    -hugetlb_vmtruncate_list(struct list_head *list, unsigned long h_pgoff)
    +hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff)
    {
    struct vm_area_struct *vma;
    + struct prio_tree_iter iter;

    - list_for_each_entry(vma, list, shared) {
    + vma = __vma_prio_tree_first(root, &iter, h_pgoff, h_pgoff);
    + while (vma) {
    unsigned long h_vm_pgoff;
    unsigned long v_length;
    unsigned long h_length;
    @@ -301,6 +303,8 @@ hugetlb_vmtruncate_list(struct list_head
    zap_hugepage_range(vma,
    vma->vm_start + v_offset,
    v_length - v_offset);
    +
    + vma = __vma_prio_tree_next(vma, root, &iter, h_pgoff, h_pgoff);
    }
    }

    @@ -320,9 +324,11 @@ static int hugetlb_vmtruncate(struct ino

    inode->i_size = offset;
    down(&mapping->i_shared_sem);
    - if (!list_empty(&mapping->i_mmap))
    + /* Protect against page fault */
    + atomic_inc(&mapping->truncate_count);
    + if (unlikely(!prio_tree_empty(&mapping->i_mmap)))
    hugetlb_vmtruncate_list(&mapping->i_mmap, pgoff);
    - if (!list_empty(&mapping->i_mmap_shared))
    + if (unlikely(!prio_tree_empty(&mapping->i_mmap_shared)))
    hugetlb_vmtruncate_list(&mapping->i_mmap_shared, pgoff);
    up(&mapping->i_shared_sem);
    truncate_hugepages(mapping, offset);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-03-22 14:01    [W:2.928 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site