lkml.org 
[lkml]   [2015]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.14 50/73] usb: core: buffer: smallest buffer should start at ARCH_DMA_MINALIGN
    Date
    3.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

    commit 5efd2ea8c9f4f12916ffc8ba636792ce052f6911 upstream.

    the following error pops up during "testusb -a -t 10"
    | musb-hdrc musb-hdrc.1.auto: dma_pool_free buffer-128, f134e000/be842000 (bad dma)
    hcd_buffer_create() creates a few buffers, the smallest has 32 bytes of
    size. ARCH_KMALLOC_MINALIGN is set to 64 bytes. This combo results in
    hcd_buffer_alloc() returning memory which is 32 bytes aligned and it
    might by identified by buffer_offset() as another buffer. This means the
    buffer which is on a 32 byte boundary will not get freed, instead it
    tries to free another buffer with the error message.

    This patch fixes the issue by creating the smallest DMA buffer with the
    size of ARCH_KMALLOC_MINALIGN (or 32 in case ARCH_KMALLOC_MINALIGN is
    smaller). This might be 32, 64 or even 128 bytes. The next three pools
    will have the size 128, 512 and 2048.
    In case the smallest pool is 128 bytes then we have only three pools
    instead of four (and zero the first entry in the array).
    The last pool size is always 2048 bytes which is the assumed PAGE_SIZE /
    2 of 4096. I doubt it makes sense to continue using PAGE_SIZE / 2 where
    we would end up with 8KiB buffer in case we have 16KiB pages.
    Instead I think it makes sense to have a common size(s) and extend them
    if there is need to.
    There is a BUILD_BUG_ON() now in case someone has a minalign of more than
    128 bytes.

    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/core/buffer.c | 26 +++++++++++++++++---------
    drivers/usb/core/usb.c | 1 +
    include/linux/usb/hcd.h | 1 +
    3 files changed, 19 insertions(+), 9 deletions(-)

    --- a/drivers/usb/core/buffer.c
    +++ b/drivers/usb/core/buffer.c
    @@ -22,17 +22,25 @@
    */

    /* FIXME tune these based on pool statistics ... */
    -static const size_t pool_max[HCD_BUFFER_POOLS] = {
    - /* platforms without dma-friendly caches might need to
    - * prevent cacheline sharing...
    - */
    - 32,
    - 128,
    - 512,
    - PAGE_SIZE / 2
    - /* bigger --> allocate pages */
    +static size_t pool_max[HCD_BUFFER_POOLS] = {
    + 32, 128, 512, 2048,
    };

    +void __init usb_init_pool_max(void)
    +{
    + /*
    + * The pool_max values must never be smaller than
    + * ARCH_KMALLOC_MINALIGN.
    + */
    + if (ARCH_KMALLOC_MINALIGN <= 32)
    + ; /* Original value is okay */
    + else if (ARCH_KMALLOC_MINALIGN <= 64)
    + pool_max[0] = 64;
    + else if (ARCH_KMALLOC_MINALIGN <= 128)
    + pool_max[0] = 0; /* Don't use this pool */
    + else
    + BUILD_BUG(); /* We don't allow this */
    +}

    /* SETUP primitives */

    --- a/drivers/usb/core/usb.c
    +++ b/drivers/usb/core/usb.c
    @@ -1050,6 +1050,7 @@ static int __init usb_init(void)
    pr_info("%s: USB support disabled\n", usbcore_name);
    return 0;
    }
    + usb_init_pool_max();

    retval = usb_debugfs_init();
    if (retval)
    --- a/include/linux/usb/hcd.h
    +++ b/include/linux/usb/hcd.h
    @@ -447,6 +447,7 @@ extern const struct dev_pm_ops usb_hcd_p
    #endif /* CONFIG_PCI */

    /* pci-ish (pdev null is ok) buffer alloc/mapping support */
    +void usb_init_pool_max(void);
    int hcd_buffer_create(struct usb_hcd *hcd);
    void hcd_buffer_destroy(struct usb_hcd *hcd);




    \
     
     \ /
      Last update: 2015-03-04 09:41    [W:4.124 / U:0.316 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site