ALSA: Replace snd_malloc_pages() and snd_free_pages() with standard helpers, take#2
snd_malloc_pages() and snd_free_pages() are merely thin wrappers of the standard page allocator / free functions. Even the arguments are compatible with some standard helpers, so there is little merit of keeping these wrappers. This patch replaces the all existing callers of snd_malloc_pages() and snd_free_pages() with the direct calls of the standard helper functions. In this version, we use a recently introduced one, alloc_pages_exact(), which suits better than the old snd_malloc_pages() implementation for our purposes. Then we can avoid the waste of pages by alignment to power-of-two. Since alloc_pages_exact() does split pages, we need no longer __GFP_COMP flag; or better to say, we must not pass __GFP_COMP to alloc_pages_exact(). So the former unconditional addition of __GFP_COMP flag in snd_malloc_pages() is dropped, as well as in most other places. Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Acked-by: Michal Hocko <mhocko@suse.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -959,22 +959,22 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
|
||||
return -ENOMEM;
|
||||
|
||||
size = PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status));
|
||||
runtime->status = snd_malloc_pages(size, GFP_KERNEL);
|
||||
runtime->status = alloc_pages_exact(size, GFP_KERNEL);
|
||||
if (runtime->status == NULL) {
|
||||
kfree(runtime);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset((void*)runtime->status, 0, size);
|
||||
memset(runtime->status, 0, size);
|
||||
|
||||
size = PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control));
|
||||
runtime->control = snd_malloc_pages(size, GFP_KERNEL);
|
||||
runtime->control = alloc_pages_exact(size, GFP_KERNEL);
|
||||
if (runtime->control == NULL) {
|
||||
snd_free_pages((void*)runtime->status,
|
||||
free_pages_exact(runtime->status,
|
||||
PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)));
|
||||
kfree(runtime);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset((void*)runtime->control, 0, size);
|
||||
memset(runtime->control, 0, size);
|
||||
|
||||
init_waitqueue_head(&runtime->sleep);
|
||||
init_waitqueue_head(&runtime->tsleep);
|
||||
@@ -1000,9 +1000,9 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
|
||||
runtime = substream->runtime;
|
||||
if (runtime->private_free != NULL)
|
||||
runtime->private_free(runtime);
|
||||
snd_free_pages((void*)runtime->status,
|
||||
free_pages_exact(runtime->status,
|
||||
PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)));
|
||||
snd_free_pages((void*)runtime->control,
|
||||
free_pages_exact(runtime->control,
|
||||
PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control)));
|
||||
kfree(runtime->hw_constraints.rules);
|
||||
/* Avoid concurrent access to runtime via PCM timer interface */
|
||||
|
||||
Reference in New Issue
Block a user