]> www.infradead.org Git - linux.git/commitdiff
usb: xhci: add individual allocation checks in xhci_mem_init()
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Thu, 15 May 2025 13:56:09 +0000 (16:56 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 May 2025 10:35:32 +0000 (12:35 +0200)
Break up the existing multi-allocation checks into individual checks.
Add missing allocation check for 'xhci->interrupters'.

Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20250515135621.335595-13-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c

index eb076f5ed1d0ecc2dcbcafc3c09c074b99c71de4..8cadd785ac0e3ac2f9da949c2fc679a483f05c52 100644 (file)
@@ -2437,11 +2437,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
        else
                xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
                                TRB_SEGMENT_SIZE, TRB_SEGMENT_SIZE, xhci->page_size);
+       if (!xhci->segment_pool)
+               goto fail;
 
        /* See Table 46 and Note on Figure 55 */
        xhci->device_pool = dma_pool_create("xHCI input/output contexts", dev,
                        2112, 64, xhci->page_size);
-       if (!xhci->segment_pool || !xhci->device_pool)
+       if (!xhci->device_pool)
                goto fail;
 
        /* Linear stream context arrays don't have any boundary restrictions,
@@ -2450,12 +2452,17 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
        xhci->small_streams_pool =
                dma_pool_create("xHCI 256 byte stream ctx arrays",
                        dev, SMALL_STREAM_ARRAY_SIZE, 16, 0);
+       if (!xhci->small_streams_pool)
+               goto fail;
+
        xhci->medium_streams_pool =
                dma_pool_create("xHCI 1KB stream ctx arrays",
                        dev, MEDIUM_STREAM_ARRAY_SIZE, 16, 0);
        /* Any stream context array bigger than MEDIUM_STREAM_ARRAY_SIZE
         * will be allocated with dma_alloc_coherent()
         */
+       if (!xhci->medium_streams_pool)
+               goto fail;
 
        /* refer to xhci rev1_2 protocol 5.3.3 max ports is 255.
         * refer to xhci rev1_2 protocol 6.4.3.14 port bandwidth buffer need
@@ -2464,9 +2471,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
        xhci->port_bw_pool =
                dma_pool_create("xHCI 256 port bw ctx arrays",
                        dev, GET_PORT_BW_ARRAY_SIZE, 16, 0);
-
-       if (!xhci->small_streams_pool || !xhci->medium_streams_pool ||
-               !xhci->port_bw_pool)
+       if (!xhci->port_bw_pool)
                goto fail;
 
        /* Set up the command ring to have one segments for now. */
@@ -2489,6 +2494,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
                       "Allocating primary event ring");
        xhci->interrupters = kcalloc_node(xhci->max_interrupters, sizeof(*xhci->interrupters),
                                          flags, dev_to_node(dev));
+       if (!xhci->interrupters)
+               goto fail;
 
        xhci->interrupters[0] = xhci_alloc_interrupter(xhci, 0, flags);
        if (!xhci->interrupters[0])