From: Andrew Morton <akpm@zip.com.au>
To: "Martin J. Bligh" <Martin.Bligh@us.ibm.com>
Cc: Dave Hansen <haveblue@us.ibm.com>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: truncate_list_pages() BUG and confusion
Date: Fri, 08 Mar 2002 13:53:16 -0800 [thread overview]
Message-ID: <3C8932CC.761C8829@zip.com.au> (raw)
In-Reply-To: <3C880EFF.A0789715@zip.com.au>, <3C8809BA.4070003@us.ibm.com> <3C880EFF.A0789715@zip.com.au> <17920000.1015622098@flay>
"Martin J. Bligh" wrote:
>
> ...
> So truncate_list_pages does a page_cache_get(page), which increments
> the count. Nowhere does it decrement the count, or do an UnlockPage
> before it gets into page_cache_release, which looks like this:
well... truncate_list_pages _does_ unlock the page. Let's
snip some bits:
truncate_list_pages()
{
...
/* Bump the refcount. From now until the matching
* page_cache_release(), the page *cannot* be freed,
* because we hold a reference
*/
page_cache_get(page);
lock_page(page);
truncate_complete_page(page);
--> {
remove_inode_page(page); /* Remove from pagecache */
/*
* We now drop the refcount which is due to
* presence in the pagecache. This can't free
* the page, because truncate_list_pages() holds a reference
*/
page_cache_release(page);
}
<---
UnlockPage(); /* Remember, wait_on_page() is an indirect unlock, too */
/*
* Now truncate_list_pages() drops its temporary reference.
* The page is unlocked. If this was the last reference
* (and it usually will be) then the page will now be freed.
*/
page_cache_release(page);
}
> void page_cache_release(struct page *page)
> {
> if (!PageReserved(page) && put_page_testzero(page)) {
> if (PageLRU(page))
> lru_cache_del(page);
> __free_pages_ok(page, 0);
> }
> }
>
> We enter page_cache_release with the supposedly locked, and its count
> non-zero (we incremented it). put_page_testzero does atomic_dec_and_test
> on count which says it returns true if the result is 0, or false for all other cases.
>
> So if nobody else was holding a reference to the page, we've decremented
> it's count to 0, and put_page_testzero returns 1. We then try to free the page.
> It's still locked. BUG.
If the page_cache_release() in truncate_complete_page() is calling
__free_pages_ok() then something really horrid has happened.
Yes, it could be that the page has had its refcount incorrectly
decremented somewhere.
Or the page wasn't in the pagecache at all.
Is this happening with the dbench/ENOSPC/1k blocksize testcase?
In that case, something is clearly going wrong with the association
of buffers against the page. And the presence of buffers at page->buffers
_also_ contributes to page->count. So there's a commonality here.
Possibly we forgot to increment the page count when we added buffers,
or we bogusly thought the page had buffers when it didn't, and then
dropped the page refcount when we thought we removed the buffers
which weren't really there.
-
next prev parent reply other threads:[~2002-03-08 21:55 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-03-08 0:45 truncate_list_pages() BUG and confusion Dave Hansen
2002-03-08 1:08 ` Andrew Morton
2002-03-08 2:54 ` Dave Hansen
2002-03-08 2:55 ` Martin J. Bligh
2002-03-08 3:02 ` Andrew Morton
2002-03-08 3:04 ` Dave Hansen
2002-03-08 21:14 ` Martin J. Bligh
2002-03-08 21:53 ` Andrew Morton [this message]
2002-03-08 22:13 ` Dave Hansen
2002-03-08 22:35 ` Andrew Morton
2002-03-09 0:04 ` Martin J. Bligh
2002-03-09 0:17 ` Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3C8932CC.761C8829@zip.com.au \
--to=akpm@zip.com.au \
--cc=Martin.Bligh@us.ibm.com \
--cc=haveblue@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox