Re: Call to mmap in ALSA lib 1.0.13 fails in src/pcm/pcm_mmap.c line 367

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

 



At Wed, 20 Dec 2006 13:29:58 -0500,
David Cullen wrote:
> 
> Takashi Iwai wrote:
> > At Tue, 19 Dec 2006 10:12:54 -0500,
> > David Cullen wrote:
> >> In alsa-driver-1.0.13/acore/memalloc.c there is this section of code
> >> 
> >> /*
> >>  *  Hacks
> >>  */
> >> 
> >> #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
> >> #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 5)
> >> 
> >> I am using a patched 2.6.13 kernel.  Should I change that last line
> >> to be KERNEL_VERSION(2, 6, 13)?
> > 
> > That part is a workaround only for the old 2.6 kernels which cause
> > Oops when NULL is passed to device pointer.  So, it should be
> > irrelevant.
> > 
> 
> OK.  After more closely examining that code, I see that for my
> kernel, this code is used
> 
> #else
> 
> /* for 2.2/2.4 kernels */
> #if defined(CONFIG_PCI) || defined(CONFIG_ISA) || defined(__i386__)
> #define dma_alloc_coherent(dev,size,addr,flags)
> pci_alloc_consistent((struct pci_dev *)(dev),size,addr)
> #define dma_free_coherent(dev,size,ptr,addr)
> pci_free_consistent((struct pci_dev *)(dev),size,ptr,addr)
> #elif CONFIG_SBUS
> #define dma_alloc_coherent(dev,size,addr,flags)
> sbus_alloc_consistent((struct sbus_dev *)(dev),size,addr)
> #define dma_free_coherent(dev,size,ptr,addr)
> sbus_free_consistent((struct sbus_dev *)(dev),size,ptr,addr)
> #else
> #error "Need a bus for dma_alloc_coherent()"
> #endif
> 
> Which means pci_alloc_consistent is called instead of
> __dma_alloc_coherent.

pci_alloc_consistent() is used only on 2.2/2.4 kernels.
All 2.6.x kernels are using dma_alloc_coherent().


> >> Also, could you give me some pointers regarding my previous e-mails
> >> regarding this issue:
> >> 
> >> Takashi Iwai wrote:
> >> > At Mon, 27 Nov 2006 17:01:52 -0500,
> >> > David Cullen wrote:
> >> >>
> >> >> I am trying to get ALSA version 1.0.13 working on an AMCC PowerPC
> >> >> PPC405EP Taihu board with a Sound Blaster Live! 24-bit 7.1 PCI
> >> >> card.  I am using a patched 2.6.13 kernel that comes with the
> >> >> board.  I built the kernel with the sound core built in and I
> >> >> used the cross-compiler tools to build the ALSA driver, library,
> >> >> and utils. When I run "speaker-test", it crashes in the ALSA
> >> >> library.  The problem is that the call to mmap in
> >> >>
> >> >>    alsa-lib-1.0.13/src/pcm/pcm_mmap.c line 367
> >> >>
> >> >> which looks like
> >> >>
> >> >>    ptr = mmap(NULL, size, PROT_READ|PROT_WRITE,
> >> >> MAP_FILE|MAP_SHARED, i->u.mmap.fd, i->u.mmap.offset);
> >> >>
> >> >> returns a pointer that appears to be valid (0x3001E000) but
> >> >> causes a kernel OOPS when accessed.
> >> >>
> >> >> Previous calls to mmap in pcm_hw.c on lines 822 and 854 both
> >> >> succeed, and the pointers returned can be successfully accessed,
> >> >> but they use the status and control offsets as parameters to
> >> >> mmap.
> >> >>
> >> >> I haved traced the problem on the target into the ALSA library
> >> >> using gdb and into the kernel using kgdb and everything looks
> >> >> like it works properly.  If I disable the semaphore acquisition
> >> >> in do_mmap2, I can print the contents of the address in kgdb
> >> >> using
> >> >>
> >> >>    (gdb) print ((char *)vma->vm_start)[0]
> >> >>
> >> >> after the call to vm_link in do_mmap_pgoff.  However, the board
> >> >> locks up after the print command.
> >> >>
> >> >> Anyone have any experience with this type of problem on PowerPC
> >> >> systems?
> >> >
> >> > Possibly a memory coherency problem.  The memory allocated via
> >> > dma_alloc_coherent() isn't simply mmappable.
> >> >
> >> > An essential fix would be to add dma_mmap_coherent() to all
> >> > architectures and use it for ALSA mmap.  I made some patches quite
> >> > ago, but left it rotten for the time being...
> >> >
> >> 
> >> How do I "add dma_mmap_coherent() to all architectures and use it
> >> for ALSA mmap"?
> > 
> > Well, for that, we need to patch the kernel itself and add
> > dma_mmap_coherent() call.  The problem is that the memory returned
> > from dma_alloc_coherent() isn't the address of the really allocated
> > pages in your case.  Since the ALSA mmap mode obtains the page via
> > virt_to_page(), this doesn't work.  Thus, a new function,
> > dma_mmap_coherent() is required to calculate the real page address and
> > do the rest of low-level mmap jobs.
> 
> Where would dma_mmap_coherent be placed?  Which specific file?

It's somewhere in arch/*/* directory.

> Would I replace all calls to mmap with dma_mmap_coherent?  I can
> probably figure out how to implement it if you can give me an
> example for another architecture.  I tried looking at old patches on
> the web, but I had difficulty understanding them.  I think they were
> for the ARM architecture.

Yes, ARM has already it.

> > A simple solution would be simply disable mmap.
> > In pci/ca0106/ca0106_main.c, remove SNDRV_PCM_INFO_MMAP and
> > SNDRV_PCM_INFO_MMAP_VALID from snd_ca0106_playback_hw and
> > snd_ca0106_capture_hw structs.
> > 
> > Also, disable #if defined(CONFIG_PPC) around
> > snd_pcm_mmap_status_*() in core/pcm_native.c.
> > 
> > This will reduce the sound system functionality (e.g. no dmix is
> > available), though.
> 
> At this point, if we can get speaker-test to work, we will be happy.
>  So dmix is not necessary (I believe...).  However, I do not know
> the complete details of the end user's application, so dmix may be
> needed eventually.  If you can give me a few pointers on how to
> implement dma_mmap_coherent and sew it into ALSA, that would really
> help.

When mmap is disabled in the driver, change the default alsa-lib
configuration, too.  Either edit alsa-lib/src/conf/cards/CA0106.conf
or override the default PCM configuration in /etc/asound.conf, such as
	pcm.!default plughw


> > BTW, any chance to try a newer version of kernel?
> > I don't want to debug the issues of old kernels but rather fix the
> > latest kernel...
> 
> Unfortunately, we're stuck with the 2.6.13 kernel.  We are working
> with the AMCC Taihu evaluation board, and the kernel source that
> comes with it has been heavily patched to work with that board.
> Upgrading the patches to work with a newer kernel is outside the
> scope of what we agreed to do.  If you cannot help us as long as we
> use the older kernel, I will pass along the information to my manager.

OK, that's what I was afraid of...


Takashi

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux