| From 6af845e4eb36fb91b322aaf77ec1cab2220a48ad Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Tue, 17 Mar 2009 14:00:06 +0100 |
| Subject: ALSA: Fix vunmap and free order in snd_free_sgbuf_pages() |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 6af845e4eb36fb91b322aaf77ec1cab2220a48ad upstream. |
| |
| In snd_free_sgbuf_pags(), vunmap() is called after releasing the SG |
| pages, and it causes errors on Xen as Xen manages the pages |
| differently. Although no significant errors have been reported on |
| the actual hardware, this order should be fixed other way round, |
| first vunmap() then free pages. |
| |
| Cc: Jan Beulich <jbeulich@novell.com> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/core/sgbuf.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/sound/core/sgbuf.c |
| +++ b/sound/core/sgbuf.c |
| @@ -38,6 +38,10 @@ int snd_free_sgbuf_pages(struct snd_dma_ |
| if (! sgbuf) |
| return -EINVAL; |
| |
| + if (dmab->area) |
| + vunmap(dmab->area); |
| + dmab->area = NULL; |
| + |
| tmpb.dev.type = SNDRV_DMA_TYPE_DEV; |
| tmpb.dev.dev = sgbuf->dev; |
| for (i = 0; i < sgbuf->pages; i++) { |
| @@ -48,9 +52,6 @@ int snd_free_sgbuf_pages(struct snd_dma_ |
| tmpb.bytes = (sgbuf->table[i].addr & ~PAGE_MASK) << PAGE_SHIFT; |
| snd_dma_free_pages(&tmpb); |
| } |
| - if (dmab->area) |
| - vunmap(dmab->area); |
| - dmab->area = NULL; |
| |
| kfree(sgbuf->table); |
| kfree(sgbuf->page_table); |