diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c --- a/sys/compat/linuxkpi/common/src/linux_page.c +++ b/sys/compat/linuxkpi/common/src/linux_page.c @@ -147,6 +147,14 @@ return (page); } +static void +_linux_free_kmem(vm_offset_t addr, unsigned int order) +{ + size_t size = ((size_t)PAGE_SIZE) << order; + + kmem_free((void *)addr, size); +} + void linux_free_pages(vm_page_t page, unsigned int order) { @@ -165,7 +173,7 @@ vaddr = (vm_offset_t)page_address(page); - linux_free_kmem(vaddr, order); + _linux_free_kmem(vaddr, order); } } @@ -187,9 +195,15 @@ void linux_free_kmem(vm_offset_t addr, unsigned int order) { - size_t size = ((size_t)PAGE_SIZE) << order; + if (PMAP_HAS_DMAP && + addr >= DMAP_MIN_ADDRESS && addr < DMAP_MAX_ADDRESS) { + vm_page_t page; - kmem_free((void *)addr, size); + page = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(addr)); + linux_free_pages(page, order); + } else { + _linux_free_kmem(addr, order); + } } static int