On Thu, Jul 31, 2025 at 06:37:11PM +0100, Matthew Wilcox wrote: > The replacement for kmap_atomic() is already here -- it's > kmap_(atomic|local)_pfn(). If a simple wrapper like kmap_local_phys() > would make this more palatable, that would be fine by me. Might save > a bit of messing around with calculating offsets in each caller.
I think that makes the general plan clearer. We should be removing the struct pages entirely from the insides of DMA API layer and use the phys_addr_t, kmap_XX_phys(), phys_to_virt(), and so on. The request from Christoph and Marek to clean up the dma_ops makes sense in that context, we'd have to go into the ops and replace the struct page kmaps/etc with the phys based ones. This hides the struct page requirement to get to a KVA inside the core mm code only and that sort of modularity is exactly the sort of thing that could help entirely remove a struct page requirement for some kinds of DMA someday. Matthew, do you think it makes sense to introduce types to make this clearer? We have two kinds of values that a phys_addr_t can store - something compatible with kmap_XX_phys(), and something that isn't. This was recently a long discussion in ARM KVM as well which had a similar confusion that a phys_addr_t was actually two very different things inside its logic. So what about some dedicated types: kphys_addr_t - A physical address that can be passed to kmap_XX_phys(), phys_to_virt(), etc. raw_phys_addr_t - A physical address that may not be cachable, may not be DRAM, and does not work with kmap_XX_phys()/etc. We clearly have these two different ideas floating around in code, page tables, etc. I read some of Robin's concern that the struct page provided a certain amount of type safety in the DMA API, this could provide similar. Thanks, Jason