Update of /cvsroot/alsa/alsa-kernel/core In directory sc8-pr-cvs1:/tmp/cvs-serv31049/core
Modified Files: memalloc.c pcm_memory.c Log Message: - fixed buffer pre-allocation. - improved proc output. - check the use flag when unmarking the reserved buffer. - clean up and add more comments. Index: memalloc.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/memalloc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- memalloc.c 3 Dec 2003 13:26:53 -0000 1.19 +++ memalloc.c 16 Jan 2004 18:05:52 -0000 1.20 @@ -207,8 +207,9 @@ dmab->addr = 0; return -ENXIO; } - if (dmab->area) - dmab->bytes = size; + if (! dmab->area) + return -ENOMEM; + dmab->bytes = size; return 0; } @@ -342,6 +343,8 @@ down(&list_mutex); mem = mem_list_find(dev, 0); if (mem) { + if (mem->used) + printk(KERN_WARNING "snd-page-alloc: releasing the used block (type=%d, id=0x%x\n", mem->dev.type, mem->dev.id); snd_dma_free_pages(dev, &mem->buffer); if (! dmab || ! dmab->bytes) { /* remove the entry */ @@ -361,7 +364,7 @@ return -ENOMEM; } mem->dev = *dev; - list_add(&mem->list, &mem_list_head); + list_add_tail(&mem->list, &mem_list_head); } /* store the entry */ mem->used = 1; @@ -824,33 +827,40 @@ while ((pci = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci)) != NULL) { struct prealloc_dev *dev; + unsigned int i; if (card >= SNDRV_CARDS) break; for (dev = prealloc_devices; dev->vendor; dev++) { - unsigned int i; - if (dev->vendor != pci->vendor || dev->device != pci->device) - continue; - if (! enable[card++]) - continue; + if (dev->vendor == pci->vendor && dev->device == pci->device) + break; + } + if (! dev->vendor) + continue; + if (! enable[card++]) { + printk(KERN_DEBUG "snd-page-alloc: skipping card %d, device %04x:%04x\n", card, pci->vendor, pci->device); + continue; + } - if (pci_set_consistent_dma_mask(pci, dev->dma_mask) < 0) { - printk(KERN_ERR "snd-page-alloc: cannot set DMA mask %lx for pci %04x:%04x\n", dev->dma_mask, dev->vendor, dev->device); - continue; + if (pci_set_consistent_dma_mask(pci, dev->dma_mask) < 0) { + printk(KERN_ERR "snd-page-alloc: cannot set DMA mask %lx for pci %04x:%04x\n", dev->dma_mask, dev->vendor, dev->device); + continue; + } + for (i = 0; i < dev->buffers; i++) { + struct snd_mem_list *mem; + mem = kmalloc(sizeof(*mem), GFP_KERNEL); + if (! mem) { + printk(KERN_WARNING "snd-page-alloc: can't malloc memlist\n"); + break; } - - for (i = 0; i < dev->buffers; i++) { - struct snd_dma_device dma; - struct snd_dma_buffer buf; - snd_dma_device_pci(&dma, pci, SNDRV_DMA_DEVICE_UNUSED); - memset(&buf, 0, sizeof(buf)); - snd_dma_alloc_pages(&dma, dev->size, &buf); - if (buf.bytes) { - if (snd_dma_set_reserved(&dma, &buf) < 0) { - printk(KERN_WARNING "snd-page-alloc: cannot reserve buffer\n"); - snd_dma_free_pages(&dma, &buf); - } - } else - printk(KERN_WARNING "snd-page-alloc: cannot allocate buffer pages (size = %d)\n", dev->size); + memset(mem, 0, sizeof(*mem)); + snd_dma_device_pci(&mem->dev, pci, SNDRV_DMA_DEVICE_UNUSED); + if (snd_dma_alloc_pages(&mem->dev, dev->size, &mem->buffer) < 0) { + printk(KERN_WARNING "snd-page-alloc: cannot allocate buffer pages (size = %d)\n", dev->size); + kfree(mem); + } else { + down(&list_mutex); + list_add_tail(&mem->list, &mem_list_head); + up(&list_mutex); } } } @@ -894,7 +904,8 @@ case SNDRV_DMA_TYPE_PCI: case SNDRV_DMA_TYPE_PCI_SG: if (mem->dev.dev.pci) { - len += sprintf(page + len, "PCI [%04x:%04x]", + len += sprintf(page + len, "%s [%04x:%04x]", + mem->dev.type == SNDRV_DMA_TYPE_PCI ? "PCI" : "PCI-SG", mem->dev.dev.pci->vendor, mem->dev.dev.pci->device); } Index: pcm_memory.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_memory.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- pcm_memory.c 21 Jul 2003 16:59:06 -0000 1.21 +++ pcm_memory.c 16 Jan 2004 18:05:52 -0000 1.22 @@ -59,14 +59,18 @@ if (dmab->bytes >= size) return 0; /* yes */ /* no, reset the reserved block */ + /* if we can find bigger pages below, this block will be + * automatically removed in snd_dma_set_reserved(). + */ snd_dma_free_reserved(&substream->dma_device); dmab->bytes = 0; } do { - if ((err = snd_dma_alloc_pages(&substream->dma_device, size, dmab)) < 0) - return err; - if (dmab->area) { + if ((err = snd_dma_alloc_pages(&substream->dma_device, size, dmab)) < 0) { + if (err != -ENOMEM) + return err; /* fatal error */ + } else { /* remember this one */ snd_dma_set_reserved(&substream->dma_device, dmab); return 0; @@ -167,12 +171,12 @@ memset(&new_dmab, 0, sizeof(new_dmab)); if (size > 0) { - if (snd_dma_alloc_pages(&substream->dma_device, size, &new_dmab) < 0 || - new_dmab.area == NULL) { + if (snd_dma_alloc_pages(&substream->dma_device, size, &new_dmab) < 0) { buffer->error = -ENOMEM; return; } substream->buffer_bytes_max = size; + snd_dma_free_reserved(&substream->dma_device); } else { substream->buffer_bytes_max = UINT_MAX; } @@ -346,13 +350,12 @@ snd_pcm_lib_free_pages(substream); } if (substream->dma_buffer.area != NULL && substream->dma_buffer.bytes >= size) { - dmab = substream->dma_buffer; + dmab = substream->dma_buffer; /* use the pre-allocated buffer */ } else { - memset(&dmab, 0, sizeof(dmab)); - snd_dma_alloc_pages(&substream->dma_device, size, &dmab); + memset(&dmab, 0, sizeof(dmab)); /* allocate a new buffer */ + if (snd_dma_alloc_pages(&substream->dma_device, size, &dmab) < 0) + return -ENOMEM; } - if (! dmab.area) - return -ENOMEM; runtime->dma_area = dmab.area; runtime->dma_addr = dmab.addr; runtime->dma_private = dmab.private_data; @@ -378,6 +381,7 @@ if (runtime->dma_area == NULL) return 0; if (runtime->dma_area != substream->dma_buffer.area) { + /* it's a newly allocated buffer. release it now. */ struct snd_dma_buffer dmab; memset(&dmab, 0, sizeof(dmab)); dmab.area = runtime->dma_area; ------------------------------------------------------- The SF.Net email is sponsored by EclipseCon 2004 Premiere Conference on Open Tools Development and Integration See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. http://www.eclipsecon.org/osdn _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog