diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2011-04-22 09:13:54 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2011-05-10 16:53:44 -0400 |
commit | f30e6d3e419bfb5540fa82ba7eca01d578556e6b (patch) | |
tree | e4d6e7bad161a76b09557bf7513358ae1ce8f7fb /sound/firewire | |
parent | 020abf03cd659388f94cb328e1e1df0656e0d7ff (diff) |
firewire: octlet AT payloads can be stack-allocated
We do not need slab allocations anymore in order to satisfy
streaming DMA mapping constraints, thanks to commit da28947e7e36
"firewire: ohci: avoid separate DMA mapping for small AT payloads".
(Besides, the slab-allocated buffers that firewire-core, firewire-sbp2,
and firedtv used to provide for 8-byte write and lock requests were
still not fully portable since they crossed cacheline boundaries or
shared a cacheline with unrelated CPU-accessed data. snd-firewire-lib
got this aspect right by using an extra kmalloc/ kfree just for the
8-byte transaction buffer.)
This change replaces kmalloc'ed lock transaction scratch buffers in
firewire-core, firedtv, and snd-firewire-lib by local stack allocations.
Perhaps the most notable result of the change is simpler locking because
there is no need to serialize usages of preallocated per-device buffers
anymore. Also, allocations and deallocations are simpler.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Acked-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound/firewire')
-rw-r--r-- | sound/firewire/cmp.c | 3 | ||||
-rw-r--r-- | sound/firewire/iso-resources.c | 12 | ||||
-rw-r--r-- | sound/firewire/iso-resources.h | 1 |
3 files changed, 4 insertions, 12 deletions
diff --git a/sound/firewire/cmp.c b/sound/firewire/cmp.c index 4a37f3a6fab9..14cacbc655dd 100644 --- a/sound/firewire/cmp.c +++ b/sound/firewire/cmp.c | |||
@@ -49,10 +49,9 @@ static int pcr_modify(struct cmp_connection *c, | |||
49 | enum bus_reset_handling bus_reset_handling) | 49 | enum bus_reset_handling bus_reset_handling) |
50 | { | 50 | { |
51 | struct fw_device *device = fw_parent_device(c->resources.unit); | 51 | struct fw_device *device = fw_parent_device(c->resources.unit); |
52 | __be32 *buffer = c->resources.buffer; | ||
53 | int generation = c->resources.generation; | 52 | int generation = c->resources.generation; |
54 | int rcode, errors = 0; | 53 | int rcode, errors = 0; |
55 | __be32 old_arg; | 54 | __be32 old_arg, buffer[2]; |
56 | int err; | 55 | int err; |
57 | 56 | ||
58 | buffer[0] = c->last_pcr_value; | 57 | buffer[0] = c->last_pcr_value; |
diff --git a/sound/firewire/iso-resources.c b/sound/firewire/iso-resources.c index 775dbd5f3445..bb9c0c1fb529 100644 --- a/sound/firewire/iso-resources.c +++ b/sound/firewire/iso-resources.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/jiffies.h> | 11 | #include <linux/jiffies.h> |
12 | #include <linux/mutex.h> | 12 | #include <linux/mutex.h> |
13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
14 | #include <linux/slab.h> | ||
15 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
16 | #include "iso-resources.h" | 15 | #include "iso-resources.h" |
17 | 16 | ||
@@ -25,10 +24,6 @@ | |||
25 | */ | 24 | */ |
26 | int fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit) | 25 | int fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit) |
27 | { | 26 | { |
28 | r->buffer = kmalloc(2 * 4, GFP_KERNEL); | ||
29 | if (!r->buffer) | ||
30 | return -ENOMEM; | ||
31 | |||
32 | r->channels_mask = ~0uLL; | 27 | r->channels_mask = ~0uLL; |
33 | r->unit = fw_unit_get(unit); | 28 | r->unit = fw_unit_get(unit); |
34 | mutex_init(&r->mutex); | 29 | mutex_init(&r->mutex); |
@@ -44,7 +39,6 @@ int fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit) | |||
44 | void fw_iso_resources_destroy(struct fw_iso_resources *r) | 39 | void fw_iso_resources_destroy(struct fw_iso_resources *r) |
45 | { | 40 | { |
46 | WARN_ON(r->allocated); | 41 | WARN_ON(r->allocated); |
47 | kfree(r->buffer); | ||
48 | mutex_destroy(&r->mutex); | 42 | mutex_destroy(&r->mutex); |
49 | fw_unit_put(r->unit); | 43 | fw_unit_put(r->unit); |
50 | } | 44 | } |
@@ -131,7 +125,7 @@ retry_after_bus_reset: | |||
131 | 125 | ||
132 | bandwidth = r->bandwidth + r->bandwidth_overhead; | 126 | bandwidth = r->bandwidth + r->bandwidth_overhead; |
133 | fw_iso_resource_manage(card, r->generation, r->channels_mask, | 127 | fw_iso_resource_manage(card, r->generation, r->channels_mask, |
134 | &channel, &bandwidth, true, r->buffer); | 128 | &channel, &bandwidth, true); |
135 | if (channel == -EAGAIN) { | 129 | if (channel == -EAGAIN) { |
136 | mutex_unlock(&r->mutex); | 130 | mutex_unlock(&r->mutex); |
137 | goto retry_after_bus_reset; | 131 | goto retry_after_bus_reset; |
@@ -184,7 +178,7 @@ int fw_iso_resources_update(struct fw_iso_resources *r) | |||
184 | bandwidth = r->bandwidth + r->bandwidth_overhead; | 178 | bandwidth = r->bandwidth + r->bandwidth_overhead; |
185 | 179 | ||
186 | fw_iso_resource_manage(card, r->generation, 1uLL << r->channel, | 180 | fw_iso_resource_manage(card, r->generation, 1uLL << r->channel, |
187 | &channel, &bandwidth, true, r->buffer); | 181 | &channel, &bandwidth, true); |
188 | /* | 182 | /* |
189 | * When another bus reset happens, pretend that the allocation | 183 | * When another bus reset happens, pretend that the allocation |
190 | * succeeded; we will try again for the new generation later. | 184 | * succeeded; we will try again for the new generation later. |
@@ -220,7 +214,7 @@ void fw_iso_resources_free(struct fw_iso_resources *r) | |||
220 | if (r->allocated) { | 214 | if (r->allocated) { |
221 | bandwidth = r->bandwidth + r->bandwidth_overhead; | 215 | bandwidth = r->bandwidth + r->bandwidth_overhead; |
222 | fw_iso_resource_manage(card, r->generation, 1uLL << r->channel, | 216 | fw_iso_resource_manage(card, r->generation, 1uLL << r->channel, |
223 | &channel, &bandwidth, false, r->buffer); | 217 | &channel, &bandwidth, false); |
224 | if (channel < 0) | 218 | if (channel < 0) |
225 | dev_err(&r->unit->device, | 219 | dev_err(&r->unit->device, |
226 | "isochronous resource deallocation failed\n"); | 220 | "isochronous resource deallocation failed\n"); |
diff --git a/sound/firewire/iso-resources.h b/sound/firewire/iso-resources.h index 3f0730e4d841..5a9af7c61657 100644 --- a/sound/firewire/iso-resources.h +++ b/sound/firewire/iso-resources.h | |||
@@ -24,7 +24,6 @@ struct fw_iso_resources { | |||
24 | unsigned int bandwidth_overhead; | 24 | unsigned int bandwidth_overhead; |
25 | int generation; /* in which allocation is valid */ | 25 | int generation; /* in which allocation is valid */ |
26 | bool allocated; | 26 | bool allocated; |
27 | __be32 *buffer; | ||
28 | }; | 27 | }; |
29 | 28 | ||
30 | int fw_iso_resources_init(struct fw_iso_resources *r, | 29 | int fw_iso_resources_init(struct fw_iso_resources *r, |