patch-2.4.6 linux/arch/arm/mm/consistent.c
Next file: linux/arch/arm/mm/fault-armv.c
Previous file: linux/arch/arm/mach-ebsa110/io.c
Back to the patch index
Back to the overall index
- Lines: 54
- Date:
Wed Jun 27 14:12:04 2001
- Orig file:
v2.4.5/linux/arch/arm/mm/consistent.c
- Orig date:
Thu Apr 12 12:20:31 2001
diff -u --recursive --new-file v2.4.5/linux/arch/arm/mm/consistent.c linux/arch/arm/mm/consistent.c
@@ -67,18 +67,21 @@
#endif
/*
- * free wasted pages. We skip the first page since
- * we know that it will have count = 1 and won't
- * require freeing.
+ * free wasted pages. We skip the first page since we know
+ * that it will have count = 1 and won't require freeing.
+ * We also mark the pages in use as reserved so that
+ * remap_page_range works.
*/
page = virt_to_page(virt);
free = page + (size >> PAGE_SHIFT);
end = page + (1 << order);
- while (++page < end) {
+ for (; page < end; page++) {
set_page_count(page, 1);
if (page >= free)
__free_page(page);
+ else
+ SetPageReserved(page);
}
return ret;
@@ -108,10 +111,26 @@
* free a page as defined by the above mapping. We expressly forbid
* calling this from interrupt context.
*/
-void consistent_free(void *vaddr)
+void consistent_free(void *vaddr, size_t size, dma_addr_t handle)
{
+ struct page *page, *end;
+ void *virt;
+
if (in_interrupt())
BUG();
+
+ virt = bus_to_virt(handle);
+
+ /*
+ * More messing around with the MM internals. This is
+ * sick, but then so is remap_page_range().
+ */
+ size = PAGE_ALIGN(size);
+ page = virt_to_page(virt);
+ end = page + (size >> PAGE_SHIFT);
+
+ for (; page < end; page++)
+ ClearPageReserved(page);
__iounmap(vaddr);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)