]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
PCI: endpoint: Improve pci_epc_mem_alloc_addr()
authorDamien Le Moal <dlemoal@kernel.org>
Sat, 12 Oct 2024 11:32:42 +0000 (20:32 +0900)
committerManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Sat, 12 Oct 2024 11:55:54 +0000 (17:25 +0530)
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@kernel.org>
Reviewed-by: Niklas Cassel <cassel@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20241012113246.95634-3-dlemoal@kernel.org
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/endpoint/pci-epc-mem.c

index a9c028f58da1748cdc7c1cac45ee763e221dc04f..218a60e945db6539c76d58b0faf7d00cc2046cb4 100644 (file)
@@ -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);