diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-09-08 20:53:04 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2009-09-08 20:53:04 -0400 |
commit | 162b96e63e518aa6ff029ce23de12d7f027483bf (patch) | |
tree | 532191d0cef7cf975b70a07b1c69a293d6f552f7 /drivers/dma/ioat/dma_v2.c | |
parent | 0803172778901e24a75ab074798d98c2b7411559 (diff) |
ioat2,3: cacheline align software descriptor allocations
All the necessary fields for handling an ioat2,3 ring entry can fit into
one cacheline. Move ->len prior to ->txd in struct ioat_ring_ent, and
move allocation of these entries to a hw-cache-aligned kmem cache to
reduce the number of cachelines dirtied for descriptor management.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/dma/ioat/dma_v2.c')
-rw-r--r-- | drivers/dma/ioat/dma_v2.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c index 460b77301332..fa3d6db6624c 100644 --- a/drivers/dma/ioat/dma_v2.c +++ b/drivers/dma/ioat/dma_v2.c | |||
@@ -399,11 +399,12 @@ static struct ioat_ring_ent *ioat2_alloc_ring_ent(struct dma_chan *chan, gfp_t f | |||
399 | return NULL; | 399 | return NULL; |
400 | memset(hw, 0, sizeof(*hw)); | 400 | memset(hw, 0, sizeof(*hw)); |
401 | 401 | ||
402 | desc = kzalloc(sizeof(*desc), flags); | 402 | desc = kmem_cache_alloc(ioat2_cache, flags); |
403 | if (!desc) { | 403 | if (!desc) { |
404 | pci_pool_free(dma->dma_pool, hw, phys); | 404 | pci_pool_free(dma->dma_pool, hw, phys); |
405 | return NULL; | 405 | return NULL; |
406 | } | 406 | } |
407 | memset(desc, 0, sizeof(*desc)); | ||
407 | 408 | ||
408 | dma_async_tx_descriptor_init(&desc->txd, chan); | 409 | dma_async_tx_descriptor_init(&desc->txd, chan); |
409 | desc->txd.tx_submit = ioat2_tx_submit_unlock; | 410 | desc->txd.tx_submit = ioat2_tx_submit_unlock; |
@@ -418,7 +419,7 @@ static void ioat2_free_ring_ent(struct ioat_ring_ent *desc, struct dma_chan *cha | |||
418 | 419 | ||
419 | dma = to_ioatdma_device(chan->device); | 420 | dma = to_ioatdma_device(chan->device); |
420 | pci_pool_free(dma->dma_pool, desc->hw, desc->txd.phys); | 421 | pci_pool_free(dma->dma_pool, desc->hw, desc->txd.phys); |
421 | kfree(desc); | 422 | kmem_cache_free(ioat2_cache, desc); |
422 | } | 423 | } |
423 | 424 | ||
424 | static struct ioat_ring_ent **ioat2_alloc_ring(struct dma_chan *c, int order, gfp_t flags) | 425 | static struct ioat_ring_ent **ioat2_alloc_ring(struct dma_chan *c, int order, gfp_t flags) |