Re: fix iounmap and a pageattr memleak (x86 and x86-64)

Dave Hansen
2004-11-05T01:55:42Z

On Thu, 2004-11-04 at 16:53, Andrea Arcangeli wrote:
> The only chance for kpte_page to be freed, is to be == 1 in that place.
> If kpte_page is == 1, it will be freed via list_add and the master page
> will be regenerated giving it a chance to get performance back. If it's
> 0, it means we leaked memory as far as I can tell.
>
> It's impossible a pte had a 0 page_count() and not to be in the freelist
> already. There is no put_page at all in that whole path, there's only a
> __put_page, so it's a memleak to get == 0 in there on any pte or pmd or
> whatever else we cannot have put in the freelist already.

Ahhh. I forgot about the allocator's reference on the page. However,
there still seems to be something fishy here.

The page that's causing trouble's pfn is 0x0000000f. It's also set as
PageReserved(). We may have some imbalance with page counts when the
page is PageReserved() that this is catching. I can't find any
asymmetric use of kernel_map_pages(). Both the slab and the allocator
appear to be behaving themselves.

I don't even see a case where that particular page has a get_page() done
on it before the first __change_page_attr() call on it. So, it probably
still has its page_count()==0 from the original set in
memmap_init_zone().

What happens when a pte page is bootmem-allocated? I *think* that's the
situation that I'm hitting. In that case, we can either try to hunt
down the real 'struct pages' after everything is brought up, or we can
just skip the BUG_ON() if the page is reserved. Any thoughts?

-- Dave