Hi Benjamin,
Thank you for the explaination. But would you please give me more info about aio ?
See below.
2013/5/14 Benjamin LaHaise <bcrl@xxxxxxxxx>
On Tue, May 14, 2013 at 09:24:58AM +0800, Tang Chen wrote:You can't just decrease the page count for this to work. The pages are
> 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.
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 ?
I think the existing migratepage operation in address_space_operations can
> 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.
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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/