lkml.org 
[lkml]   [2008]   [Jan]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 3/4] mmu_notifier: invalidate_page callbacks for subsystems with rmap
    Callbacks to remove individual pages if the subsystem has an
    rmap capability. The pagelock is held but no spinlocks are held.
    The refcount of the page is elevated so that dropping the refcount
    in the subsystem will not directly free the page.

    The callbacks occur after the Linux rmaps have been walked.

    Robin: We do not hold the page lock in __xip_unmap().
    I guess we do not need to increase the refcount there since the
    page is static and cannot go away?

    Signed-off-by: Christoph Lameter <clameter@sgi.com>

    Index: linux-2.6/mm/filemap_xip.c
    ===================================================================
    --- linux-2.6.orig/mm/filemap_xip.c 2008-01-24 19:47:28.000000000 -0800
    +++ linux-2.6/mm/filemap_xip.c 2008-01-24 20:30:31.000000000 -0800
    @@ -13,6 +13,7 @@
    #include <linux/module.h>
    #include <linux/uio.h>
    #include <linux/rmap.h>
    +#include <linux/mmu_notifier.h>
    #include <linux/sched.h>
    #include <asm/tlbflush.h>

    @@ -183,6 +184,9 @@ __xip_unmap (struct address_space * mapp
    if (!page)
    return;

    + if (PageExternalRmap(page))
    + mmu_rmap_notifier(invalidate_page, page);
    +
    spin_lock(&mapping->i_mmap_lock);
    vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
    mm = vma->vm_mm;
    Index: linux-2.6/mm/rmap.c
    ===================================================================
    --- linux-2.6.orig/mm/rmap.c 2008-01-24 19:47:28.000000000 -0800
    +++ linux-2.6/mm/rmap.c 2008-01-24 20:30:31.000000000 -0800
    @@ -49,6 +49,7 @@
    #include <linux/rcupdate.h>
    #include <linux/module.h>
    #include <linux/kallsyms.h>
    +#include <linux/mmu_notifier.h>

    #include <asm/tlbflush.h>

    @@ -473,6 +474,8 @@ int page_mkclean(struct page *page)
    struct address_space *mapping = page_mapping(page);
    if (mapping) {
    ret = page_mkclean_file(mapping, page);
    + if (unlikely(PageExternalRmap(page)))
    + mmu_rmap_notifier(invalidate_page, page);
    if (page_test_dirty(page)) {
    page_clear_dirty(page);
    ret = 1;
    @@ -971,6 +974,9 @@ int try_to_unmap(struct page *page, int
    else
    ret = try_to_unmap_file(page, migration);

    + if (unlikely(PageExternalRmap(page)))
    + mmu_rmap_notifier(invalidate_page, page);
    +
    if (!page_mapped(page))
    ret = SWAP_SUCCESS;
    return ret;
    --


    \
     
     \ /
      Last update: 2008-01-25 07:01    [W:4.526 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site