lkml.org 
[lkml]   [2022]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 003/181] ALSA: memalloc: Drop x86-specific hack for WC allocations
    Date
    From: Takashi Iwai <tiwai@suse.de>

    commit 9882d63bea14c8b3ed2c9360b9ab9f0e2f64ae2b upstream.

    The recent report for a crash on Haswell machines implied that the
    x86-specific (rather hackish) implementation for write-cache memory
    buffer allocation in ALSA core is buggy with the recent kernel in some
    corner cases. This patch drops the x86-specific implementation and
    uses the standard dma_alloc_wc() & co generically for avoiding the bug
    and also for simplification.

    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=216112
    Cc: <stable@vger.kernel.org> # v5.18+
    Link: https://lore.kernel.org/r/20220620073440.7514-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    sound/core/memalloc.c | 23 +----------------------
    1 file changed, 1 insertion(+), 22 deletions(-)

    diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c
    index 15dc7160ba34..8cfdaee77905 100644
    --- a/sound/core/memalloc.c
    +++ b/sound/core/memalloc.c
    @@ -431,33 +431,17 @@ static const struct snd_malloc_ops snd_dma_iram_ops = {
    */
    static void *snd_dma_dev_alloc(struct snd_dma_buffer *dmab, size_t size)
    {
    - void *p;
    -
    - p = dma_alloc_coherent(dmab->dev.dev, size, &dmab->addr, DEFAULT_GFP);
    -#ifdef CONFIG_X86
    - if (p && dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC)
    - set_memory_wc((unsigned long)p, PAGE_ALIGN(size) >> PAGE_SHIFT);
    -#endif
    - return p;
    + return dma_alloc_coherent(dmab->dev.dev, size, &dmab->addr, DEFAULT_GFP);
    }

    static void snd_dma_dev_free(struct snd_dma_buffer *dmab)
    {
    -#ifdef CONFIG_X86
    - if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC)
    - set_memory_wb((unsigned long)dmab->area,
    - PAGE_ALIGN(dmab->bytes) >> PAGE_SHIFT);
    -#endif
    dma_free_coherent(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
    }

    static int snd_dma_dev_mmap(struct snd_dma_buffer *dmab,
    struct vm_area_struct *area)
    {
    -#ifdef CONFIG_X86
    - if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC)
    - area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
    -#endif
    return dma_mmap_coherent(dmab->dev.dev, area,
    dmab->area, dmab->addr, dmab->bytes);
    }
    @@ -471,10 +455,6 @@ static const struct snd_malloc_ops snd_dma_dev_ops = {
    /*
    * Write-combined pages
    */
    -#ifdef CONFIG_X86
    -/* On x86, share the same ops as the standard dev ops */
    -#define snd_dma_wc_ops snd_dma_dev_ops
    -#else /* CONFIG_X86 */
    static void *snd_dma_wc_alloc(struct snd_dma_buffer *dmab, size_t size)
    {
    return dma_alloc_wc(dmab->dev.dev, size, &dmab->addr, DEFAULT_GFP);
    @@ -497,7 +477,6 @@ static const struct snd_malloc_ops snd_dma_wc_ops = {
    .free = snd_dma_wc_free,
    .mmap = snd_dma_wc_mmap,
    };
    -#endif /* CONFIG_X86 */

    #ifdef CONFIG_SND_DMA_SGBUF
    static void *snd_dma_sg_fallback_alloc(struct snd_dma_buffer *dmab, size_t size);
    --
    2.36.1


    \
     
     \ /
      Last update: 2022-06-27 13:46    [W:8.625 / U:1.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site