Re: question on page-migration code

Ray Bryant
2005-04-11T19:00:02Z

Marcelo Tosatti wrote:

> Who is using the page?
>
> A little debugging might help similar to what bad_page does can help:
>
> printk(KERN_EMERG "flags:0x%0*lx mapping:%p mapcount:%d count:%d\n",
> (int)(2*sizeof(page_flags_t)), (unsigned long)page->flags,
> page->mapping, page_mapcount(page), page_count(page));
> --

Marcello,

I wrote:

"PagePrivate() is cleared by truncation specific code in migrate_onepage(),
but it doesn't appear to be cleared (directly) by code on the
generic_migrate_page() patch. I wonder if this has something to do with
the problem I am seeing. "

Ooops. I didn't look deep enough. migrate_page_common() calls
writeback_and_free_buffers(), which in turn calls try_to_release_page()
which will eventually call down to __clear_page_buffers() which will
clear PagePrivate().

So it looks like the following is perhaps what is happening:

(1) We come into migrate_one_page() with the pages dirty. (The first
time we enter the -EAGAIN section of migate_page_common() we have
flags = 105d, the last time through before succeeding, flags are
104d, and when we do return flags=004d.
(2) We have to wait around until the pages get paged out before we can
migrated them. (flags=004d).

I'll have to check and see if I believe it might take 3 minutes to page
out all of the pages of my application. If so, then this explains what
is happening.

Does that make sense?

--
Best Regards,
Ray