aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2011-05-31 13:38:02 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-09-17 22:55:10 -0400
commit9aa88c2a509e11e6efc466c88b386e0e01bef731 (patch)
treef7c42275e74229143ac9badcb78da5f3037fe118 /net/tipc/link.c
parent1c553bb52eb4c58333a843c0a5888d2329909f62 (diff)
tipc: Enhance sending of bulk name table messages
Modifies the initial transfer of name table entries to a new neighboring node so that the messages are enqueued as a unit, rather than individually. The revised algorithm now locates the link carrying the message only once, and eliminates unnecessary checks for link congestion, message fragmentation, and message bundling that are not required when sending these messages. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r--net/tipc/link.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 74126db4597..2ea3f22b798 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -986,6 +986,51 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector)
986} 986}
987 987
988/* 988/*
989 * tipc_link_send_names - send name table entries to new neighbor
990 *
991 * Send routine for bulk delivery of name table messages when contact
992 * with a new neighbor occurs. No link congestion checking is performed
993 * because name table messages *must* be delivered. The messages must be
994 * small enough not to require fragmentation.
995 * Called without any locks held.
996 */
997
998void tipc_link_send_names(struct list_head *message_list, u32 dest)
999{
1000 struct tipc_node *n_ptr;
1001 struct link *l_ptr;
1002 struct sk_buff *buf;
1003 struct sk_buff *temp_buf;
1004
1005 if (list_empty(message_list))
1006 return;
1007
1008 read_lock_bh(&tipc_net_lock);
1009 n_ptr = tipc_node_find(dest);
1010 if (n_ptr) {
1011 tipc_node_lock(n_ptr);
1012 l_ptr = n_ptr->active_links[0];
1013 if (l_ptr) {
1014 /* convert circular list to linear list */
1015 ((struct sk_buff *)message_list->prev)->next = NULL;
1016 link_add_chain_to_outqueue(l_ptr,
1017 (struct sk_buff *)message_list->next, 0);
1018 tipc_link_push_queue(l_ptr);
1019 INIT_LIST_HEAD(message_list);
1020 }
1021 tipc_node_unlock(n_ptr);
1022 }
1023 read_unlock_bh(&tipc_net_lock);
1024
1025 /* discard the messages if they couldn't be sent */
1026
1027 list_for_each_safe(buf, temp_buf, ((struct sk_buff *)message_list)) {
1028 list_del((struct list_head *)buf);
1029 buf_discard(buf);
1030 }
1031}
1032
1033/*
989 * link_send_buf_fast: Entry for data messages where the 1034 * link_send_buf_fast: Entry for data messages where the
990 * destination link is known and the header is complete, 1035 * destination link is known and the header is complete,
991 * inclusive total message length. Very time critical. 1036 * inclusive total message length. Very time critical.