firewire: reorder struct fw_card for better cache efficiency
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Sat, 29 Nov 2008 18:00:56 +0000 (19:00 +0100)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 4 Jan 2009 22:50:38 +0000 (23:50 +0100)
topology_map is by far the largest member in struct fw_card.  Move it to
the very end of the struct so that card pointer dereferences have better
chances to hit the CPU cache.

This requires to increase the topology_map backing store to the size
specified in IEEE 1394, i.e. 256 rather than 255 quadlets.  Otherwise
the topology_map response handler may access invalid memory.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/fw-transaction.h

index 5a57bb8..c9ab12a 100644 (file)
@@ -237,13 +237,6 @@ struct fw_card {
        int link_speed;
        int config_rom_generation;
 
-       /*
-        * We need to store up to 4 self ID for a maximum of 63
-        * devices plus 3 words for the topology map header.
-        */
-       u32 topology_map[252 + 3];
-       u32 broadcast_channel;
-
        spinlock_t lock; /* Take this lock when handling the lists in
                          * this struct. */
        struct fw_node *local_node;
@@ -261,6 +254,9 @@ struct fw_card {
        struct delayed_work work;
        int bm_retries;
        int bm_generation;
+
+       u32 broadcast_channel;
+       u32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
 };
 
 static inline struct fw_card *fw_card_get(struct fw_card *card)