On Tue, Aug 19, 2025 at 08:36:47PM +0300, Leon Romanovsky wrote: > @@ -1218,19 +1219,24 @@ void debug_dma_map_page(struct device *dev, struct > page *page, size_t offset, > return; > > entry->dev = dev; > - entry->type = dma_debug_single; > - entry->paddr = page_to_phys(page) + offset; > + entry->type = dma_debug_phy; > + entry->paddr = phys; > entry->dev_addr = dma_addr; > entry->size = size; > entry->direction = direction; > entry->map_err_type = MAP_ERR_NOT_CHECKED; > > - check_for_stack(dev, page, offset); > + if (!(attrs & DMA_ATTR_MMIO)) { > + struct page *page = phys_to_page(phys); > + size_t offset = offset_in_page(page); > > - if (!PageHighMem(page)) { > - void *addr = page_address(page) + offset; > + check_for_stack(dev, page, offset); > > - check_for_illegal_area(dev, addr, size); > + if (!PageHighMem(page)) { > + void *addr = page_address(page) + offset; > + > + check_for_illegal_area(dev, addr, size); > + } > }
Not anything to change in this series, but I was looking at what it would take to someday remove the struct page here and it looks reasonable. diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index 06e31fd216e38e..0d6dd3eb9860ac 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -1051,28 +1051,28 @@ static void check_unmap(struct dma_debug_entry *ref) dma_entry_free(entry); } -static void check_for_stack(struct device *dev, - struct page *page, size_t offset) +static void check_for_stack(struct device *dev, phys_addr_t phys) { void *addr; struct vm_struct *stack_vm_area = task_stack_vm_area(current); if (!stack_vm_area) { /* Stack is direct-mapped. */ - if (PageHighMem(page)) + if (PhysHighMem(phys)) return; - addr = page_address(page) + offset; + addr = phys_to_virt(phys); if (object_is_on_stack(addr)) err_printk(dev, NULL, "device driver maps memory from stack [addr=%p]\n", addr); } else { /* Stack is vmalloced. */ + unsigned long pfn = phys >> PAGE_SHIFT; int i; for (i = 0; i < stack_vm_area->nr_pages; i++) { - if (page != stack_vm_area->pages[i]) + if (pfn != page_to_pfn(stack_vm_area->pages[i])) continue; - addr = (u8 *)current->stack + i * PAGE_SIZE + offset; + addr = (u8 *)current->stack + i * PAGE_SIZE + (phys % PAGE_SIZE); err_printk(dev, NULL, "device driver maps memory from stack [probable addr=%p]\n", addr); break; } @@ -1225,16 +1225,10 @@ void debug_dma_map_phys(struct device *dev, phys_addr_t phys, size_t size, entry->map_err_type = MAP_ERR_NOT_CHECKED; if (!(attrs & DMA_ATTR_MMIO)) { - struct page *page = phys_to_page(phys); - size_t offset = offset_in_page(page); + check_for_stack(dev, phys); - check_for_stack(dev, page, offset); - - if (!PageHighMem(page)) { - void *addr = page_address(page) + offset; - - check_for_illegal_area(dev, addr, size); - } + if (!PhysHighMem(phys)) + check_for_illegal_area(dev, phys_to_virt(phys), size); } add_dma_entry(entry, attrs);