Thanks, this looks pretty good to me. A few comments below: On Fri, Jun 17, 2022 at 10:47:41AM -0400, Tianyu Lan wrote: > +/** > + * struct io_tlb_area - IO TLB memory area descriptor > + * > + * This is a single area with a single lock. > + * > + * @used: The number of used IO TLB block. > + * @index: The slot index to start searching in this area for next round. > + * @lock: The lock to protect the above data structures in the map and > + * unmap calls. > + */ > +struct io_tlb_area { > + unsigned long used; > + unsigned int index; > + spinlock_t lock; > +}; This can go into swiotlb.c. > +void __init swiotlb_adjust_nareas(unsigned int nareas); And this should be marked static. > +#define DEFAULT_NUM_AREAS 1 I'd drop this define, the magic 1 and a > 1 comparism seems to convey how it is used much better as the checks aren't about default or not, but about larger than one. I also think that we want some good way to size the default, e.g. by number of CPUs or memory size. > +void __init swiotlb_adjust_nareas(unsigned int nareas) > +{ > + if (!is_power_of_2(nareas)) { > + pr_err("swiotlb: Invalid areas parameter %d.\n", nareas); > + return; > + } > + > + default_nareas = nareas; > + > + pr_info("area num %d.\n", nareas); > + /* Round up number of slabs to the next power of 2. > + * The last area is going be smaller than the rest if > + * default_nslabs is not power of two. > + */ Please follow the normal kernel comment style with a /* on its own line.