Skip to contentSkip to conversation

[2.4] update ref counts on all allocated pages

PATCH In review Matt Porter 2 participants 4 messages Nov 26, 2002 – Nov 28, 2002

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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.
#1 lore raw
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 within vfree().

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.

#2 lore raw
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 within vfree().

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.

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.
#3 lore raw
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.