* [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures @ 2009-11-26 15:13 Takashi Iwai 2009-11-26 15:13 ` [PATCH 1/5] ALSA: pcm - Use dma_mmap_coherent() if available Takashi Iwai 2010-01-01 19:31 ` [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Andreas Mohr 0 siblings, 2 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 15:13 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala Hi, this is a patchset to fix Oopses from ALSA PCM core with mmap on MIPS and PPC non-coherent architectures. This contains also a clean-up for ARM mmap. In this patch series, I don't try to port dma_mmap_coherent() to these architectures yet, but just put ugly ifdefs in the ALSA core side. Understand that this is a first step forward to a more cleaner solution, and the purpose right now is just to fix up long-standing Oops. I'll try to push dma_mmap_coherent() patches for the next kernel once again after this gets merged. Since the changes are minimal, I'd like to put them in ASAP for 2.6.33. Please review and give feedbacks if any problem is found. Thanks, Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 1/5] ALSA: pcm - Use dma_mmap_coherent() if available 2009-11-26 15:13 [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Takashi Iwai @ 2009-11-26 15:13 ` Takashi Iwai 2009-11-26 15:13 ` [PATCH 2/5] ALSA: pcm - define snd_pcm_default_page_ops() Takashi Iwai 2010-01-01 19:31 ` [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Andreas Mohr 1 sibling, 1 reply; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 15:13 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Takashi Iwai, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala Use dma_mmap_coherent() for mmapping the buffers allocated via dma_alloc_coherent() if available. Currently, only ARM has this function, so we do temporarily have an ifdef pcm_native.c. This should be handled better globally in future. Signed-off-by: Takashi Iwai <tiwai@suse.de> --- sound/core/pcm_native.c | 49 +++++++++++++++++++++++++++++++--------------- 1 files changed, 33 insertions(+), 16 deletions(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index ab73edf..f067c5b 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -26,6 +26,7 @@ #include <linux/time.h> #include <linux/pm_qos_params.h> #include <linux/uio.h> +#include <linux/dma-mapping.h> #include <sound/core.h> #include <sound/control.h> #include <sound/info.h> @@ -3094,23 +3095,42 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area, return 0; } -static const struct vm_operations_struct snd_pcm_vm_ops_data = -{ +static const struct vm_operations_struct snd_pcm_vm_ops_data = { + .open = snd_pcm_mmap_data_open, + .close = snd_pcm_mmap_data_close, +}; + +static const struct vm_operations_struct snd_pcm_vm_ops_data_fault = { .open = snd_pcm_mmap_data_open, .close = snd_pcm_mmap_data_close, .fault = snd_pcm_mmap_data_fault, }; +#ifndef ARCH_HAS_DMA_MMAP_COHERENT +/* This should be defined / handled globally! */ +#ifdef CONFIG_ARM +#define ARCH_HAS_DMA_MMAP_COHERENT +#endif +#endif + /* * mmap the DMA buffer on RAM */ static int snd_pcm_default_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *area) { - area->vm_ops = &snd_pcm_vm_ops_data; - area->vm_private_data = substream; area->vm_flags |= VM_RESERVED; - atomic_inc(&substream->mmap_count); +#ifdef ARCH_HAS_DMA_MMAP_COHERENT + if (!substream->ops->page && + substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) + return dma_mmap_coherent(substream->dma_buffer.dev.dev, + area, + substream->runtime->dma_area, + substream->runtime->dma_addr, + area->vm_end - area->vm_start); +#endif /* ARCH_HAS_DMA_MMAP_COHERENT */ + /* mmap with fault handler */ + area->vm_ops = &snd_pcm_vm_ops_data_fault; return 0; } @@ -3118,12 +3138,6 @@ static int snd_pcm_default_mmap(struct snd_pcm_substream *substream, * mmap the DMA buffer on I/O memory area */ #if SNDRV_PCM_INFO_MMAP_IOMEM -static const struct vm_operations_struct snd_pcm_vm_ops_data_mmio = -{ - .open = snd_pcm_mmap_data_open, - .close = snd_pcm_mmap_data_close, -}; - int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area) { @@ -3133,8 +3147,6 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, #ifdef pgprot_noncached area->vm_page_prot = pgprot_noncached(area->vm_page_prot); #endif - area->vm_ops = &snd_pcm_vm_ops_data_mmio; - area->vm_private_data = substream; area->vm_flags |= VM_IO; size = area->vm_end - area->vm_start; offset = area->vm_pgoff << PAGE_SHIFT; @@ -3142,7 +3154,6 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, (substream->runtime->dma_addr + offset) >> PAGE_SHIFT, size, area->vm_page_prot)) return -EAGAIN; - atomic_inc(&substream->mmap_count); return 0; } @@ -3159,6 +3170,7 @@ int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, long size; unsigned long offset; size_t dma_bytes; + int err; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (!(area->vm_flags & (VM_WRITE|VM_READ))) @@ -3183,10 +3195,15 @@ int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, if (offset > dma_bytes - size) return -EINVAL; + area->vm_ops = &snd_pcm_vm_ops_data; + area->vm_private_data = substream; if (substream->ops->mmap) - return substream->ops->mmap(substream, area); + err = substream->ops->mmap(substream, area); else - return snd_pcm_default_mmap(substream, area); + err = snd_pcm_default_mmap(substream, area); + if (!err) + atomic_inc(&substream->mmap_count); + return err; } EXPORT_SYMBOL(snd_pcm_mmap_data); -- 1.6.5.3 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 2/5] ALSA: pcm - define snd_pcm_default_page_ops() 2009-11-26 15:13 ` [PATCH 1/5] ALSA: pcm - Use dma_mmap_coherent() if available Takashi Iwai @ 2009-11-26 15:13 ` Takashi Iwai 2009-11-26 15:13 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Takashi Iwai 0 siblings, 1 reply; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 15:13 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Takashi Iwai, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala Add a helper (inline) function as the default page ops. Any hacks wrt the page address conversion will be applied in this function. Signed-off-by: Takashi Iwai <tiwai@suse.de> --- sound/core/pcm_native.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index f067c5b..c906be2 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -3062,6 +3062,13 @@ static int snd_pcm_mmap_control(struct snd_pcm_substream *substream, struct file } #endif /* coherent mmap */ +static inline struct page * +snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) +{ + void *vaddr = substream->runtime->dma_area + ofs; + return virt_to_page(vaddr); +} + /* * fault callback for mmapping a RAM page */ @@ -3072,7 +3079,6 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area, struct snd_pcm_runtime *runtime; unsigned long offset; struct page * page; - void *vaddr; size_t dma_bytes; if (substream == NULL) @@ -3082,14 +3088,12 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area, dma_bytes = PAGE_ALIGN(runtime->dma_bytes); if (offset > dma_bytes - PAGE_SIZE) return VM_FAULT_SIGBUS; - if (substream->ops->page) { + if (substream->ops->page) page = substream->ops->page(substream, offset); - if (!page) - return VM_FAULT_SIGBUS; - } else { - vaddr = runtime->dma_area + offset; - page = virt_to_page(vaddr); - } + else + page = snd_pcm_default_page_ops(substream, offset); + if (!page) + return VM_FAULT_SIGBUS; get_page(page); vmf->page = page; return 0; -- 1.6.5.3 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch 2009-11-26 15:13 ` [PATCH 2/5] ALSA: pcm - define snd_pcm_default_page_ops() Takashi Iwai @ 2009-11-26 15:13 ` Takashi Iwai 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai ` (2 more replies) 0 siblings, 3 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 15:13 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Takashi Iwai, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala The non-coherent MIPS arch doesn't give the correct address by a simple virt_to_page() for pages allocated via dma_alloc_coherent(). Original patch by Wu Zhangjin <wuzj@lemote.com>. A proper check of the buffer allocation type was added to avoid the wrong conversion. Note that this doesn't fix perfectly: the pages should be marked with proper pgprot value. This will be done in a future implementation like the conversion to dma_mmap_coherent(). Signed-off-by: Takashi Iwai <tiwai@suse.de> --- sound/core/pcm_native.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index c906be2..e48c5f6 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -3066,6 +3066,10 @@ static inline struct page * snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) { void *vaddr = substream->runtime->dma_area + ofs; +#if defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT) + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) + return virt_to_page(CAC_ADDR(vaddr)); +#endif return virt_to_page(vaddr); } -- 1.6.5.3 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch 2009-11-26 15:13 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Takashi Iwai @ 2009-11-26 15:13 ` Takashi Iwai 2009-11-26 15:13 ` [PATCH 5/5] ALSA: Remove old DMA-mmap code from arm/devdma.c Takashi Iwai ` (2 more replies) 2009-11-27 3:52 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Wu Zhangjin 2009-11-27 8:46 ` Ralf Baechle 2 siblings, 3 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 15:13 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Takashi Iwai, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala The non-cohernet PPC arch doesn't give the correct address by a simple virt_to_page() for pages allocated via dma_alloc_coherent(). This patch adds a hack to fix the conversion similarly like MIPS. Note that this doesn't fix perfectly: the pages should be marked with proper pgprot value. This will be done in a future implementation like the conversion to dma_mmap_coherent(). Signed-off-by: Takashi Iwai <tiwai@suse.de> --- sound/core/pcm_native.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index e48c5f6..76eb763 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -3070,6 +3070,16 @@ snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) return virt_to_page(CAC_ADDR(vaddr)); #endif +#if defined(CONFIG_PPC32) && defined(CONFIG_NOT_COHERENT_CACHE) + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) { + dma_addr_t addr = substream->runtime->dma_addr + ofs; + addr -= get_dma_offset(substream->dma_buffer.dev.dev); + /* assume dma_handle set via pfn_to_phys() in + * mm/dma-noncoherent.c + */ + return pfn_to_page(dma_handle >> PAGE_SHIFT); + } +#endif return virt_to_page(vaddr); } -- 1.6.5.3 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 5/5] ALSA: Remove old DMA-mmap code from arm/devdma.c 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai @ 2009-11-26 15:13 ` Takashi Iwai 2009-11-26 16:56 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai 2009-11-26 20:51 ` Benjamin Herrenschmidt 2 siblings, 0 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 15:13 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Takashi Iwai, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala The call of dma_mmap_coherent() is done in the PCM core now. Signed-off-by: Takashi Iwai <tiwai@suse.de> --- sound/arm/Makefile | 2 +- sound/arm/aaci.c | 16 +++------- sound/arm/devdma.c | 80 ---------------------------------------------------- sound/arm/devdma.h | 3 -- 4 files changed, 6 insertions(+), 95 deletions(-) delete mode 100644 sound/arm/devdma.c delete mode 100644 sound/arm/devdma.h diff --git a/sound/arm/Makefile b/sound/arm/Makefile index 5a549ed..8c0c851 100644 --- a/sound/arm/Makefile +++ b/sound/arm/Makefile @@ -3,7 +3,7 @@ # obj-$(CONFIG_SND_ARMAACI) += snd-aaci.o -snd-aaci-objs := aaci.o devdma.o +snd-aaci-objs := aaci.o obj-$(CONFIG_SND_PXA2XX_PCM) += snd-pxa2xx-pcm.o snd-pxa2xx-pcm-objs := pxa2xx-pcm.o diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index 1f0f821..e593728 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c @@ -30,7 +30,6 @@ #include <sound/pcm_params.h> #include "aaci.h" -#include "devdma.h" #define DRIVER_NAME "aaci-pl041" @@ -492,7 +491,7 @@ static int aaci_pcm_hw_free(struct snd_pcm_substream *substream) /* * Clear out the DMA and any allocated buffers. */ - devdma_hw_free(NULL, substream); + snd_pcm_lib_free_pages(substream); return 0; } @@ -505,8 +504,8 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, aaci_pcm_hw_free(substream); - err = devdma_hw_alloc(NULL, substream, - params_buffer_bytes(params)); + err = snd_pcm_lib_malloc_pages(substream, + params_buffer_bytes(params)); if (err < 0) goto out; @@ -551,11 +550,6 @@ static snd_pcm_uframes_t aaci_pcm_pointer(struct snd_pcm_substream *substream) return bytes_to_frames(runtime, bytes); } -static int aaci_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma) -{ - return devdma_mmap(NULL, substream, vma); -} - /* * Playback specific ALSA stuff @@ -722,7 +716,6 @@ static struct snd_pcm_ops aaci_playback_ops = { .prepare = aaci_pcm_prepare, .trigger = aaci_pcm_playback_trigger, .pointer = aaci_pcm_pointer, - .mmap = aaci_pcm_mmap, }; static int aaci_pcm_capture_hw_params(struct snd_pcm_substream *substream, @@ -850,7 +843,6 @@ static struct snd_pcm_ops aaci_capture_ops = { .prepare = aaci_pcm_capture_prepare, .trigger = aaci_pcm_capture_trigger, .pointer = aaci_pcm_pointer, - .mmap = aaci_pcm_mmap, }; /* @@ -1040,6 +1032,8 @@ static int __devinit aaci_init_pcm(struct aaci *aaci) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &aaci_playback_ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &aaci_capture_ops); + snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, + NULL, 0, 64 * 104); } return ret; diff --git a/sound/arm/devdma.c b/sound/arm/devdma.c deleted file mode 100644 index 9d1e666..0000000 --- a/sound/arm/devdma.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * linux/sound/arm/devdma.c - * - * Copyright (C) 2003-2004 Russell King, All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * ARM DMA shim for ALSA. - */ -#include <linux/device.h> -#include <linux/dma-mapping.h> - -#include <sound/core.h> -#include <sound/pcm.h> - -#include "devdma.h" - -void devdma_hw_free(struct device *dev, struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *buf = runtime->dma_buffer_p; - - if (runtime->dma_area == NULL) - return; - - if (buf != &substream->dma_buffer) { - dma_free_coherent(buf->dev.dev, buf->bytes, buf->area, buf->addr); - kfree(runtime->dma_buffer_p); - } - - snd_pcm_set_runtime_buffer(substream, NULL); -} - -int devdma_hw_alloc(struct device *dev, struct snd_pcm_substream *substream, size_t size) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *buf = runtime->dma_buffer_p; - int ret = 0; - - if (buf) { - if (buf->bytes >= size) - goto out; - devdma_hw_free(dev, substream); - } - - if (substream->dma_buffer.area != NULL && substream->dma_buffer.bytes >= size) { - buf = &substream->dma_buffer; - } else { - buf = kmalloc(sizeof(struct snd_dma_buffer), GFP_KERNEL); - if (!buf) - goto nomem; - - buf->dev.type = SNDRV_DMA_TYPE_DEV; - buf->dev.dev = dev; - buf->area = dma_alloc_coherent(dev, size, &buf->addr, GFP_KERNEL); - buf->bytes = size; - buf->private_data = NULL; - - if (!buf->area) - goto free; - } - snd_pcm_set_runtime_buffer(substream, buf); - ret = 1; - out: - runtime->dma_bytes = size; - return ret; - - free: - kfree(buf); - nomem: - return -ENOMEM; -} - -int devdma_mmap(struct device *dev, struct snd_pcm_substream *substream, struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - return dma_mmap_coherent(dev, vma, runtime->dma_area, runtime->dma_addr, runtime->dma_bytes); -} diff --git a/sound/arm/devdma.h b/sound/arm/devdma.h deleted file mode 100644 index d025329..0000000 --- a/sound/arm/devdma.h +++ /dev/null @@ -1,3 +0,0 @@ -void devdma_hw_free(struct device *dev, struct snd_pcm_substream *substream); -int devdma_hw_alloc(struct device *dev, struct snd_pcm_substream *substream, size_t size); -int devdma_mmap(struct device *dev, struct snd_pcm_substream *substream, struct vm_area_struct *vma); -- 1.6.5.3 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai 2009-11-26 15:13 ` [PATCH 5/5] ALSA: Remove old DMA-mmap code from arm/devdma.c Takashi Iwai @ 2009-11-26 16:56 ` Takashi Iwai 2009-11-26 21:14 ` Benjamin Herrenschmidt 2009-11-26 20:51 ` Benjamin Herrenschmidt 2 siblings, 1 reply; 24+ messages in thread From: Takashi Iwai @ 2009-11-26 16:56 UTC (permalink / raw) To: alsa-devel Cc: linux-mips, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala Sorry, a typo was in this patch. The fixed version is below. FYI, the patchset is found in sound git tree topic/pcm-dma-fix branch: git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git topic/pcm-dma-fix thanks, Takashi >From bc01f9e365d3afc041ab2c296107728c56410f8f Mon Sep 17 00:00:00 2001 From: Takashi Iwai <tiwai@suse.de> Date: Thu, 26 Nov 2009 15:04:24 +0100 Subject: [PATCH] ALSA: pcm - fix page conversion on non-coherent PPC arch The non-cohernet PPC arch doesn't give the correct address by a simple virt_to_page() for pages allocated via dma_alloc_coherent(). This patch adds a hack to fix the conversion similarly like MIPS. Note that this doesn't fix perfectly: the pages should be marked with proper pgprot value. This will be done in a future implementation like the conversion to dma_mmap_coherent(). Signed-off-by: Takashi Iwai <tiwai@suse.de> --- sound/core/pcm_native.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index e48c5f6..29ab46a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -3070,6 +3070,16 @@ snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) return virt_to_page(CAC_ADDR(vaddr)); #endif +#if defined(CONFIG_PPC32) && defined(CONFIG_NOT_COHERENT_CACHE) + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) { + dma_addr_t addr = substream->runtime->dma_addr + ofs; + addr -= get_dma_offset(substream->dma_buffer.dev.dev); + /* assume dma_handle set via pfn_to_phys() in + * mm/dma-noncoherent.c + */ + return pfn_to_page(addr >> PAGE_SHIFT); + } +#endif return virt_to_page(vaddr); } -- 1.6.5.3 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch 2009-11-26 16:56 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai @ 2009-11-26 21:14 ` Benjamin Herrenschmidt 0 siblings, 0 replies; 24+ messages in thread From: Benjamin Herrenschmidt @ 2009-11-26 21:14 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Kumar Gala On Thu, 2009-11-26 at 17:56 +0100, Takashi Iwai wrote: > Sorry, a typo was in this patch. The fixed version is below. > > FYI, the patchset is found in sound git tree topic/pcm-dma-fix branch: > git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git topic/pcm-dma-fix > Ah, I didn't notice the typo :-) Ack still. Cheers, Ben. > thanks, > > Takashi > > > From bc01f9e365d3afc041ab2c296107728c56410f8f Mon Sep 17 00:00:00 2001 > From: Takashi Iwai <tiwai@suse.de> > Date: Thu, 26 Nov 2009 15:04:24 +0100 > Subject: [PATCH] ALSA: pcm - fix page conversion on non-coherent PPC arch > > The non-cohernet PPC arch doesn't give the correct address by a simple > virt_to_page() for pages allocated via dma_alloc_coherent(). > This patch adds a hack to fix the conversion similarly like MIPS. > > Note that this doesn't fix perfectly: the pages should be marked with > proper pgprot value. This will be done in a future implementation like > the conversion to dma_mmap_coherent(). > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > --- > sound/core/pcm_native.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index e48c5f6..29ab46a 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -3070,6 +3070,16 @@ snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) > if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > return virt_to_page(CAC_ADDR(vaddr)); > #endif > +#if defined(CONFIG_PPC32) && defined(CONFIG_NOT_COHERENT_CACHE) > + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) { > + dma_addr_t addr = substream->runtime->dma_addr + ofs; > + addr -= get_dma_offset(substream->dma_buffer.dev.dev); > + /* assume dma_handle set via pfn_to_phys() in > + * mm/dma-noncoherent.c > + */ > + return pfn_to_page(addr >> PAGE_SHIFT); > + } > +#endif > return virt_to_page(vaddr); > } > ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai 2009-11-26 15:13 ` [PATCH 5/5] ALSA: Remove old DMA-mmap code from arm/devdma.c Takashi Iwai 2009-11-26 16:56 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai @ 2009-11-26 20:51 ` Benjamin Herrenschmidt 2009-11-27 9:18 ` Takashi Iwai 2 siblings, 1 reply; 24+ messages in thread From: Benjamin Herrenschmidt @ 2009-11-26 20:51 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Kumar Gala On Thu, 2009-11-26 at 16:13 +0100, Takashi Iwai wrote: > The non-cohernet PPC arch doesn't give the correct address by a simple > virt_to_page() for pages allocated via dma_alloc_coherent(). > This patch adds a hack to fix the conversion similarly like MIPS. > > Note that this doesn't fix perfectly: the pages should be marked with > proper pgprot value. This will be done in a future implementation like > the conversion to dma_mmap_coherent(). > > Signed-off-by: Takashi Iwai <tiwai@suse.de> This will not work with swiotlb, but then, I don't think we have -yet- to deal with a platform that does both swiotlb and isn't DMA coherent :-) Of course, the conversion to dma_mmap_coherent will makes things better though we really will want to push that function into the dma ops. So it's hackish but for now its an Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cheers, Ben. > --- > sound/core/pcm_native.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index e48c5f6..76eb763 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -3070,6 +3070,16 @@ snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) > if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > return virt_to_page(CAC_ADDR(vaddr)); > #endif > +#if defined(CONFIG_PPC32) && defined(CONFIG_NOT_COHERENT_CACHE) > + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) { > + dma_addr_t addr = substream->runtime->dma_addr + ofs; > + addr -= get_dma_offset(substream->dma_buffer.dev.dev); > + /* assume dma_handle set via pfn_to_phys() in > + * mm/dma-noncoherent.c > + */ > + return pfn_to_page(dma_handle >> PAGE_SHIFT); > + } > +#endif > return virt_to_page(vaddr); > } > ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch 2009-11-26 20:51 ` Benjamin Herrenschmidt @ 2009-11-27 9:18 ` Takashi Iwai 0 siblings, 0 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-27 9:18 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Kumar Gala At Fri, 27 Nov 2009 07:51:44 +1100, Benjamin Herrenschmidt wrote: > > On Thu, 2009-11-26 at 16:13 +0100, Takashi Iwai wrote: > > The non-cohernet PPC arch doesn't give the correct address by a simple > > virt_to_page() for pages allocated via dma_alloc_coherent(). > > This patch adds a hack to fix the conversion similarly like MIPS. > > > > Note that this doesn't fix perfectly: the pages should be marked with > > proper pgprot value. This will be done in a future implementation like > > the conversion to dma_mmap_coherent(). > > > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > > This will not work with swiotlb, but then, I don't think we have -yet- > to deal with a platform that does both swiotlb and isn't DMA > coherent :-) > > Of course, the conversion to dma_mmap_coherent will makes things better > though we really will want to push that function into the dma ops. > > So it's hackish but for now its an > > Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Thanks, I added your ack to the GIT commit. Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch 2009-11-26 15:13 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Takashi Iwai 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai @ 2009-11-27 3:52 ` Wu Zhangjin 2009-11-27 9:26 ` Takashi Iwai 2009-11-27 8:46 ` Ralf Baechle 2 siblings, 1 reply; 24+ messages in thread From: Wu Zhangjin @ 2009-11-27 3:52 UTC (permalink / raw) To: Takashi Iwai Cc: alsa-devel, Ralf Baechle, Thomas Bogendoerfer, linux-mips, Benjamin Herrenschmidt, Kumar Gala, Becky Bruce On Thu, 2009-11-26 at 16:13 +0100, Takashi Iwai wrote: > The non-coherent MIPS arch doesn't give the correct address by a simple > virt_to_page() for pages allocated via dma_alloc_coherent(). > > Original patch by Wu Zhangjin <wuzj@lemote.com>. A proper check of the > buffer allocation type was added to avoid the wrong conversion. > > Note that this doesn't fix perfectly: the pages should be marked with > proper pgprot value. This will be done in a future implementation like > the conversion to dma_mmap_coherent(). > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > --- > sound/core/pcm_native.c | 4 ++++ > 1 files changed, 4 insertions(+), 0 deletions(-) > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index c906be2..e48c5f6 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -3066,6 +3066,10 @@ static inline struct page * > snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) > { > void *vaddr = substream->runtime->dma_area + ofs; > +#if defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT) > + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > + return virt_to_page(CAC_ADDR(vaddr)); > +#endif > return virt_to_page(vaddr); > } Works well on Loongson family machines, thanks! Regards, Wu Zhangjin ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch 2009-11-27 3:52 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Wu Zhangjin @ 2009-11-27 9:26 ` Takashi Iwai 0 siblings, 0 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-27 9:26 UTC (permalink / raw) To: wuzhangjin Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala At Fri, 27 Nov 2009 11:52:58 +0800, Wu Zhangjin wrote: > > On Thu, 2009-11-26 at 16:13 +0100, Takashi Iwai wrote: > > The non-coherent MIPS arch doesn't give the correct address by a simple > > virt_to_page() for pages allocated via dma_alloc_coherent(). > > > > Original patch by Wu Zhangjin <wuzj@lemote.com>. A proper check of the > > buffer allocation type was added to avoid the wrong conversion. > > > > Note that this doesn't fix perfectly: the pages should be marked with > > proper pgprot value. This will be done in a future implementation like > > the conversion to dma_mmap_coherent(). > > > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > > --- > > sound/core/pcm_native.c | 4 ++++ > > 1 files changed, 4 insertions(+), 0 deletions(-) > > > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > > index c906be2..e48c5f6 100644 > > --- a/sound/core/pcm_native.c > > +++ b/sound/core/pcm_native.c > > @@ -3066,6 +3066,10 @@ static inline struct page * > > snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) > > { > > void *vaddr = substream->runtime->dma_area + ofs; > > +#if defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT) > > + if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > > + return virt_to_page(CAC_ADDR(vaddr)); > > +#endif > > return virt_to_page(vaddr); > > } > > Works well on Loongson family machines, thanks! Thanks for checking! Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch 2009-11-26 15:13 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Takashi Iwai 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai 2009-11-27 3:52 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Wu Zhangjin @ 2009-11-27 8:46 ` Ralf Baechle 2009-11-27 9:20 ` Takashi Iwai 2 siblings, 1 reply; 24+ messages in thread From: Ralf Baechle @ 2009-11-27 8:46 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Kumar Gala On Thu, Nov 26, 2009 at 04:13:06PM +0100, Takashi Iwai wrote: > The non-coherent MIPS arch doesn't give the correct address by a simple > virt_to_page() for pages allocated via dma_alloc_coherent(). > > Original patch by Wu Zhangjin <wuzj@lemote.com>. A proper check of the > buffer allocation type was added to avoid the wrong conversion. The origins of this patch go back far further. The oldest patch I could find which is a superset of this was written by Atsushi Nemoto and various incarnations of it have been sumitted to and reject by me a number of times through the years. > Note that this doesn't fix perfectly: the pages should be marked with > proper pgprot value. This will be done in a future implementation like > the conversion to dma_mmap_coherent(). > > Signed-off-by: Takashi Iwai <tiwai@suse.de> So while this is ugly I don't think this patch will actually make the the situation worse for any MIPS platform. So with both eyes closed: Acked-by: Ralf Baechle <ralf@linux-mips.org> Ralf ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch 2009-11-27 8:46 ` Ralf Baechle @ 2009-11-27 9:20 ` Takashi Iwai 0 siblings, 0 replies; 24+ messages in thread From: Takashi Iwai @ 2009-11-27 9:20 UTC (permalink / raw) To: Ralf Baechle Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Kumar Gala At Fri, 27 Nov 2009 08:46:35 +0000, Ralf Baechle wrote: > > On Thu, Nov 26, 2009 at 04:13:06PM +0100, Takashi Iwai wrote: > > > The non-coherent MIPS arch doesn't give the correct address by a simple > > virt_to_page() for pages allocated via dma_alloc_coherent(). > > > > Original patch by Wu Zhangjin <wuzj@lemote.com>. A proper check of the > > buffer allocation type was added to avoid the wrong conversion. > > The origins of this patch go back far further. The oldest patch I could > find which is a superset of this was written by Atsushi Nemoto and > various incarnations of it have been sumitted to and reject by me > a number of times through the years. > > > Note that this doesn't fix perfectly: the pages should be marked with > > proper pgprot value. This will be done in a future implementation like > > the conversion to dma_mmap_coherent(). > > > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > > So while this is ugly I don't think this patch will actually make the > the situation worse for any MIPS platform. So with both eyes closed: > > Acked-by: Ralf Baechle <ralf@linux-mips.org> I added your ack with the comment about the origins to the GIT commit now. Thanks for closing your eyes ;) Hopefully this hack can be removed again shortly... Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2009-11-26 15:13 [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Takashi Iwai 2009-11-26 15:13 ` [PATCH 1/5] ALSA: pcm - Use dma_mmap_coherent() if available Takashi Iwai @ 2010-01-01 19:31 ` Andreas Mohr 2010-01-12 7:02 ` Takashi Iwai 1 sibling, 1 reply; 24+ messages in thread From: Andreas Mohr @ 2010-01-01 19:31 UTC (permalink / raw) To: Takashi Iwai Cc: alsa-devel, Ralf Baechle, Wu Zhangjin, Thomas Bogendoerfer, linux-mips, Benjamin Herrenschmidt, Kumar Gala, Becky Bruce [-- Attachment #1: Type: text/plain, Size: 722 bytes --] Hi, I've tried this patch set (with the typo-corrected part 4) on my ASUS WL-500gP v2 MIPSEL via a backport to 2.6.31.9, but all I get is a small blip of the sound I wanted to play, and then the system is fubar (I believe just the same thing as what happened without having this patch applied). Probably I'm dense and the patch is ARM-only, or my MIPSEL has incorrect cache coherency versus this patch set, or the backport failed due to missing requirements or conflicts. Attached are two crash logs. Any ideas? Would be nice to see this resolved as well, since I now _finally_ have a working consterna^Wconstellation (netconsole, boot, USB host, USB serial) with my patched-up 2.6.31.9 build. Thanks, Andreas Mohr [-- Attachment #2: usb_audio_crash_after_patches.log --] [-- Type: text/plain, Size: 8822 bytes --] Instruction bus error, epc == 2ab4f178, ra == 80000018 kobject: 'ep_01' (81e8a690): kobject_uevent_env kobject: 'ep_01' (81e8a690): kobject_uevent_env: filter function caused the event to drop! kobject: 'ep_01' (81e8a690): kobject_cleanup kobject: 'ep_01' (81e8a690): calling ktype release kobject: 'ep_01': free name EHCI_DIS: hcd 81dd7080 ep 81e09180 qh (null) (#01) Instruction bus error, epc == 8003475c, ra == 80000018 Oops[#1]: Cpu 0 $ 0 : 00000000 1000d001 00000000 80000000 $ 4 : 81dad838 806e5e00 00000000 00000000 $ 8 : 00000000 00000000 81040000 81f16000 $12 : 81da0868 80340000 81da0868 0000000a $16 : 00000000 7fb2dd68 000005b8 81dad838 $20 : 0000000a 81e37ef8 20000000 fffffff6 $24 : 00000000 801874c0 $28 : 81e36000 81e37e40 00000001 80000018 Hi : 00000000 Lo : 00000000 epc : 8003475c wait_consider_task+0x49c/0xe20 Not tainted ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 snd_usb_audio arc4 snd_pcm_oss ecb snd_mixer_oss cryptomgr aead snd_pcm pcompress crypto_blkcipher snd_timer crypto_hash snd_page_alloc evdev ftdi_sio crypto_algapi snd_usb_lib snd_rawmidi b43 mac80211 snd_seq_device snd_hwdep usbhid cfg80211 usbserial hid snd input_core soundcore Process bash (pid: 1447, threadinfo=81e36000, task=81da0838, tls=00000000) Stack : 8033dab8 80027e24 815bdde4 802b89e0 8033c000 81da0838 00000000 8000ace0 00000000 00000000 80047476 0051f510 81dad838 81da0838 00000000 81da094c 81e37ef8 ffffffff 20000000 fffffff6 00000001 800351b4 00000004 801c7cf8 81f323d8 81db5870 00000000 81da0838 8002d0c4 806e5e08 806e5e08 81da0838 0000000a 00000000 7fb2dd68 00000000 0051f56c 00000000 00440000 00525790 ... Call Trace: [<8003475c>] wait_consider_task+0x49c/0xe20 [<800351b4>] do_wait+0xd4/0x340 [<800354e0>] sys_wait4+0xc0/0xec [<800031f0>] stack_done+0x20/0x3c Code: 00431024 14400251 00000000 <ae340000> 16000051 8eb1000c 12200051 8fa30020 0c002bc1 Disabling lock debugging due to kernel taint Instruction bus error, epc == 80004dd8, ra == 80000018 Oops[#2]: Cpu 0 $ 0 : 00000000 1000d000 00000000 00000000 $ 4 : 7f9765d0 81c0ddd0 00000000 1000d001 $ 8 : 00000000 00000000 00000000 81e36000 $12 : 81c084b0 003d0900 81c084b0 00000000 $16 : 00000004 00000000 81c0ddc0 81c0ddc0 $20 : 7f9765d0 00000000 81c0ddcc 00000000 $24 : 00000000 801874c0 $28 : 81c0c000 81c0dd98 00000001 80000018 Hi : 0000004d Lo : ab64ed00 epc : 80004dd8 __copy_user+0xd4/0x2bc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 snd_usb_audio arc4 snd_pcm_oss ecb snd_mixer_oss cryptomgr aead snd_pcm pcompress crypto_blkcipher snd_timer crypto_hash snd_page_alloc evdev ftdi_sio crypto_algapi snd_usb_lib snd_rawmidi b43 mac80211 snd_seq_device snd_hwdep usbhid cfg80211 usbserial hid snd input_core soundcore Process init (pid: 1, threadinfo=81c0c000, task=81c08480, tls=00000000) Stack : 00000000 81c0dda8 81c0df00 80350fb0 81c0ddc0 81c0ddc4 81c0ddc8 81c0ddcc 81c0ddd0 81c0ddd4 00000400 00000000 00000000 00000000 00000000 00000000 00000000 00000000 81f0b000 ffffff9c 81c0dea8 0044a234 7f9769b8 8009b864 00000001 81c0dea8 00000001 81f0b000 ffffff9c 800a2d18 00000003 00000002 00000003 00000003 0000000d 00000000 00000000 00000000 000000c9 00001180 ... Call Trace: [<80004dd8>] __copy_user+0xd4/0x2bc Code: 8ca80000 24a50004 24c6fffc <ac880000> 1706fffb 24840004 10c00040 00864821 240a0020 Instruction bus error, epc == 80004dd8, ra == 80000018 Oops[#3]: Cpu 0 $ 0 : 00000000 1000d000 00000000 00000004 $ 4 : 004c7130 81735dd0 00000000 1000d001 $ 8 : 00000080 00000000 00000000 81e36000 $12 : 81d0e868 00000000 81d0e868 00000000 $16 : 00000004 00000001 81735dc0 81735dc0 $20 : 004c7130 004c7360 81735dcc 00000000 $24 : 00000000 80181208 $28 : 81734000 81735d98 004b0000 80000018 Hi : 00000000 Lo : 00000000 epc : 80004dd8 __copy_user+0xd4/0x2bc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 snd_usb_audio arc4 snd_pcm_oss ecb snd_mixer_oss cryptomgr aead snd_pcm pcompress crypto_blkcipher snd_timer crypto_hash snd_page_alloc evdev ftdi_sio crypto_algapi snd_usb_lib snd_rawmidi b43 mac80211 snd_seq_device snd_hwdep usbhid cfg80211 usbserial hid snd input_core soundcore Process sshd (pid: 1445, threadinfo=81734000, task=81d0e838, tls=00000000) Stack : 0041663c 81735da8 00000000 80200478 81735dc0 81735dc4 81735dc8 81735dcc 81735dd0 81735dd4 00000098 00000000 00000000 00000080 00000000 00000000 00000000 00000000 81735e20 00000001 00000000 00000000 00000040 81735e28 81735e28 fffffdee 81735e20 8009e530 00000000 8173b080 81f731e8 8167d900 00000000 00000000 004bd538 00000090 81cdd360 81ed3160 00000000 00000001 ... Call Trace: [<80004dd8>] __copy_user+0xd4/0x2bc Code: 8ca80000 24a50004 24c6fffc <ac880000> 1706fffb 24840004 10c00040 00864821 240a0020 Instruction bus error, epc == 80096fa0, ra == 80000018 Oops[#4]: Cpu 0 $ 0 : 00000000 1000d000 c02e2002 00000002 $ 4 : 00000001 803b5514 00000001 00000001 $ 8 : 80351000 00080000 81040000 81e36000 $12 : 00000000 645fcd00 81da0868 0000000b $16 : 00000001 81e26138 0044e000 003f0fff $20 : 0046c000 0126b79f 00000000 00000000 $24 : 00000000 80018ff0 $28 : 81c0c000 81c0db48 fffffffe 80000018 Hi : 00000000 Lo : 00000000 epc : 80096fa0 swap_info_get+0x74/0xfc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 snd_usb_audio arc4 snd_pcm_oss ecb snd_mixer_oss cryptomgr aead snd_pcm pcompress crypto_blkcipher snd_timer crypto_hash snd_page_alloc evdev ftdi_sio crypto_algapi snd_usb_lib snd_rawmidi b43 mac80211 snd_seq_device snd_hwdep usbhid cfg80211 usbserial hid snd input_core soundcore Process init (pid: 1, threadinfo=81c0c000, task=81c08480, tls=00000000) Stack : fffffffe 800736a0 00000008 81da0870 80350fd0 80099498 81c08614 81024d60 81e26130 0044c000 00002000 81e26138 0044e000 80088a30 8033dab8 80029d78 7f9765d0 00000000 0046bfff 8033d9c0 81e244a0 81e25004 81e25004 0046c000 00000000 00000001 81e0ba9c 81e244a0 8037f840 81e244d4 81c08480 00000000 00000001 00000000 00000001 8008db1c 81c0dbf0 81e2d354 00000000 ffffffff ... Call Trace: [<80096fa0>] swap_info_get+0x74/0xfc [<80099498>] free_swap_and_cache+0x1c/0x218 [<80088a30>] unmap_vmas+0x418/0x63c [<8008db1c>] exit_mmap+0xb8/0x148 [<8002e3c4>] mmput+0xc0/0x1d8 [<800333e8>] exit_mm+0x260/0x298 [<800357cc>] do_exit+0x1cc/0x688 [<80014658>] nmi_exception_handler+0x0/0x34 Code: 00041840 8ca20020 00431021 <94440000> 1480001d 8fbf0014 3c048030 3c05802c 24a5f280 Fixing recursive fault but reboot is needed! Instruction bus error, epc == 80011530, ra == 80000018 Oops[#5]: Cpu 0 $ 0 : 00000000 1000d001 24020000 80000000 $ 4 : 7fe3fd00 24021017 00000278 81d86be4 $ 8 : 800125cc 80621e80 ffffffff ffffffff $12 : 00000000 80340000 81d86868 0000000b $16 : 00000000 00000000 7fe3fcf0 80621f30 $20 : 7fe3fd08 7fe3fd00 81d86be4 00000012 $24 : 00000000 8025e170 $28 : 80620000 80621e10 80621e80 80000018 Hi : 00000000 Lo : 00000000 epc : 80011530 install_sigtramp+0x20/0x54 Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 snd_usb_audio arc4 snd_pcm_oss ecb snd_mixer_oss cryptomgr aead snd_pcm pcompress crypto_blkcipher snd_timer crypto_hash snd_page_alloc evdev ftdi_sio crypto_algapi snd_usb_lib snd_rawmidi b43 mac80211 snd_seq_device snd_hwdep usbhid cfg80211 usbserial hid snd input_core soundcore Process sshd (pid: 1372, threadinfo=80620000, task=81d86838, tls=00000000) Stack : 80621f30 80621e98 8059ae20 8061f004 00000009 80621f30 00000012 8001263c 81e82448 81e82448 81c59808 800b212c 80621f30 00000012 80621e80 81d86be4 80621e98 ffffffff 004b352c 00000000 00000004 800116bc 817a5000 80621e80 80621f30 80621ea8 00000010 81e82448 00000000 0040ac18 00000000 00000000 00000000 00000000 00000012 00040002 00000000 000005a5 00000000 0000000b ... Call Trace: [<80011530>] install_sigtramp+0x20/0x54 [<8001263c>] setup_frame+0x70/0x110 [<800116bc>] do_notify_resume+0x158/0x428 [<800015f0>] work_notifysig+0xc/0x14 Code: afbf001c 00a22821 02008821 <ac850000> 2402000c ac820004 3c038038 8c620038 0040f809 [-- Attachment #3: usb_audio_crash_after_patches_2.log --] [-- Type: text/plain, Size: 4987 bytes --] Instruction bus error, epc == 2ac68e50, ra == 80000018 Instruction bus error, epc == 8003475c, ra == 80000018 Oops[#1]: Cpu 0 $ 0 : 00000000 1000d001 00000000 80000000 $ 4 : 81d4f838 80733c00 00000000 00000000 $ 8 : 00000000 00000000 81040000 81ef2000 $12 : 81312868 80340000 81312868 0000000a $16 : 00000000 7fd95c08 000005af 81d4f838 $20 : 0000000a 81891ef8 20000000 fffffff6 $24 : 00000000 80018ff0 $28 : 81890000 81891e40 00000001 80000018 Hi : 00000000 Lo : 00000000 epc : 8003475c wait_consider_task+0x49c/0xe20 Not tainted ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 arc4 snd_usb_audio ecb snd_pcm_oss cryptomgr snd_mixer_oss aead pcompress snd_pcm crypto_blkcipher crypto_hash snd_timer crypto_algapi snd_page_alloc evdev snd_usb_lib b43 ftdi_sio mac80211 snd_rawmidi snd_seq_device cfg80211 usbhid snd_hwdep usbserial hid snd input_core soundcore Process bash (pid: 1450, threadinfo=81890000, task=81312838, tls=00000000) Stack : 8033dab8 80027e24 7fd95c08 802c0000 81db5838 81312838 00000000 8000ace0 00000000 00000000 80047476 0051f510 81d4f838 81312838 00000000 8131294c 81891ef8 ffffffff 20000000 fffffff6 00000001 800351b4 00000004 801c7cf8 81e590b8 81db5870 00000000 81312838 8002d0c4 80733c08 80733c08 81312838 0000000a 00000000 7fd95c08 00000000 0051f56c 00000000 00440000 00525790 ... Call Trace: [<8003475c>] wait_consider_task+0x49c/0xe20 [<800351b4>] do_wait+0xd4/0x340 [<800354e0>] sys_wait4+0xc0/0xec [<800031f0>] stack_done+0x20/0x3c Code: 00431024 14400251 00000000 <ae340000> 16000051 8eb1000c 12200051 8fa30020 0c002bc1 Disabling lock debugging due to kernel taint Instruction bus error, epc == 80004dd8, ra == 80000018 Oops[#2]: Cpu 0 $ 0 : 00000000 1000d000 00000000 00000000 $ 4 : 7fca8450 81c0ddd0 00000000 1000d001 $ 8 : 00000000 00000000 00000000 81890000 $12 : 81c084b0 003d0900 81c084b0 00000000 $16 : 00000004 00000000 81c0ddc0 81c0ddc0 $20 : 7fca8450 00000000 81c0ddcc 00000000 $24 : 00000000 801874c0 $28 : 81c0c000 81c0dd98 00000001 80000018 Hi : 0000013d Lo : 9812c600 epc : 80004dd8 __copy_user+0xd4/0x2bc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 arc4 snd_usb_audio ecb snd_pcm_oss cryptomgr snd_mixer_oss aead pcompress snd_pcm crypto_blkcipher crypto_hash snd_timer crypto_algapi snd_page_alloc evdev snd_usb_lib b43 ftdi_sio mac80211 snd_rawmidi snd_seq_device cfg80211 usbhid snd_hwdep usbserial hid snd input_core soundcore Process init (pid: 1, threadinfo=81c0c000, task=81c08480, tls=00000000) Stack : 00000000 81c0dda8 81c0df00 80350fb0 81c0ddc0 81c0ddc4 81c0ddc8 81c0ddcc 81c0ddd0 81c0ddd4 00000400 00000000 00000000 00000000 00000000 00000000 00000000 00000000 81ec3000 ffffff9c 81c0dea8 0044a234 7fca8838 8009b864 00000001 81c0dea8 00000001 81ec3000 ffffff9c 800a2d18 00000003 00000002 00000003 00000003 0000000d 00000000 00000000 00000000 000000cb 00001180 ... Call Trace: [<80004dd8>] __copy_user+0xd4/0x2bc Code: 8ca80000 24a50004 24c6fffc <ac880000> 1706fffb 24840004 10c00040 00864821 240a0020 Instruction bus error, epc == 80004dd8, ra == 80000018 Oops[#3]: Cpu 0 $ 0 : 00000000 1000d000 00000000 00000004 $ 4 : 004c7130 81ebbdd0 00000000 1000d001 $ 8 : 00000080 00000000 00000000 81890000 $12 : 81d5c868 00000000 81d5c868 00000000 $16 : 00000004 00000001 81ebbdc0 81ebbdc0 $20 : 004c7130 004c7360 81ebbdcc 00000000 $24 : 00000000 80181208 $28 : 81eba000 81ebbd98 004b0000 80000018 Hi : 00000000 Lo : 00000000 epc : 80004dd8 __copy_user+0xd4/0x2bc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: ipv6 arc4 snd_usb_audio ecb snd_pcm_oss cryptomgr snd_mixer_oss aead pcompress snd_pcm crypto_blkcipher crypto_hash snd_timer crypto_algapi snd_page_alloc evdev snd_usb_lib b43 ftdi_sio mac80211 snd_rawmidi snd_seq_device cfg80211 usbhid snd_hwdep usbserial hid snd input_core soundcore Process sshd (pid: 1448, threadinfo=81eba000, task=81d5c838, tls=00000000) Stack : cd09000a 81ebbda8 00000000 00000005 81ebbdc0 81ebbdc4 81ebbdc8 81ebbdcc 81ebbdd0 81ebbdd4 00000098 00000000 00000000 00000080 00000000 00000000 000000e2 81cdd360 81ea39d0 81c4ff20 000000e2 81cdd360 81c4ff20 80251b38 000000e3 80251e78 81ebbe20 8009e530 81cdd080 81c4ff20 81cdd388 80215c18 80000000 81c4ff20 00000042 000000e2 81cdd360 81c4ff20 00000042 801af5f0 ... Call Trace: [<80004dd8>] __copy_user+0xd4/0x2bc Code: 8ca80000 24a50004 24c6fffc <ac880000> 1706fffb 24840004 10c00040 00864821 240a0020 Kernel panic - not syncing: Attempted to kill init! ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-01 19:31 ` [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Andreas Mohr @ 2010-01-12 7:02 ` Takashi Iwai 2010-01-13 9:07 ` Takashi Iwai 2010-01-13 9:28 ` Andreas Mohr 0 siblings, 2 replies; 24+ messages in thread From: Takashi Iwai @ 2010-01-12 7:02 UTC (permalink / raw) To: Andreas Mohr Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala At Fri, 1 Jan 2010 20:31:30 +0100, Andreas Mohr wrote: > > Hi, > > I've tried this patch set (with the typo-corrected part 4) on my ASUS > WL-500gP v2 MIPSEL via a backport to 2.6.31.9, but all I get is a > small blip of the sound I wanted to play, and then the system is fubar > (I believe just the same thing as what happened without having this patch > applied). As I mentioned in the previous followup, if your device is a USB-audio, the patch doesn't help because it's for devices with buffers using dma_alloc_coherent(). For USB-audio, it uses vmalloc for an intermediate buffer. Maybe this should be changed to dma_*() stuff for such architectures. Nevertheless, I don't know whether the crash is related with the audio part... Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-12 7:02 ` Takashi Iwai @ 2010-01-13 9:07 ` Takashi Iwai 2010-01-14 7:46 ` Andreas Mohr 2010-01-15 3:28 ` Benjamin Herrenschmidt 2010-01-13 9:28 ` Andreas Mohr 1 sibling, 2 replies; 24+ messages in thread From: Takashi Iwai @ 2010-01-13 9:07 UTC (permalink / raw) To: Andreas Mohr Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala At Tue, 12 Jan 2010 08:02:36 +0100, I wrote: > > At Fri, 1 Jan 2010 20:31:30 +0100, > Andreas Mohr wrote: > > > > Hi, > > > > I've tried this patch set (with the typo-corrected part 4) on my ASUS > > WL-500gP v2 MIPSEL via a backport to 2.6.31.9, but all I get is a > > small blip of the sound I wanted to play, and then the system is fubar > > (I believe just the same thing as what happened without having this patch > > applied). > > As I mentioned in the previous followup, if your device is a > USB-audio, the patch doesn't help because it's for devices with > buffers using dma_alloc_coherent(). For USB-audio, it uses vmalloc > for an intermediate buffer. Maybe this should be changed to dma_*() > stuff for such architectures. A quick patch below (totally untested!) might do that. It's passing the device struct blindly, so not sure whether this would actually work for all dma_alloc_coherent(). Takashi --- diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 9edef46..6c82026 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -734,7 +734,7 @@ static void snd_complete_sync_urb(struct urb *urb) } } - +#ifdef USBAUDIO_VMALLOC_BUFFER /* get the physical page pointer at the given offset */ static struct page *snd_pcm_get_vmalloc_page(struct snd_pcm_substream *subs, unsigned long offset) @@ -769,6 +769,24 @@ static int snd_pcm_free_vmalloc_buffer(struct snd_pcm_substream *subs) return 0; } +#define preallocate_buffer(chip, pcm, stream) /* NOP */ + +#else +#define snd_pcm_get_vmalloc_page NULL +#define snd_pcm_alloc_vmalloc_buffer snd_pcm_lib_malloc_pages +#define snd_pcm_free_vmalloc_buffer snd_pcm_lib_free_pages + +static int preallocate_buffer(struct snd_usb_audio *chip, struct snd_pcm *pcm, + int stream) +{ + struct snd_pcm_substream *subs = pcm->streams[stream].substream; + if (!subs) + return 0; + return snd_pcm_lib_preallocate_pages(subs, SNDRV_DMA_TYPE_DEV, + chip->card->dev, + 1024 * 64, 1024 * 1024); +} +#endif /* * unlink active urbs. @@ -2328,6 +2346,7 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud err = snd_pcm_new_stream(as->pcm, stream, 1); if (err < 0) return err; + preallocate_buffer(chip, as->pcm, stream); init_substream(as, stream, fp); return 0; } @@ -2356,6 +2375,7 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud else strcpy(pcm->name, "USB Audio"); + preallocate_buffer(chip, pcm, stream); init_substream(as, stream, fp); list_add(&as->list, &chip->pcm_list); ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-13 9:07 ` Takashi Iwai @ 2010-01-14 7:46 ` Andreas Mohr 2010-01-14 7:54 ` Takashi Iwai 2010-01-15 3:28 ` Benjamin Herrenschmidt 1 sibling, 1 reply; 24+ messages in thread From: Andreas Mohr @ 2010-01-14 7:46 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Andreas Mohr, Kumar Gala On Wed, Jan 13, 2010 at 10:07:32AM +0100, Takashi Iwai wrote: > > As I mentioned in the previous followup, if your device is a > > USB-audio, the patch doesn't help because it's for devices with > > buffers using dma_alloc_coherent(). For USB-audio, it uses vmalloc > > for an intermediate buffer. Maybe this should be changed to dma_*() > > stuff for such architectures. > > A quick patch below (totally untested!) might do that. > It's passing the device struct blindly, so not sure whether this would > actually work for all dma_alloc_coherent(). Thanks a lot, tested, but AFAICS there isn't much of a change unfortunately (log below). Note that the old snd-usb-audio.ko did contain snd_pcm_get_vmalloc_page(), and the new one (put in the correct kernel version dir and depmod -a) doesn't, thus the patch was applied and did make it to the binary side, and it did get loaded correctly upon plugging I think. Would one also want strace/ltrace output of the userspace side of things? (likely rather useless, except for perhaps nailing that it does crash where we think it crashes or so) Frankly I'm still pretty much in uninformed shape concerning this mmap pcm buffer issue, would need to take quite a bit more time for research in order to be able to take part in the discussion in a productive way ;) Thanks, Andreas Mohr # cat /usr/local/bin/audio_test.sh #!/bin/sh # better make sure... sync sleep 1 aplay /usr/local/sounds/attention [LOCKUP] $ ../netconsole.sh kobject: 'ep_01' (81f70090): kobject_add_internal: parent: '2-1.1.1:1.1', set: 'devices' kobject: 'ep_01' (81f70090): kobject_uevent_env kobject: 'ep_01' (81f70090): kobject_uevent_env: filter function caused the event to drop! setting usb interface 1:1 Instruction bus error, epc == 2ab4f178, ra == 80000018 kobject: 'ep_01' (81f70090): kobject_uevent_env kobject: 'ep_01' (81f70090): kobject_uevent_env: filter function caused the event to drop! kobject: 'ep_01' (81f70090): kobject_cleanup kobject: 'ep_01' (81f70090): calling ktype release kobject: 'ep_01': free name EHCI_DIS: hcd 81dd7080 ep 81604800 qh (null) (#01) Instruction bus error, epc == 8003475c, ra == 80000018 Oops[#1]: Cpu 0 $ 0 : 00000000 1000d001 00000000 80000000 $ 4 : 81d30838 81e57ac0 00000000 00000000 $ 8 : 00000000 00000000 81040000 81ec8000 $12 : 81d37868 80340000 81d37868 0000000a $16 : 00000000 7fa911e8 00000538 81d30838 $20 : 0000000a 81f0def8 20000000 fffffff6 $24 : 00000000 801874c0 $28 : 81f0c000 81f0de40 00000001 80000018 Hi : 00000000 Lo : 00000000 epc : 8003475c wait_consider_task+0x49c/0xe20 Not tainted ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: snd_usb_audio snd_pcm_oss snd_mixer_oss snd_pcm snd_timer evdev snd_page_alloc snd_usb_lib snd_rawmidi snd_seq_device snd_hwdep usbhid hid snd input_core soundcore ipv6 arc4 ecb cryptomgr aead pcompress crypto_blkcipher crypto_hash crypto_algapi b43 ftdi_sio mac80211 cfg80211 usbserial Process audio_test.sh (pid: 1333, threadinfo=81f0c000, task=81d37838, tls=00000000) Stack : 8033dab8 80027e24 81e8488c 802b89e0 8033c000 81d37838 00000000 8000ace0 00000000 00000000 81e57e60 80018238 81d30838 81d37838 00000000 81d3794c 81f0def8 ffffffff 20000000 fffffff6 00000001 800351b4 00000004 801c7cf8 7fa911a8 81db5870 00000000 81d37838 8002d0c4 81e57ac8 81e57ac8 81d37838 00000000 00000000 7fa911e8 00000000 0051f56c 00000000 00440000 00525790 ... Call Trace: [<8003475c>] wait_consider_task+0x49c/0xe20 [<800351b4>] do_wait+0xd4/0x340 [<800354e0>] sys_wait4+0xc0/0xec [<800031f0>] stack_done+0x20/0x3c Code: 00431024 14400251 00000000 <ae340000> 16000051 8eb1000c 12200051 8fa30020 0c002bc1 Disabling lock debugging due to kernel taint Instruction bus error, epc == 80004dd8, ra == 80000018 Oops[#2]: Cpu 0 $ 0 : 00000000 1000d000 00000000 00000000 $ 4 : 7ff0dc60 81c0ddd0 00000000 1000d001 $ 8 : 00000000 00000000 00000000 81f0c000 $12 : 81c084b0 003d0900 81c084b0 00000000 $16 : 00000004 00000000 81c0ddc0 81c0ddc0 $20 : 7ff0dc60 00000000 81c0ddcc 00000000 $24 : 00000000 801874c0 $28 : 81c0c000 81c0dd98 00000001 80000018 Hi : 0000007f Lo : 3d391e00 epc : 80004dd8 __copy_user+0xd4/0x2bc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: snd_usb_audio snd_pcm_oss snd_mixer_oss snd_pcm snd_timer evdev snd_page_alloc snd_usb_lib snd_rawmidi snd_seq_device snd_hwdep usbhid hid snd input_core soundcore ipv6 arc4 ecb cryptomgr aead pcompress crypto_blkcipher crypto_hash crypto_algapi b43 ftdi_sio mac80211 cfg80211 usbserial Process init (pid: 1, threadinfo=81c0c000, task=81c08480, tls=00000000) Stack : 00000000 81c0dda8 81c0df00 80350fb0 81c0ddc0 81c0ddc4 81c0ddc8 81c0ddcc 81c0ddd0 81c0ddd4 00000400 00000000 00000000 00000000 00000000 00000000 00000000 00000000 81f04000 ffffff9c 81c0dea8 0044a234 7ff0e048 8009b864 00000001 81c0dea8 00000001 81f04000 ffffff9c 800a2d18 00000003 00000002 00000003 00000003 0000000d 00000000 00000000 00000000 000000cc 00001180 ... Call Trace: [<80004dd8>] __copy_user+0xd4/0x2bc Code: 8ca80000 24a50004 24c6fffc <ac880000> 1706fffb 24840004 10c00040 00864821 240a0020 Instruction bus error, epc == 8003475c, ra == 80000018 Oops[#3]: Cpu 0 $ 0 : 00000000 1000d001 00000000 80000000 $ 4 : 81d37838 80415e00 00000000 00000000 $ 8 : 00000000 00000000 81040000 81f0c000 $12 : 80484868 80340000 80484868 0000000b $16 : 00000000 7febff60 00000535 81d37838 $20 : 0000000b 81e2bef8 20000000 fffffff6 $24 : 00000000 80018ff0 $28 : 81e2a000 81e2be40 00000001 80000018 Hi : 00000000 Lo : 00000000 epc : 8003475c wait_consider_task+0x49c/0xe20 Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: snd_usb_audio snd_pcm_oss snd_mixer_oss snd_pcm snd_timer evdev snd_page_alloc snd_usb_lib snd_rawmidi snd_seq_device snd_hwdep usbhid hid snd input_core soundcore ipv6 arc4 ecb cryptomgr aead pcompress crypto_blkcipher crypto_hash crypto_algapi b43 ftdi_sio mac80211 cfg80211 usbserial Process bash (pid: 1175, threadinfo=81e2a000, task=80484838, tls=00000000) Stack : 8033dab8 80027e24 81f18390 00002a84 81d37838 80484838 81e57e60 8000ace0 00000000 00000000 80047476 0051f510 81d37838 80484838 00000000 8048494c 81e2bef8 ffffffff 20000000 fffffff6 00000001 800351b4 81e8a1e0 00000008 81e8a0d4 81d37870 00000000 80484838 8002d0c4 80415e08 80415e08 80484838 0000000a 00000000 7febff60 00000000 0051f56c 00000000 00440000 00525790 ... Call Trace: [<8003475c>] wait_consider_task+0x49c/0xe20 [<800351b4>] do_wait+0xd4/0x340 [<800354e0>] sys_wait4+0xc0/0xec [<800031f0>] stack_done+0x20/0x3c Code: 00431024 14400251 00000000 <ae340000> 16000051 8eb1000c 12200051 8fa30020 0c002bc1 Instruction bus error, epc == 80096fa0, ra == 80000018 Oops[#4]: Cpu 0 $ 0 : 00000000 1000d000 c0180002 00000002 $ 4 : 00000001 803b5514 00000001 81e24000 $ 8 : 80351000 00080000 81040000 81e2a000 $12 : 00000000 07de2900 ffffffff 00000000 $16 : 00000001 81e24fa0 2abe8000 003cbf03 $20 : 2abe9000 0119a613 00000000 00000000 $24 : 00000000 80018ff0 $28 : 81c0c000 81c0db48 00000000 80000018 Hi : 00000000 Lo : 00000000 epc : 80096fa0 swap_info_get+0x74/0xfc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: snd_usb_audio snd_pcm_oss snd_mixer_oss snd_pcm snd_timer evdev snd_page_alloc snd_usb_lib snd_rawmidi snd_seq_device snd_hwdep usbhid hid snd input_core soundcore ipv6 arc4 ecb cryptomgr aead pcompress crypto_blkcipher crypto_hash crypto_algapi b43 ftdi_sio mac80211 cfg80211 usbserial Process init (pid: 1, threadinfo=81c0c000, task=81c08480, tls=00000000) Stack : ffffffff 800736a0 80002000 80000600 80350fd0 80099498 00002000 81023340 81e24f9c 2abe7000 00002000 81e24fa0 2abe8000 80088a30 81e0da9c 81e1e000 8037f840 81e1e034 2abe8fff 8033d9c0 81e1e000 81e1f2a8 81e1f2a8 2abe9000 00000000 00000001 81e0da9c 81e1e000 8037f840 81e1e034 81c08480 00000000 00000001 00000000 00000001 8008db1c 81c0dbf0 81e26000 00000000 ffffffff ... Call Trace: [<80096fa0>] swap_info_get+0x74/0xfc [<80099498>] free_swap_and_cache+0x1c/0x218 [<80088a30>] unmap_vmas+0x418/0x63c [<8008db1c>] exit_mmap+0xb8/0x148 [<8002e3c4>] mmput+0xc0/0x1d8 [<800333e8>] exit_mm+0x260/0x298 [<800357cc>] do_exit+0x1cc/0x688 [<80014658>] nmi_exception_handler+0x0/0x34 Code: 00041840 8ca20020 00431021 <94440000> 1480001d 8fbf0014 3c048030 3c05802c 24a5f280 Fixing recursive fault but reboot is needed! Instruction bus error, epc == 80004dd8, ra == 80000018 Oops[#5]: Cpu 0 $ 0 : 00000000 1000d000 00000000 00000004 $ 4 : 004c2a30 81e3ddd0 00000000 1000d001 $ 8 : 00000080 00000000 00000000 81e2a000 $12 : 81d66868 00000000 81d66868 00000000 $16 : 00000004 00000001 81e3ddc0 81e3ddc0 $20 : 004c2a30 004c7c98 81e3ddcc 00000000 $24 : 00000000 80181208 $28 : 81e3c000 81e3dd98 004b0000 80000018 Hi : 00000000 Lo : 00000000 epc : 80004dd8 __copy_user+0xd4/0x2bc Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: snd_usb_audio snd_pcm_oss snd_mixer_oss snd_pcm snd_timer evdev snd_page_alloc snd_usb_lib snd_rawmidi snd_seq_device snd_hwdep usbhid hid snd input_core soundcore ipv6 arc4 ecb cryptomgr aead pcompress crypto_blkcipher crypto_hash crypto_algapi b43 ftdi_sio mac80211 cfg80211 usbserial Process sshd (pid: 1173, threadinfo=81e3c000, task=81d66838, tls=00000000) Stack : 0041663c 81e3dda8 00000000 80200478 81e3ddc0 81e3ddc4 81e3ddc8 81e3ddcc 81e3ddd0 81e3ddd4 00000098 00000000 00000000 00000080 00000000 00000000 00000000 00000000 81e3de20 00000001 00000000 00000000 00000040 81e3de28 81e3de28 fffffdee 81e3de20 8009e530 00000000 814a5a20 81f5d8ec 81ed3900 00000000 00000000 004bd538 00000038 81d41900 8017a668 00000000 00000001 ... Call Trace: [<80004dd8>] __copy_user+0xd4/0x2bc Code: 8ca80000 24a50004 24c6fffc <ac880000> 1706fffb 24840004 10c00040 00864821 240a0020 Instruction bus error, epc == 80011530, ra == 80000018 Oops[#6]: Cpu 0 $ 0 : 00000000 1000d001 24020000 80000000 $ 4 : 7fb160e0 24021017 00000278 81c6ec2c $ 8 : 800125cc 8155fe80 ffffffff ffffffff $12 : 00000000 80340000 81c6e8b0 0000000b $16 : 00000000 00000000 7fb160d0 8155ff30 $20 : 7fb160e8 7fb160e0 81c6ec2c 00000012 $24 : 00000000 8025e170 $28 : 8155e000 8155fe10 8155fe80 80000018 Hi : 00000000 Lo : 00000000 epc : 80011530 install_sigtramp+0x20/0x54 Tainted: G D ra : 80000018 0x80000018 Status: 1000d003 KERNEL EXL IE Cause : 00800018 PrId : 00029029 (Broadcom BCM3302) Modules linked in: snd_usb_audio snd_pcm_oss snd_mixer_oss snd_pcm snd_timer evdev snd_page_alloc snd_usb_lib snd_rawmidi snd_seq_device snd_hwdep usbhid hid snd input_core soundcore ipv6 arc4 ecb cryptomgr aead pcompress crypto_blkcipher crypto_hash crypto_algapi b43 ftdi_sio mac80211 cfg80211 usbserial Process sshd (pid: 1100, threadinfo=8155e000, task=81c6e880, tls=00000000) Stack : 8155ff30 8155fe98 8167f000 8169f004 00000009 8155ff30 00000012 8001263c 81d58b18 81d58b18 81c59808 800b212c 8155ff30 00000012 8155fe80 81c6ec2c 8155fe98 ffffffff 004b352c 00000000 00000004 800116bc 8167f1e0 8155fe80 8155ff30 8155fea8 00000010 81d58b18 00000000 0040ac18 00000000 00000000 00000000 00000000 00000012 00040002 00000000 00000495 00000000 0000000b ... Call Trace: [<80011530>] install_sigtramp+0x20/0x54 [<8001263c>] setup_frame+0x70/0x110 [<800116bc>] do_notify_resume+0x158/0x428 [<800015f0>] work_notifysig+0xc/0x14 Code: afbf001c 00a22821 02008821 <ac850000> 2402000c ac820004 3c038038 8c620038 0040f809 Instruction bus error, epc == 2ac458ec, ra == 80000018 ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-14 7:46 ` Andreas Mohr @ 2010-01-14 7:54 ` Takashi Iwai 0 siblings, 0 replies; 24+ messages in thread From: Takashi Iwai @ 2010-01-14 7:54 UTC (permalink / raw) To: Andreas Mohr Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Kumar Gala At Thu, 14 Jan 2010 08:46:38 +0100, Andreas Mohr wrote: > > On Wed, Jan 13, 2010 at 10:07:32AM +0100, Takashi Iwai wrote: > > > As I mentioned in the previous followup, if your device is a > > > USB-audio, the patch doesn't help because it's for devices with > > > buffers using dma_alloc_coherent(). For USB-audio, it uses vmalloc > > > for an intermediate buffer. Maybe this should be changed to dma_*() > > > stuff for such architectures. > > > > A quick patch below (totally untested!) might do that. > > It's passing the device struct blindly, so not sure whether this would > > actually work for all dma_alloc_coherent(). > > Thanks a lot, tested, but AFAICS there isn't much of a change unfortunately > (log below). Of course, not for the crash. The patch was for improving the sound quality (if any). Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-13 9:07 ` Takashi Iwai 2010-01-14 7:46 ` Andreas Mohr @ 2010-01-15 3:28 ` Benjamin Herrenschmidt 2010-01-15 6:43 ` Takashi Iwai 1 sibling, 1 reply; 24+ messages in thread From: Benjamin Herrenschmidt @ 2010-01-15 3:28 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Andreas Mohr, Kumar Gala > A quick patch below (totally untested!) might do that. > It's passing the device struct blindly, so not sure whether this would > actually work for all dma_alloc_coherent(). On archs that have dma_ops such as powerpc (but I think x86 too nowadays) you cannot use the USB device for dma_* operations. You need to get up to the host controller device... It -might- be worth looking at adding code to the USB stack to propagate the parent device dma_ops down to USB devices... hard to tell. Cheers, Ben. > > Takashi > > --- > diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c > index 9edef46..6c82026 100644 > --- a/sound/usb/usbaudio.c > +++ b/sound/usb/usbaudio.c > @@ -734,7 +734,7 @@ static void snd_complete_sync_urb(struct urb *urb) > } > } > > - > +#ifdef USBAUDIO_VMALLOC_BUFFER > /* get the physical page pointer at the given offset */ > static struct page *snd_pcm_get_vmalloc_page(struct snd_pcm_substream *subs, > unsigned long offset) > @@ -769,6 +769,24 @@ static int snd_pcm_free_vmalloc_buffer(struct snd_pcm_substream *subs) > return 0; > } > > +#define preallocate_buffer(chip, pcm, stream) /* NOP */ > + > +#else > +#define snd_pcm_get_vmalloc_page NULL > +#define snd_pcm_alloc_vmalloc_buffer snd_pcm_lib_malloc_pages > +#define snd_pcm_free_vmalloc_buffer snd_pcm_lib_free_pages > + > +static int preallocate_buffer(struct snd_usb_audio *chip, struct snd_pcm *pcm, > + int stream) > +{ > + struct snd_pcm_substream *subs = pcm->streams[stream].substream; > + if (!subs) > + return 0; > + return snd_pcm_lib_preallocate_pages(subs, SNDRV_DMA_TYPE_DEV, > + chip->card->dev, > + 1024 * 64, 1024 * 1024); > +} > +#endif > > /* > * unlink active urbs. > @@ -2328,6 +2346,7 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud > err = snd_pcm_new_stream(as->pcm, stream, 1); > if (err < 0) > return err; > + preallocate_buffer(chip, as->pcm, stream); > init_substream(as, stream, fp); > return 0; > } > @@ -2356,6 +2375,7 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud > else > strcpy(pcm->name, "USB Audio"); > > + preallocate_buffer(chip, pcm, stream); > init_substream(as, stream, fp); > > list_add(&as->list, &chip->pcm_list); ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-15 3:28 ` Benjamin Herrenschmidt @ 2010-01-15 6:43 ` Takashi Iwai 2010-01-15 6:50 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 24+ messages in thread From: Takashi Iwai @ 2010-01-15 6:43 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Andreas Mohr, Kumar Gala At Fri, 15 Jan 2010 14:28:02 +1100, Benjamin Herrenschmidt wrote: > > > > A quick patch below (totally untested!) might do that. > > It's passing the device struct blindly, so not sure whether this would > > actually work for all dma_alloc_coherent(). > > On archs that have dma_ops such as powerpc (but I think x86 too > nowadays) you cannot use the USB device for dma_* operations. You need > to get up to the host controller device... Yep, I don't think this being a proper fix, too. > It -might- be worth looking at adding code to the USB stack to propagate > the parent device dma_ops down to USB devices... hard to tell. Or we may simply need to drop the mmap support on such architectures... thanks, Takashi > > Cheers, > Ben. > > > > > Takashi > > > > --- > > diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c > > index 9edef46..6c82026 100644 > > --- a/sound/usb/usbaudio.c > > +++ b/sound/usb/usbaudio.c > > @@ -734,7 +734,7 @@ static void snd_complete_sync_urb(struct urb *urb) > > } > > } > > > > - > > +#ifdef USBAUDIO_VMALLOC_BUFFER > > /* get the physical page pointer at the given offset */ > > static struct page *snd_pcm_get_vmalloc_page(struct snd_pcm_substream *subs, > > unsigned long offset) > > @@ -769,6 +769,24 @@ static int snd_pcm_free_vmalloc_buffer(struct snd_pcm_substream *subs) > > return 0; > > } > > > > +#define preallocate_buffer(chip, pcm, stream) /* NOP */ > > + > > +#else > > +#define snd_pcm_get_vmalloc_page NULL > > +#define snd_pcm_alloc_vmalloc_buffer snd_pcm_lib_malloc_pages > > +#define snd_pcm_free_vmalloc_buffer snd_pcm_lib_free_pages > > + > > +static int preallocate_buffer(struct snd_usb_audio *chip, struct snd_pcm *pcm, > > + int stream) > > +{ > > + struct snd_pcm_substream *subs = pcm->streams[stream].substream; > > + if (!subs) > > + return 0; > > + return snd_pcm_lib_preallocate_pages(subs, SNDRV_DMA_TYPE_DEV, > > + chip->card->dev, > > + 1024 * 64, 1024 * 1024); > > +} > > +#endif > > > > /* > > * unlink active urbs. > > @@ -2328,6 +2346,7 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud > > err = snd_pcm_new_stream(as->pcm, stream, 1); > > if (err < 0) > > return err; > > + preallocate_buffer(chip, as->pcm, stream); > > init_substream(as, stream, fp); > > return 0; > > } > > @@ -2356,6 +2375,7 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud > > else > > strcpy(pcm->name, "USB Audio"); > > > > + preallocate_buffer(chip, pcm, stream); > > init_substream(as, stream, fp); > > > > list_add(&as->list, &chip->pcm_list); > > ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-15 6:43 ` Takashi Iwai @ 2010-01-15 6:50 ` Benjamin Herrenschmidt 2010-01-15 7:32 ` Takashi Iwai 0 siblings, 1 reply; 24+ messages in thread From: Benjamin Herrenschmidt @ 2010-01-15 6:50 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Andreas Mohr, Kumar Gala On Fri, 2010-01-15 at 07:43 +0100, Takashi Iwai wrote: > > > It -might- be worth looking at adding code to the USB stack to > propagate > > the parent device dma_ops down to USB devices... hard to tell. > > Or we may simply need to drop the mmap support on such > architectures... Nah, that would suck since that includes x86 nowadays :-) I think you probably need to separate the struct device * used for DMA (it could be default be the same as the "main" struct device tho or it could default to NULL which means no mmap support). USB could (if not already) provide an accessor to obtain the HC's struct device for such mappings. We'll have to discuss that with Alan Stern I suppose. The USB Audio or similar drivers could then use that accessors to fill up Alsa's dma_device field to replace the "default". Cheers, Ben. ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-15 6:50 ` Benjamin Herrenschmidt @ 2010-01-15 7:32 ` Takashi Iwai 0 siblings, 0 replies; 24+ messages in thread From: Takashi Iwai @ 2010-01-15 7:32 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Ralf Baechle, Andreas Mohr, Kumar Gala At Fri, 15 Jan 2010 17:50:49 +1100, Benjamin Herrenschmidt wrote: > > On Fri, 2010-01-15 at 07:43 +0100, Takashi Iwai wrote: > > > > > It -might- be worth looking at adding code to the USB stack to > > propagate > > > the parent device dma_ops down to USB devices... hard to tell. > > > > Or we may simply need to drop the mmap support on such > > architectures... > > Nah, that would suck since that includes x86 nowadays :-) Ah, no, I meant about non-coherent architectures that can't use vmalloc pages as the intermediate buffer. Dropping mmap for x86 would be a big regression ;) > I think you probably need to separate the struct device * used for DMA > (it could be default be the same as the "main" struct device tho or it > could default to NULL which means no mmap support). > > USB could (if not already) provide an accessor to obtain the HC's struct > device for such mappings. We'll have to discuss that with Alan Stern I > suppose. > > The USB Audio or similar drivers could then use that accessors to fill > up Alsa's dma_device field to replace the "default". The situation of usb-audio is, unfortunately, a bit more complex because the driver needs a continuous ring-buffer. The packet data are copied from that intermediate buffer on demand. This isn't efficient, but the continuous ring-buffer is demanded by the current API design exported as mmap. thanks, Takashi ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures 2010-01-12 7:02 ` Takashi Iwai 2010-01-13 9:07 ` Takashi Iwai @ 2010-01-13 9:28 ` Andreas Mohr 1 sibling, 0 replies; 24+ messages in thread From: Andreas Mohr @ 2010-01-13 9:28 UTC (permalink / raw) To: Takashi Iwai Cc: linux-mips, alsa-devel, Thomas Bogendoerfer, Becky Bruce, Wu Zhangjin, Benjamin Herrenschmidt, Ralf Baechle, Andreas Mohr, Kumar Gala Hi, On Tue, Jan 12, 2010 at 08:02:36AM +0100, Takashi Iwai wrote: > At Fri, 1 Jan 2010 20:31:30 +0100, > Andreas Mohr wrote: > > > > Hi, > > > > I've tried this patch set (with the typo-corrected part 4) on my ASUS > > WL-500gP v2 MIPSEL via a backport to 2.6.31.9, but all I get is a > > small blip of the sound I wanted to play, and then the system is fubar > > (I believe just the same thing as what happened without having this patch > > applied). Crap, you already managed to beat me to my own reply! ;) (I'll try your patch in the other mail _ASAP_) > As I mentioned in the previous followup, if your device is a > USB-audio, the patch doesn't help because it's for devices with > buffers using dma_alloc_coherent(). For USB-audio, it uses vmalloc > for an intermediate buffer. Maybe this should be changed to dma_*() > stuff for such architectures. I've been searching the mailing list postings up and down, but I couldn't deduce anything to that effect from that content (but I'm mailing list-externally - maybe I just really didn't find the correct posting or there was a threading split) > Nevertheless, I don't know whether the crash is related with the > audio part... Yes, I wasn't fully pointing at the crash being caused by insufficient patches in that area either... (but I haven't fully investigated these OOPSes yet) Thanks a lot for your new test patch, Andreas Mohr ^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2010-01-15 7:32 UTC | newest] Thread overview: 24+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-11-26 15:13 [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Takashi Iwai 2009-11-26 15:13 ` [PATCH 1/5] ALSA: pcm - Use dma_mmap_coherent() if available Takashi Iwai 2009-11-26 15:13 ` [PATCH 2/5] ALSA: pcm - define snd_pcm_default_page_ops() Takashi Iwai 2009-11-26 15:13 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Takashi Iwai 2009-11-26 15:13 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai 2009-11-26 15:13 ` [PATCH 5/5] ALSA: Remove old DMA-mmap code from arm/devdma.c Takashi Iwai 2009-11-26 16:56 ` [PATCH 4/5] ALSA: pcm - fix page conversion on non-coherent PPC arch Takashi Iwai 2009-11-26 21:14 ` Benjamin Herrenschmidt 2009-11-26 20:51 ` Benjamin Herrenschmidt 2009-11-27 9:18 ` Takashi Iwai 2009-11-27 3:52 ` [PATCH 3/5] ALSA: pcm - fix page conversion on non-coherent MIPS arch Wu Zhangjin 2009-11-27 9:26 ` Takashi Iwai 2009-11-27 8:46 ` Ralf Baechle 2009-11-27 9:20 ` Takashi Iwai 2010-01-01 19:31 ` [PATCH 0/5] PCM mmap (temporary) fixes for non-coherent architectures Andreas Mohr 2010-01-12 7:02 ` Takashi Iwai 2010-01-13 9:07 ` Takashi Iwai 2010-01-14 7:46 ` Andreas Mohr 2010-01-14 7:54 ` Takashi Iwai 2010-01-15 3:28 ` Benjamin Herrenschmidt 2010-01-15 6:43 ` Takashi Iwai 2010-01-15 6:50 ` Benjamin Herrenschmidt 2010-01-15 7:32 ` Takashi Iwai 2010-01-13 9:28 ` Andreas Mohr
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox