Hi Benjamin, Thank you for the explaination. But would you please give me more info about aio ? See below. 2013/5/14 Benjamin LaHaise > On Tue, May 14, 2013 at 09:24:58AM +0800, Tang Chen wrote: > > Hi Mel, Benjamin, Jeff, > > > > On 05/13/2013 11:01 PM, Benjamin LaHaise wrote: > > >On Mon, May 13, 2013 at 10:54:03AM -0400, Jeff Moyer wrote: > > >>How do you propose to move the ring pages? > > > > > >It's the same problem as doing a TLB shootdown: flush the old pages from > > >userspace's mapping, copy any existing data to the new pages, then > > >repopulate the page tables. It will likely require the addition of > > >address_space_operations for the mapping, but that's not too hard to do. > > > > > > > I think we add migrate_unpin() callback to decrease page->count if > > necessary, > > and migrate the page to a new page, and add migrate_pin() callback to pin > > the new page again. > > You can't just decrease the page count for this to work. The pages are > pinned because aio_complete() can occur at any time and needs to have a > place to write the completion events. When changing pages, aio has to > take the appropriate lock when changing one page for another. > I saw in aio_complete(), it holds kioctx->ctx_lock. Can we hold this lock when we migrate aio ring pages ? > > > The migrate procedure will work just as before. We use callbacks to > > decrease > > the page->count before migration starts, and increase it when the > migration > > is done. > > > > And migrate_pin() and migrate_unpin() callbacks will be added to > > struct address_space_operations. > > I think the existing migratepage operation in address_space_operations can > be used. Does it get called when hot unplug occurs? That is: is testing > with the migrate_pages syscall similar enough to the memory removal case? > For anonymous pages, they don't have address_space, so they don't have address_space_operations. And aio ring pages are anonymous pages, right ? In move_to_new_page(), kernel will decide which function to call. if (!mapping) rc = migrate_page(mapping, newpage, page, mode); else if (mapping->a_ops->migratepage) rc = mapping->a_ops->migratepage(mapping, newpage, page, mode); else rc = fallback_migrate_page(mapping, newpage, page, mode); And for aio ring pages, it always call migrate_page(), right ? Thanks. :) > > -ben > > > Is that right ? > > > > If so, I'll be working on it. > > > > Thanks. :) > > -- > "Thought is the essence of where you are now." > -- > 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/ >