[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/3] swiotlb: use the right nslabs-derived sizes in swiotlb_init_late
On Wed, 11 May 2022, Christoph Hellwig wrote: > nslabs can shrink when allocations or the remap don't succeed, so make > sure to use it for all sizing. For that remove the bytes value that > can get stale and replace it with local calculations and a boolean to > indicate if the originally requested size could not be allocated. > > Fixes: 6424e31b1c05 ("swiotlb: remove swiotlb_init_with_tbl and > swiotlb_init_late_with_tbl") > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > kernel/dma/swiotlb.c | 19 +++++++++++-------- > 1 file changed, 11 insertions(+), 8 deletions(-) > > diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c > index 113e1e8aaca37..d6e62a6a42ceb 100644 > --- a/kernel/dma/swiotlb.c > +++ b/kernel/dma/swiotlb.c > @@ -297,9 +297,9 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, > { > struct io_tlb_mem *mem = &io_tlb_default_mem; > unsigned long nslabs = ALIGN(size >> IO_TLB_SHIFT, IO_TLB_SEGSIZE); > - unsigned long bytes; > unsigned char *vstart = NULL; > unsigned int order; > + bool retried = false; > int rc = 0; > > if (swiotlb_force_disable) > @@ -308,7 +308,6 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, > retry: > order = get_order(nslabs << IO_TLB_SHIFT); > nslabs = SLABS_PER_PAGE << order; > - bytes = nslabs << IO_TLB_SHIFT; > > while ((SLABS_PER_PAGE << order) > IO_TLB_MIN_SLABS) { > vstart = (void *)__get_free_pages(gfp_mask | __GFP_NOWARN, > @@ -316,16 +315,13 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, > if (vstart) > break; > order--; > + nslabs = SLABS_PER_PAGE << order; > + retried = true; > } > > if (!vstart) > return -ENOMEM; > > - if (order != get_order(bytes)) { > - pr_warn("only able to allocate %ld MB\n", > - (PAGE_SIZE << order) >> 20); > - nslabs = SLABS_PER_PAGE << order; > - } > if (remap) > rc = remap(vstart, nslabs); > if (rc) { > @@ -334,9 +330,15 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, > nslabs = ALIGN(nslabs >> 1, IO_TLB_SEGSIZE); > if (nslabs < IO_TLB_MIN_SLABS) > return rc; > + retried = true; > goto retry; > } > > + if (retried) { > + pr_warn("only able to allocate %ld MB\n", > + (PAGE_SIZE << order) >> 20); > + } > + > mem->slots = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, > get_order(array_size(sizeof(*mem->slots), nslabs))); > if (!mem->slots) { > @@ -344,7 +346,8 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, > return -ENOMEM; > } > > - set_memory_decrypted((unsigned long)vstart, bytes >> PAGE_SHIFT); > + set_memory_decrypted((unsigned long)vstart, > + (nslabs << IO_TLB_SHIFT) >> PAGE_SHIFT); > swiotlb_init_io_tlb_mem(mem, virt_to_phys(vstart), nslabs, true); > > swiotlb_print_info(); > -- > 2.30.2 >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |