On Wed, Jan 06, 2021 at 11:41:19AM +0800, Claire Chang wrote: > Added a new struct, io_tlb_mem, as the IO TLB memory pool descriptor and > moved relevant global variables into that struct. > This will be useful later to allow for restricted DMA pool. I like where this is going, but a few comments. Mostly I'd love to be able to entirely hide io_tlb_default_mem and struct io_tlb_mem inside of swiotlb.c. > --- a/arch/powerpc/platforms/pseries/svm.c > +++ b/arch/powerpc/platforms/pseries/svm.c > @@ -55,8 +55,8 @@ void __init svm_swiotlb_init(void) > if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, false)) > return; > > - if (io_tlb_start) > - memblock_free_early(io_tlb_start, > + if (io_tlb_default_mem.start) > + memblock_free_early(io_tlb_default_mem.start, > PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT)); I think this should switch to use the local vstart variable in prep patch. > panic("SVM: Cannot allocate SWIOTLB buffer"); > } > diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c > index 2b385c1b4a99..4d17dff7ffd2 100644 > --- a/drivers/xen/swiotlb-xen.c > +++ b/drivers/xen/swiotlb-xen.c > @@ -192,8 +192,8 @@ int __ref xen_swiotlb_init(int verbose, bool early) > /* > * IO TLB memory already allocated. Just use it. > */ > - if (io_tlb_start != 0) { > - xen_io_tlb_start = phys_to_virt(io_tlb_start); > + if (io_tlb_default_mem.start != 0) { > + xen_io_tlb_start = phys_to_virt(io_tlb_default_mem.start); > goto end; xen_io_tlb_start is interesting. It is used only in two functions: 1) is_xen_swiotlb_buffer, where I think we should be able to just use is_swiotlb_buffer instead of open coding it with the extra phys_to_virt/virt_to_phys cycle. 2) xen_swiotlb_init, where except for the assignment it only is used locally for the case not touched above and could this be replaced with a local variable. Konrad, does this make sense to you? > static inline bool is_swiotlb_buffer(phys_addr_t paddr) > { > - return paddr >= io_tlb_start && paddr < io_tlb_end; > + struct io_tlb_mem *mem = &io_tlb_default_mem; > + > + return paddr >= mem->start && paddr < mem->end; We'd then have to move this out of line as well.