diff options
author | Ying Xue <ying.xue@windriver.com> | 2014-12-02 15:00:23 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-08 20:39:55 -0500 |
commit | 1b61e70ad13e1c907f143c3b0a1694df640639c0 (patch) | |
tree | f36b4e8e5a25e8c02fea68cfe5bf54d097cc788d /net | |
parent | 60c04aecd8a72a84869308bdf2289a7aabb9a88c (diff) |
tipc: remove size variable from publ_list struct
The size variable is introduced in publ_list struct to help us exactly
calculate SKB buffer sizes needed by publications when all publications
in name table are delivered in bulk in named_distribute(). But if
publication SKB buffer size is assumed to MTU, the size variable in
publ_list struct can be completely eliminated at the cost of wasting
a bit memory space for last SKB.
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Tero Aho <tero.aho@coriant.com>
Reviewed-by: Erik Hugne <erik.hugne@ericsson.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Tested-by: Erik Hugne <erik.hugne@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/tipc/name_distr.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index 56248db7527..628cd85b647 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c @@ -41,26 +41,21 @@ /** * struct publ_list - list of publications made by this node * @list: circular list of publications - * @list_size: number of entries in list */ struct publ_list { struct list_head list; - u32 size; }; static struct publ_list publ_zone = { .list = LIST_HEAD_INIT(publ_zone.list), - .size = 0, }; static struct publ_list publ_cluster = { .list = LIST_HEAD_INIT(publ_cluster.list), - .size = 0, }; static struct publ_list publ_node = { .list = LIST_HEAD_INIT(publ_node.list), - .size = 0, }; static struct publ_list *publ_lists[] = { @@ -147,7 +142,6 @@ struct sk_buff *tipc_named_publish(struct publication *publ) struct distr_item *item; list_add_tail(&publ->local_list, &publ_lists[publ->scope]->list); - publ_lists[publ->scope]->size++; if (publ->scope == TIPC_NODE_SCOPE) return NULL; @@ -172,7 +166,6 @@ struct sk_buff *tipc_named_withdraw(struct publication *publ) struct distr_item *item; list_del(&publ->local_list); - publ_lists[publ->scope]->size--; if (publ->scope == TIPC_NODE_SCOPE) return NULL; @@ -200,16 +193,12 @@ static void named_distribute(struct sk_buff_head *list, u32 dnode, struct publication *publ; struct sk_buff *skb = NULL; struct distr_item *item = NULL; - uint dsz = pls->size * ITEM_SIZE; uint msg_dsz = (tipc_node_get_mtu(dnode, 0) / ITEM_SIZE) * ITEM_SIZE; - uint rem = dsz; - uint msg_rem = 0; + uint msg_rem = msg_dsz; list_for_each_entry(publ, &pls->list, local_list) { /* Prepare next buffer: */ if (!skb) { - msg_rem = min_t(uint, rem, msg_dsz); - rem -= msg_rem; skb = named_prepare_buf(PUBLICATION, msg_rem, dnode); if (!skb) { pr_warn("Bulk publication failure\n"); @@ -227,8 +216,14 @@ static void named_distribute(struct sk_buff_head *list, u32 dnode, if (!msg_rem) { __skb_queue_tail(list, skb); skb = NULL; + msg_rem = msg_dsz; } } + if (skb) { + msg_set_size(buf_msg(skb), INT_H_SIZE + (msg_dsz - msg_rem)); + skb_trim(skb, INT_H_SIZE + (msg_dsz - msg_rem)); + __skb_queue_tail(list, skb); + } } /** |