ALSA: memalloc: don't pass bogus GFP_ flags to dma_alloc_*
authorChristoph Hellwig <hch@lst.de>
Wed, 9 Nov 2022 07:25:17 +0000 (08:25 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 21 Nov 2022 08:36:19 +0000 (09:36 +0100)
dma_alloc_coherent/dma_alloc_wc is an opaque allocator that only uses
the GFP_ flags for allocation context control.  Don't pass __GFP_COMP
which makes no sense for an allocation that can't in any way be
converted to a page pointer.

Note that for dma_alloc_noncoherent and dma_alloc_noncontigous in
combination with the DMA mmap helpers __GFP_COMP looks sketchy as well,
so I would suggest to drop that as well after a careful audit.

Signed-off-by: Christoph Hellwig <hch@lst.de>
sound/core/memalloc.c

index 03cffe7..fe03cf7 100644 (file)
@@ -20,7 +20,6 @@
 
 #define DEFAULT_GFP \
        (GFP_KERNEL | \
-        __GFP_COMP |    /* compound page lets parts be mapped */ \
         __GFP_RETRY_MAYFAIL | /* don't trigger OOM-killer */ \
         __GFP_NOWARN)   /* no stack trace print - this call is non-critical */
 
@@ -542,7 +541,7 @@ static void *snd_dma_noncontig_alloc(struct snd_dma_buffer *dmab, size_t size)
        void *p;
 
        sgt = dma_alloc_noncontiguous(dmab->dev.dev, size, dmab->dev.dir,
-                                     DEFAULT_GFP, 0);
+                                     DEFAULT_GFP | __GFP_COMP, 0);
        if (!sgt) {
 #ifdef CONFIG_SND_DMA_SGBUF
                if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG)
@@ -810,7 +809,7 @@ static void *snd_dma_noncoherent_alloc(struct snd_dma_buffer *dmab, size_t size)
        void *p;
 
        p = dma_alloc_noncoherent(dmab->dev.dev, size, &dmab->addr,
-                                 dmab->dev.dir, DEFAULT_GFP);
+                                 dmab->dev.dir, DEFAULT_GFP | __GFP_COMP);
        if (p)
                dmab->dev.need_sync = dma_need_sync(dmab->dev.dev, dmab->addr);
        return p;