Vmalloc'ed Buffers

It's possible to use a buffer allocated via vmalloc, for example, for an intermediate buffer. Since the allocated pages are not contiguous, you need to set the page callback to obtain the physical address at every offset.

The implementation of page callback would be like this:

  #include <linux/vmalloc.h>

  /* get the physical page pointer on the given offset */
  static struct page *mychip_page(struct snd_pcm_substream *substream,
                                  unsigned long offset)
          void *pageptr = substream->runtime->dma_area + offset;
          return vmalloc_to_page(pageptr);