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 da28947e7e
"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>
This commit is contained in:
@@ -11,7 +11,6 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include "iso-resources.h"
|
||||
|
||||
@@ -25,10 +24,6 @@
|
||||
*/
|
||||
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);
|
||||
@@ -44,7 +39,6 @@ int 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);
|
||||
}
|
||||
@@ -131,7 +125,7 @@ retry_after_bus_reset:
|
||||
|
||||
bandwidth = r->bandwidth + r->bandwidth_overhead;
|
||||
fw_iso_resource_manage(card, r->generation, r->channels_mask,
|
||||
&channel, &bandwidth, true, r->buffer);
|
||||
&channel, &bandwidth, true);
|
||||
if (channel == -EAGAIN) {
|
||||
mutex_unlock(&r->mutex);
|
||||
goto retry_after_bus_reset;
|
||||
@@ -184,7 +178,7 @@ int fw_iso_resources_update(struct fw_iso_resources *r)
|
||||
bandwidth = r->bandwidth + r->bandwidth_overhead;
|
||||
|
||||
fw_iso_resource_manage(card, r->generation, 1uLL << r->channel,
|
||||
&channel, &bandwidth, true, r->buffer);
|
||||
&channel, &bandwidth, true);
|
||||
/*
|
||||
* When another bus reset happens, pretend that the allocation
|
||||
* succeeded; we will try again for the new generation later.
|
||||
@@ -220,7 +214,7 @@ void fw_iso_resources_free(struct fw_iso_resources *r)
|
||||
if (r->allocated) {
|
||||
bandwidth = r->bandwidth + r->bandwidth_overhead;
|
||||
fw_iso_resource_manage(card, r->generation, 1uLL << r->channel,
|
||||
&channel, &bandwidth, false, r->buffer);
|
||||
&channel, &bandwidth, false);
|
||||
if (channel < 0)
|
||||
dev_err(&r->unit->device,
|
||||
"isochronous resource deallocation failed\n");
|
||||
|
Reference in New Issue
Block a user