From mboxrd@z Thu Jan 1 00:00:00 1970 From: joelf@ti.com (Joel Fernandes) Date: Thu, 15 Aug 2013 02:35:59 -0500 Subject: dma_unmap causing issues with __get_free_pages Message-ID: <520C84DF.5050707@ti.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, I'm having some trouble with using the dma_map/unmap API. On unmapping a particular page using dma_unmap, it seems that the PG_dcache_clean flag is set in the page->flags. This is set by the following statement in __dma_page_dev_to_cpu function in arch/arm/mm/dma-mapping.c set_bit(PG_dcache_clean, &page->flags); Due to this, on any subsequent page allocations using __get_free_pages, the following BUG gets triggered. [ 15.267913] BUG: Bad page state in process insmod pfn:acb26 [ 15.274017] page:c151e4c0 count:0 mapcount:0 mapping: (null) index:0x0 [ 15.281097] page flags: 0x200(arch_1) [ 15.285003] Modules linked in: tcrypt(+) [ 15.289062] CPU: 0 PID: 1616 Comm: insmod Tainted: G B 3.10.0-00038-gbafd29d-dirty #89 [ 15.298706] [] (unwind_backtrace+0x0/0xfc) from [] (show_stack+0x20/0x24) [ 15.307861] [] (show_stack+0x20/0x24) from [] (dump_stack+0x20/0x28) [ 15.316497] [] (dump_stack+0x20/0x28) from [] (bad_page+0xbc/0x11c) [ 15.325195] [] (bad_page+0xbc/0x11c) from [] (get_page_from_freelist+0x4dc/0x620) [ 15.335083] [] (get_page_from_freelist+0x4dc/0x620) from [] (__alloc_pages_nodemask+0x114/0x8b4) [ 15.346343] [] (__alloc_pages_nodemask+0x114/0x8b4) from [] (__get_free_pages+0x20/0x3c) [ 15.356872] [] (__get_free_pages+0x20/0x3c) from [] (omap_aes_copy_sgs+0x48/0x1bc) If I don't do the unmap and leave the page alone, everything works just fine. What is correct way to fix this? Why does the page allocator think its a BAD page descriptor after the unmap? Thanks, -Joel