[2.4] update ref counts on all allocated pages
Subsystems (2)
PATCH 1/1 [2.4] update ref counts on all allocated pages
The following patch sets the ref count on all pages of an allocation. This allows an allocation with order>0 to be freed via individual __free_page() calls within vfree().
This is important on non cache coherent processors which have a pci_alloc_consistent/consistent_alloc() implementation that involves creating a vmalloc area cache inhibited mapping of allocated pages.
Because of this implementation, the implementation of pci_free_consistent/consistent_free is done via a vfree(). Without this patch only the first page of the allocated memory is freed since successive pages all have ref counts of zero.
-Matt
===== mm/page_alloc.c 1.56 vs edited =====
mm/page_alloc.c +5 -1
@@ -203,6 +203,7 @@struct list_head *head, *curr;unsigned long flags;struct page *page; +int i;spin_lock_irqsave (&zone->lock, flags); do {
@@ -224,7 +225,10 @@ page =expand (zone, page, index, order, curr_order, area);spin_unlock_irqrestore (&zone->lock, flags); -set_page_count (page,1 ); +/* Set ref count on all pages */ +for (i =0 ; i < (1 << order); i++) +set_page_count (page+i,1 ); +if (BAD_RANGE (zone,page))BUG ();if (PageLRU (page))
Signature · 7 lines
Matt Porter [email protected] This is Linux Country. On a quiet night, you can hear Windows reboot. -- Matt Porter [email protected] This is Linux Country. On a quiet night, you can hear Windows reboot.
Quoted 3 lines · Matt Porter
The following patch sets the ref count on all pages of an allocation. This allows an allocation with order>0 to be freed via individual
__free_page()calls withinvfree().
If your pci_alloc_consistent implementation is doing something strang, _it_ should be doing the per-page reference counts.
Don't make every caller eat this overhead.
Quoted 9 lines · David S. Miller
Quoted 3 lines · Matt Porter
The following patch sets the ref count on all pages of an allocation. This allows an allocation with order>0 to be freed via individual
__free_page()calls withinvfree().If your
pci_alloc_consistentimplementation is doing something strang, _it_ should be doing the per-page reference counts.Don't make every caller eat this overhead.
I'm surprised that's the recommended solution. It seems pretty dangerous to have allocated pages in the system where the per-page ref counts are bogus.
To clarify then, on an order>0 allocation, it is only valid/defined to free the same order of pages. Is that a true statement? If so, I'll submit a docs patch and adjust our our local implementation.
Thanks,
Signature · 3 lines
Matt Porter [email protected] This is Linux Country. On a quiet night, you can hear Windows reboot.
Quoted 3 lines · Matt Porter
To clarify then, on an order>0 allocation, it is only valid/defined to free the same order of pages. Is that a true statement? If so, I'll submit a docs patch and adjust our our local implementation.
Yes, this is correct and it's what everyone does. The exceptions mess with the page counts themselves, look at the sparc64 pmd/pte dual-page allocations for example.