ALSA: firewire-lib: allocate DMA buffer separately
Clemens Ladisch [Tue, 15 Mar 2011 06:55:50 +0000 (07:55 +0100)]
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 <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

sound/firewire/cmp.c
sound/firewire/iso-resources.c
sound/firewire/iso-resources.h

index c992dab..4a37f3a 100644 (file)
@@ -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;
index 6f2b5f8..775dbd5 100644 (file)
@@ -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"
 
  * 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;
 }
 
 /**
@@ -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);
 }
index 9feb9f8..3f0730e 100644 (file)
@@ -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,