On Mon, Oct 07, 2024 at 01:03:14PM +0900, Damien Le Moal wrote: > There is no point in attempting to allocate memory from an endpoint > controller memory window if the requested size is larger than the memory > window size. Add a check to skip bitmap_find_free_region() calls for > such case. This check can be done without the mem->lock mutex held as > memory window sizes are constant and never modified at runtime. > Also change the final return to return NULL to simplify the code. > > Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> > --- > drivers/pci/endpoint/pci-epc-mem.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/pci/endpoint/pci-epc-mem.c b/drivers/pci/endpoint/pci-epc-mem.c > index a9c028f58da1..218a60e945db 100644 > --- a/drivers/pci/endpoint/pci-epc-mem.c > +++ b/drivers/pci/endpoint/pci-epc-mem.c > @@ -178,7 +178,7 @@ EXPORT_SYMBOL_GPL(pci_epc_mem_exit); > void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc, > phys_addr_t *phys_addr, size_t size) > { > - void __iomem *virt_addr = NULL; > + void __iomem *virt_addr; > struct pci_epc_mem *mem; > unsigned int page_shift; > size_t align_size; > @@ -188,10 +188,13 @@ void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc, > > for (i = 0; i < epc->num_windows; i++) { > mem = epc->windows[i]; > - mutex_lock(&mem->lock); > + if (size > mem->window.size) > + continue; > + > align_size = ALIGN(size, mem->window.page_size); > order = pci_epc_mem_get_order(mem, align_size); > > + mutex_lock(&mem->lock); > pageno = bitmap_find_free_region(mem->bitmap, mem->pages, > order); > if (pageno >= 0) { > @@ -211,7 +214,7 @@ void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc, > mutex_unlock(&mem->lock); > } > > - return virt_addr; > + return NULL; > } > EXPORT_SYMBOL_GPL(pci_epc_mem_alloc_addr); > > -- > 2.46.2 > Reviewed-by: Niklas Cassel <cassel@xxxxxxxxxx>