diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2011-05-02 03:33:56 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2011-05-10 16:53:45 -0400 |
commit | 13882a82ee1646336c3996c93b4a560a55d2a419 (patch) | |
tree | 8a144d874a0ac46273a7e2f2dd344458d7eb4bfa /drivers/firewire/net.c | |
parent | f30e6d3e419bfb5540fa82ba7eca01d578556e6b (diff) |
firewire: optimize iso queueing by setting wake only after the last packet
When queueing iso packets, the run time is dominated by the two
MMIO accesses that set the DMA context's wake bit. Because most
drivers submit packets in batches, we can save much time by
removing all but the last wakeup.
The internal kernel API is changed to require a call to
fw_iso_context_queue_flush() after a batch of queued packets.
The user space API does not change, so one call to
FW_CDEV_IOC_QUEUE_ISO must specify multiple packets to take
advantage of this optimization.
In my measurements, this patch reduces the time needed to queue
fifty skip packets from userspace to one sixth on a 2.5 GHz CPU,
or to one third at 800 MHz.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/net.c')
-rw-r--r-- | drivers/firewire/net.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index 3f04dd3681cf..b9762d07198d 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c | |||
@@ -881,7 +881,9 @@ static void fwnet_receive_broadcast(struct fw_iso_context *context, | |||
881 | 881 | ||
882 | spin_unlock_irqrestore(&dev->lock, flags); | 882 | spin_unlock_irqrestore(&dev->lock, flags); |
883 | 883 | ||
884 | if (retval < 0) | 884 | if (retval >= 0) |
885 | fw_iso_context_queue_flush(dev->broadcast_rcv_context); | ||
886 | else | ||
885 | fw_error("requeue failed\n"); | 887 | fw_error("requeue failed\n"); |
886 | } | 888 | } |
887 | 889 | ||