Patch "ALSA: pcm: Use SG-buffer only when direct DMA is available" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ALSA: pcm: Use SG-buffer only when direct DMA is available

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     alsa-pcm-use-sg-buffer-only-when-direct-dma-is-avail.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e4cacb4efafe2e3f23e555b5a056811d0dfd0ab6
Author: Takashi Iwai <tiwai@xxxxxxx>
Date:   Mon Jun 15 18:00:45 2020 +0200

    ALSA: pcm: Use SG-buffer only when direct DMA is available
    
    [ Upstream commit 3ad796cbc36a7bc8bfd4de191d791b9490bc112b ]
    
    The DMA-coherent SG-buffer is tricky to use, as it does need the
    mapping.  It used to work stably on x86 over years (and that's why we
    had enabled SG-buffer on solely x86) with the default mmap handler and
    vmap(), but our luck seems no forever success.  The chance of breakage
    is high when the special DMA handling is introduced in the arch side.
    
    In this patch, we change the buffer allocation to use the SG-buffer
    only when the device in question is with the direct DMA.  It's a bit
    hackish, but it's currently the only condition that may work (more or
    less) reliably with the default mmap and vmap() for mapping the pages
    that are deduced via virt_to_page().
    
    In theory, we can apply the similar hack in the sound/core memory
    allocation helper, too; but it's used by SOF for allocating SG pages
    without re-mapping via vmap() or mmap, and it's fine to use it in that
    way, so let's keep it and adds the workaround in PCM side.
    
    Link: https://lore.kernel.org/r/20200615160045.2703-5-tiwai@xxxxxxx
    Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
    Stable-dep-of: bd55842ed998 ("ALSA: pcm: Fix potential data race at PCM memory allocation helpers")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/sound/core/pcm_memory.c b/sound/core/pcm_memory.c
index 94bd5de01a4d0..97b471d7b32e5 100644
--- a/sound/core/pcm_memory.c
+++ b/sound/core/pcm_memory.c
@@ -11,6 +11,7 @@
 #include <linux/moduleparam.h>
 #include <linux/vmalloc.h>
 #include <linux/export.h>
+#include <linux/dma-mapping.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/info.h>
@@ -38,6 +39,18 @@ static int do_alloc_pages(struct snd_card *card, int type, struct device *dev,
 	if (max_alloc_per_card &&
 	    card->total_pcm_alloc_bytes + size > max_alloc_per_card)
 		return -ENOMEM;
+
+	if (IS_ENABLED(CONFIG_SND_DMA_SGBUF) &&
+	    (type == SNDRV_DMA_TYPE_DEV_SG || type == SNDRV_DMA_TYPE_DEV_UC_SG) &&
+	    !dma_is_direct(get_dma_ops(dev))) {
+		/* mutate to continuous page allocation */
+		dev_dbg(dev, "Use continuous page allocator\n");
+		if (type == SNDRV_DMA_TYPE_DEV_SG)
+			type = SNDRV_DMA_TYPE_DEV;
+		else
+			type = SNDRV_DMA_TYPE_DEV_UC;
+	}
+
 	err = snd_dma_alloc_pages(type, dev, size, dmab);
 	if (!err) {
 		mutex_lock(&card->memory_mutex);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux