diff options
author | Shaun Ruffell <sruffell@digium.com> | 2010-09-23 21:38:52 +0000 |
---|---|---|
committer | Shaun Ruffell <sruffell@digium.com> | 2010-09-23 21:38:52 +0000 |
commit | b1d6ae6dd425d2e81a6043df3f0f300e7f485604 (patch) | |
tree | b2568f1f76e0dd263a3fd6029de7afbf7d7cd753 /drivers/dahdi/wctdm24xxp/base.c | |
parent | cb9b0ee67f9caba93a884b155d81daa83e72df51 (diff) |
wcte12xp, wctdm24xxp: Convert vbb cache from kmem_cache to dma_pool.
The voicebus interface constantly uses the same buffers for moving data
to/from the card. A fixed pool has less overhead in this case than
constantly mapping/unmapping the kmem_cache_alloced buffers.
Saves about ~2.608 us for each run of vb_isr on a 2.40 GHz Xeon test
machine.
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9402 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/wctdm24xxp/base.c')
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index 15cc48e..cb390d0 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -2223,7 +2223,7 @@ static void handle_hx8_transmit(struct voicebus *vb, struct list_head *buffers) list_for_each_entry_safe(vbb, n, buffers, entry) { list_del(&vbb->entry); - kmem_cache_free(voicebus_vbb_cache, vbb); + dma_pool_free(vb->pool, vbb, vbb->dma_addr); } } @@ -4408,6 +4408,7 @@ static int hx8_send_command(struct wctdm *wc, const u8 *command, struct sframe_packet *frame; const int MAX_COMMAND_LENGTH = 264 + 4; unsigned long flags; + dma_addr_t dma_addr; might_sleep(); @@ -4420,11 +4421,12 @@ static int hx8_send_command(struct wctdm *wc, const u8 *command, if (count > MAX_COMMAND_LENGTH) return -EINVAL; - vbb = kmem_cache_alloc(voicebus_vbb_cache, GFP_KERNEL); + vbb = dma_pool_alloc(wc->vb.pool, GFP_KERNEL, &dma_addr); WARN_ON(!vbb); if (!vbb) return -ENOMEM; - + + vbb->dma_addr = dma_addr; memset(vbb->data, 0, SFRAME_SIZE); memcpy(&vbb->data[EFRAME_SIZE + EFRAME_GAP], command, count); |