diff options
author | Takashi Iwai <tiwai@suse.de> | 2021-08-04 10:41:25 +0300 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2021-08-04 10:53:07 +0300 |
commit | f84ba106a0185b4336f58580bb016ce993962b0f (patch) | |
tree | cf2881e240976458d2e3733eb9c63e82e694468f /sound/core | |
parent | 623c10108338b6b4e2c99de9fbc785f30b526c54 (diff) | |
download | linux-f84ba106a0185b4336f58580bb016ce993962b0f.tar.xz |
ALSA: memalloc: Store snd_dma_buffer.addr for continuous pages, too
In the recent fix commit eda80d7c9c4d ("ALSA: memalloc: Fix regression
with SNDRV_DMA_TYPE_CONTINUOUS"), we replaced the pfn argument of the
remap_page_pfn() call from the uninitialized dmab->addr. It was the
right fix, but it'd be more generic if we actually initialize
dmab->area for SNDRV_DMA_TYPE_CONTINOUS, too. e.g. the field is used
in the common snd_sgbuf_get_addr(), too.
This patch adds the initialization of addr field and does revert of
the previous change to refer to it again in the mmap call.
Link: https://lore.kernel.org/r/20210804074125.8170-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core')
-rw-r--r-- | sound/core/memalloc.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index 084b2600a423..1cea8cb9668f 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -242,8 +242,11 @@ EXPORT_SYMBOL(snd_sgbuf_get_chunk_size); static void *snd_dma_continuous_alloc(struct snd_dma_buffer *dmab, size_t size) { gfp_t gfp = snd_mem_get_gfp_flags(dmab, GFP_KERNEL); + void *p = alloc_pages_exact(size, gfp); - return alloc_pages_exact(size, gfp); + if (p) + dmab->addr = page_to_phys(virt_to_page(p)); + return p; } static void snd_dma_continuous_free(struct snd_dma_buffer *dmab) @@ -255,7 +258,7 @@ static int snd_dma_continuous_mmap(struct snd_dma_buffer *dmab, struct vm_area_struct *area) { return remap_pfn_range(area, area->vm_start, - page_to_pfn(virt_to_page(dmab->area)), + dmab->addr >> PAGE_SHIFT, area->vm_end - area->vm_start, area->vm_page_prot); } |