On Thu, Nov 28, 2013 at 04:48:42PM +0900, Joonsoo Kim wrote: > There are a lot of common parts in traversing functions, but there are > also a little of uncommon parts in it. By assigning proper function > pointer on each rmap_walker_control, we can handle these difference > correctly. > > Following are differences we should handle. > > 1. difference of lock function in anon mapping case > 2. nonlinear handling in file mapping case > 3. prechecked condition: > checking memcg in page_referenced(), > checking VM_SHARE in page_mkclean() > checking temporary vma in try_to_unmap() > 4. exit condition: > checking page_mapped() in try_to_unmap() > > So, in this patch, I introduce 4 function pointers to > handle above differences. > > Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> > > diff --git a/include/linux/rmap.h b/include/linux/rmap.h > index 0f65686..58624b4 100644 > --- a/include/linux/rmap.h > +++ b/include/linux/rmap.h > @@ -239,6 +239,12 @@ struct rmap_walk_control { > int (*main)(struct page *, struct vm_area_struct *, > unsigned long, void *); > void *arg; /* argument to main function */ > + int (*main_done)(struct page *page); /* check exit condition */ > + int (*file_nonlinear)(struct page *, struct address_space *, > + struct vm_area_struct *vma); > + struct anon_vma *(*anon_lock)(struct page *); > + int (*vma_skip)(struct vm_area_struct *, void *); Can you add some comments about how these callbacks work and when it should be set to for future users? For example, anon_lock() are used to override the default behavior and it's not trivial. > + void *skip_arg; /* argument to vma_skip function */ I think that it's better to move this field into the structure pointed to by arg (which can be defined by each caller in its own way) and pass arg to *vma_skip(). Thanks, Naoya Horiguchi -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>