Re: [PATCH] mm: add replace_page_cache_page() function

From: Minchan Kim
Date: Thu Dec 16 2010 - 20:40:59 EST


Hi Hugh,

On Fri, Dec 17, 2010 at 10:21 AM, Hugh Dickins <hughd@xxxxxxxxxx> wrote:
> On Fri, 17 Dec 2010, Minchan Kim wrote:
>> On Thu, Dec 16, 2010 at 12:59:58PM +0100, Miklos Szeredi wrote:
>> > On Thu, 16 Dec 2010, Minchan Kim wrote:
>> > >
>> > > Why do you release reference of old?
>> >
>> > That's the page cache reference we release.  Just like we acquire the
>> > page cache reference for "new" above.
>>
>> I mean current page cache handling semantic and page reference counting semantic
>> is separeated. For example, remove_from_page_cache doesn't drop the reference of page.
>> That's because we need more works after drop the page from page cache.
>> Look at shmem_writepage, truncate_complete_page.
>
> I disagree with you there: I like the way Miklos made it symmetric,
> I like the way delete_from_swap_cache drops the swap cache reference,
> I dislike the way remove_from_page_cache does not - I did once try to
> change that, but did a bad job, messed up reiserfs or reiser4 I forget
> which, retreated in shame.

I agree symmetric is good. I just said current fact which is that
remove_from_page_cache doesn't release ref.
So I thought we have to match current semantic to protect confusing.
Okay. I will not oppose current semantics.
Instead of it, please add it (ex, caller should hold the page
reference) in function description.

I am happy to hear that you tried it.
Although it is hard, I think it's very valuable thing.
Could you give me hint to googling your effort and why it is failed?

>
> In both the examples you give, shmem_writepage and truncate_complete_page,
> the caller has to be holding their own reference, in part because they
> locked the page, and will need to unlock it before releasing their ref.
> I think that would be true of any replace_page_cache_page caller.

Agree.

>
>>
>> You makes the general API and caller might need works before the old page
>> is free. So how about this?
>>
>> err = replace_page_cache_page(oldpage, newpage, GFP_KERNEL);
>> if (err) {
>>         ...
>> }
>>
>> page_cache_release(oldpage); /* drop ref of page cache */
>>
>>
>> >
>> > I suspect it's historic that page_cache_release() doesn't drop the
>> > page cache ref.
>>
>> Sorry I can't understand your words.
>
> Me neither: I believe Miklos meant __remove_from_page_cache() rather
> than page_cache_release() in that instance.

Maybe. :)

Thanks for the comment, Hugh.
>
> Hugh
>



--
Kind regards,
Minchan Kim
--
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/