ieee1394: save RAM by using a single tlabel for broadcast transactions
authorBen Collins <bcollins@ubuntu.com>
Mon, 12 Jun 2006 22:12:49 +0000 (18:12 -0400)
committerBen Collins <bcollins@ubuntu.com>
Mon, 12 Jun 2006 22:12:49 +0000 (18:12 -0400)
Since broadcast transactions are already complete when the request has
been sent, the same transaction label can be reused all over again, see
IEEE 1394 7.3.2.5 and 6.2.4.3.  Therefore we can reduce the footprint
of struct hpsb_host by the size of one struct hpsb_tlabel_pool.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Ben Collins <bcollins@ubuntu.com>
drivers/ieee1394/hosts.h
drivers/ieee1394/ieee1394_transactions.c

index d1a47607cb8909d0190d4de0736c52f6d0000e9d..9ddc6628e71024381162f7db6135eb7a0a9e48c0 100644 (file)
@@ -30,14 +30,14 @@ struct hpsb_host {
 
        unsigned char iso_listen_count[64];
 
-       int node_count;     /* number of identified nodes on this bus */
-       int selfid_count;   /* total number of SelfIDs received */
-       int nodes_active;   /* number of nodes with active link layer */
-       u8 speed[63];       /* speed between each node and local node */
+       int node_count;      /* number of identified nodes on this bus */
+       int selfid_count;    /* total number of SelfIDs received */
+       int nodes_active;    /* number of nodes with active link layer */
+       u8 speed[ALL_NODES]; /* speed between each node and local node */
 
-       nodeid_t node_id;   /* node ID of this host */
-       nodeid_t irm_id;    /* ID of this bus' isochronous resource manager */
-       nodeid_t busmgr_id; /* ID of this bus' bus manager */
+       nodeid_t node_id;    /* node ID of this host */
+       nodeid_t irm_id;     /* ID of this bus' isochronous resource manager */
+       nodeid_t busmgr_id;  /* ID of this bus' bus manager */
 
        /* this nodes state */
        unsigned in_bus_reset:1;
@@ -56,7 +56,7 @@ struct hpsb_host {
        struct csr_control csr;
 
        /* Per node tlabel pool allocation */
-       struct hpsb_tlabel_pool tpool[64];
+       struct hpsb_tlabel_pool tpool[ALL_NODES];
 
        struct hpsb_host_driver *driver;
 
index 3fe2f6c4a2539611bd24c0fece9bd69b6f6e5ce1..a114b91d606db640ce5ffa46acc13abef2ebe6a2 100644 (file)
@@ -136,8 +136,11 @@ int hpsb_get_tlabel(struct hpsb_packet *packet)
 {
        unsigned long flags;
        struct hpsb_tlabel_pool *tp;
+       int n = NODEID_TO_NODE(packet->node_id);
 
-       tp = &packet->host->tpool[packet->node_id & NODE_MASK];
+       if (unlikely(n == ALL_NODES))
+               return 0;
+       tp = &packet->host->tpool[n];
 
        if (irqs_disabled() || in_atomic()) {
                if (down_trylock(&tp->count))
@@ -175,8 +178,11 @@ void hpsb_free_tlabel(struct hpsb_packet *packet)
 {
        unsigned long flags;
        struct hpsb_tlabel_pool *tp;
+       int n = NODEID_TO_NODE(packet->node_id);
 
-       tp = &packet->host->tpool[packet->node_id & NODE_MASK];
+       if (unlikely(n == ALL_NODES))
+               return;
+       tp = &packet->host->tpool[n];
 
        BUG_ON(packet->tlabel > 63 || packet->tlabel < 0);