[bug report] ALSA: memalloc: Add fallback SG-buffer allocations for x86

Dan Carpenter dan.carpenter at oracle.com
Wed Apr 20 09:44:58 CEST 2022


Hello Takashi Iwai,

The patch 925ca893b4a6: "ALSA: memalloc: Add fallback SG-buffer
allocations for x86" from Apr 13, 2022, leads to the following Smatch
static checker warning:

	sound/core/memalloc.c:732 snd_dma_sg_fallback_alloc()
	error: 'p' came from dma_alloc_coherent() so we can't do virt_to_phys()

sound/core/memalloc.c
    708 static void *snd_dma_sg_fallback_alloc(struct snd_dma_buffer *dmab, size_t size)
    709 {
    710         struct snd_dma_sg_fallback *sgbuf;
    711         struct page **pages;
    712         size_t i, count;
    713         void *p;
    714 
    715         sgbuf = kzalloc(sizeof(*sgbuf), GFP_KERNEL);
    716         if (!sgbuf)
    717                 return NULL;
    718         count = PAGE_ALIGN(size) >> PAGE_SHIFT;
    719         pages = kvcalloc(count, sizeof(*pages), GFP_KERNEL);
    720         if (!pages)
    721                 goto error;
    722         sgbuf->pages = pages;
    723         sgbuf->addrs = kvcalloc(count, sizeof(*sgbuf->addrs), GFP_KERNEL);
    724         if (!sgbuf->addrs)
    725                 goto error;
    726 
    727         for (i = 0; i < count; sgbuf->count++, i++) {
    728                 p = dma_alloc_coherent(dmab->dev.dev, PAGE_SIZE,
    729                                        &sgbuf->addrs[i], DEFAULT_GFP);
    730                 if (!p)
    731                         goto error;
--> 732                 sgbuf->pages[i] = virt_to_page(p);

The warning is a bit useless.  It's complaining about __phys_addr()
and not virt_to_phys().  I don't really understand the rules here, it
might be legal in certain contexts.

    733         }
    734 
    735         if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK)
    736                 set_pages_array_wc(pages, count);
    737         p = vmap(pages, count, VM_MAP, PAGE_KERNEL);
    738         if (!p)
    739                 goto error;
    740         dmab->private_data = sgbuf;
    741         return p;
    742 

regards,
dan carpenter


More information about the Alsa-devel mailing list