Skip to content

Commit

Permalink
ALSA: firewire-lib: allocate DMA buffer separately
Browse files Browse the repository at this point in the history
For correct cache coherency on some architectures, DMA buffers must be
allocated in a different cache line than data that is concurrently used
by the CPU.

Signed-off-by: Clemens Ladisch <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
cladisch authored and tiwai committed Mar 15, 2011
1 parent be45436 commit 5b2599a
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
5 changes: 4 additions & 1 deletion sound/firewire/cmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,12 @@ int cmp_connection_init(struct cmp_connection *c,
if (ipcr_index >= (impr & IMPR_PLUGS_MASK))
return -EINVAL;

err = fw_iso_resources_init(&c->resources, unit);
if (err < 0)
return err;

c->connected = false;
mutex_init(&c->mutex);
fw_iso_resources_init(&c->resources, unit);
c->last_pcr_value = cpu_to_be32(0x80000000);
c->pcr_index = ipcr_index;
c->max_speed = (impr & IMPR_SPEED_MASK) >> IMPR_SPEED_SHIFT;
Expand Down
10 changes: 9 additions & 1 deletion sound/firewire/iso-resources.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <linux/jiffies.h>
#include <linux/mutex.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include "iso-resources.h"

Expand All @@ -22,12 +23,18 @@
* If the device does not support all channel numbers, change @r->channels_mask
* after calling this function.
*/
void fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit)
int fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit)
{
r->buffer = kmalloc(2 * 4, GFP_KERNEL);
if (!r->buffer)
return -ENOMEM;

r->channels_mask = ~0uLL;
r->unit = fw_unit_get(unit);
mutex_init(&r->mutex);
r->allocated = false;

return 0;
}

/**
Expand All @@ -37,6 +44,7 @@ void fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit)
void fw_iso_resources_destroy(struct fw_iso_resources *r)
{
WARN_ON(r->allocated);
kfree(r->buffer);
mutex_destroy(&r->mutex);
fw_unit_put(r->unit);
}
Expand Down
6 changes: 3 additions & 3 deletions sound/firewire/iso-resources.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ struct fw_iso_resources {
unsigned int bandwidth_overhead;
int generation; /* in which allocation is valid */
bool allocated;
__be32 buffer[2];
__be32 *buffer;
};

void fw_iso_resources_init(struct fw_iso_resources *r,
struct fw_unit *unit);
int fw_iso_resources_init(struct fw_iso_resources *r,
struct fw_unit *unit);
void fw_iso_resources_destroy(struct fw_iso_resources *r);

int fw_iso_resources_allocate(struct fw_iso_resources *r,
Expand Down

0 comments on commit 5b2599a

Please sign in to comment.