Skip to contentSkip to conversation

Should page->count ever be -1?

DISCUSSION Timur Tabi 2 participants 3 messages Jan 3, 2001

lore
Share & tools
lore

Timur Tabi

author
#0 lore raw

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/
#1 lore raw
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 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?

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/

author
#2 lore raw

** 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 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?

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/