Should page->count ever be -1?
I'm experiencing some kind of memory leaks playing with ioremap and iounmap, and I've narrowed down the problem to iounmap refusing to unmap the memory that I just mapped. The line of code in question is
if (!PageReserved(page) && atomic_dec_and_test(&page->count)) {from page_alloc.c (this is 2.2.18pre15). It appears that page->count is already zero when this code is executed, and after it's executed, page->count becomes -1 (or more accurately, 0xFFFFFFFF). Is this acceptable, or is it an error condition?
Signature · 8 lines
Timur Tabi - [email protected] Interactive Silicon - http://www.interactivesi.com When replying to a mailing-list message, please direct the reply to the mailing list only. Don't send another copy to me. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] Please read the FAQ at http://www.tux.org/lkml/
Quoted 10 lines · Timur Tabi
I'm experiencing some kind of memory leaks playing with ioremap and iounmap, and I've narrowed down the problem to iounmap refusing to unmap the memory that I just mapped. The line of code in question is
if (!PageReserved(page) && atomic_dec_and_test(&page->count)) {from
page_alloc.c(this is 2.2.18pre15). It appears thatpage->countis already zero when this code is executed, and after it's executed,page->countbecomes -1 (or more accurately,0xFFFFFFFF). Is this acceptable, or is it an error condition?
It's an error condition. Make sure you marked the page as reserved in the mmap callback if it's not an mmio region outside RAM.
Andrea
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/
** Reply to message from Andrea Arcangeli <[email protected]> on Wed, 3 Jan 2001 22:55:05 +0100
Quoted 7 lines
Quoted 4 lines
from
page_alloc.c(this is 2.2.18pre15). It appears thatpage->countis already zero when this code is executed, and after it's executed,page->countbecomes -1 (or more accurately,0xFFFFFFFF). Is this acceptable, or is it an error condition?It's an error condition. Make sure you marked the page as reserved in the mmap callback if it's not an mmio region outside RAM.
I mark the page as reserved when I call ioremap and then unmark it after ioremap returns, but iounmap will fail if it's still reserved (the same line of code also checks the reserved bit):
if (!PageReserved(page) && atomic_dec_and_test(&page->count)) {
^^^^^^^^^^^^^^^^^^^Is this what you're saying?
iounmap just calls vfree, which does all the work. However, I'm confused at this code in vfree:
vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size); kfree(tmp);
What's the difference between vmfree_area_pages and kfree?
Signature · 8 lines
Timur Tabi - [email protected] Interactive Silicon - http://www.interactivesi.com When replying to a mailing-list message, please direct the reply to the mailing list only. Don't send another copy to me. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] Please read the FAQ at http://www.tux.org/lkml/