aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-02-05 08:36:36 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-05 19:00:01 -0500
commitc5898636c440da91d58f10beac00f073e68378df (patch)
tree67e7148b03414171b1d2012bd8f27ea63433c3ed /net/tipc/msg.c
parent4134069f3ea6cd96903e426bd3dfb9bb44165357 (diff)
tipc: reduce usage of context info in socket and link
The most common usage of namespace information is when we fetch the own node addess from the net structure. This leads to a lot of passing around of a parameter of type 'struct net *' between functions just to make them able to obtain this address. However, in many cases this is unnecessary. The own node address is readily available as a member of both struct tipc_sock and tipc_link, and can be fetched from there instead. The fact that the vast majority of functions in socket.c and link.c anyway are maintaining a pointer to their respective base structures makes this option even more compelling. In this commit, we introduce the inline functions tsk_own_node() and link_own_node() to make it easy for functions to fetch the node address from those structs instead of having to pass along and dereference the namespace struct. In particular, we make calls to the msg_xx() functions in msg.{h,c} context independent by directly passing them the own node address as parameter when needed. Those functions should be regarded as leaves in the code dependency tree, and it is hence desirable to keep them namspace unaware. Apart from a potential positive effect on cache behavior, these changes make it easier to introduce the changes that will follow later in this series. Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r--net/tipc/msg.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index da67c8d3edc6..940d74197b8c 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -70,25 +70,23 @@ struct sk_buff *tipc_buf_acquire(u32 size)
70 return skb; 70 return skb;
71} 71}
72 72
73void tipc_msg_init(struct net *net, struct tipc_msg *m, u32 user, u32 type, 73void tipc_msg_init(u32 own_node, struct tipc_msg *m, u32 user, u32 type,
74 u32 hsize, u32 destnode) 74 u32 hsize, u32 dnode)
75{ 75{
76 struct tipc_net *tn = net_generic(net, tipc_net_id);
77
78 memset(m, 0, hsize); 76 memset(m, 0, hsize);
79 msg_set_version(m); 77 msg_set_version(m);
80 msg_set_user(m, user); 78 msg_set_user(m, user);
81 msg_set_hdr_sz(m, hsize); 79 msg_set_hdr_sz(m, hsize);
82 msg_set_size(m, hsize); 80 msg_set_size(m, hsize);
83 msg_set_prevnode(m, tn->own_addr); 81 msg_set_prevnode(m, own_node);
84 msg_set_type(m, type); 82 msg_set_type(m, type);
85 if (hsize > SHORT_H_SIZE) { 83 if (hsize > SHORT_H_SIZE) {
86 msg_set_orignode(m, tn->own_addr); 84 msg_set_orignode(m, own_node);
87 msg_set_destnode(m, destnode); 85 msg_set_destnode(m, dnode);
88 } 86 }
89} 87}
90 88
91struct sk_buff *tipc_msg_create(struct net *net, uint user, uint type, 89struct sk_buff *tipc_msg_create(uint user, uint type,
92 uint hdr_sz, uint data_sz, u32 dnode, 90 uint hdr_sz, uint data_sz, u32 dnode,
93 u32 onode, u32 dport, u32 oport, int errcode) 91 u32 onode, u32 dport, u32 oport, int errcode)
94{ 92{
@@ -100,9 +98,8 @@ struct sk_buff *tipc_msg_create(struct net *net, uint user, uint type,
100 return NULL; 98 return NULL;
101 99
102 msg = buf_msg(buf); 100 msg = buf_msg(buf);
103 tipc_msg_init(net, msg, user, type, hdr_sz, dnode); 101 tipc_msg_init(onode, msg, user, type, hdr_sz, dnode);
104 msg_set_size(msg, hdr_sz + data_sz); 102 msg_set_size(msg, hdr_sz + data_sz);
105 msg_set_prevnode(msg, onode);
106 msg_set_origport(msg, oport); 103 msg_set_origport(msg, oport);
107 msg_set_destport(msg, dport); 104 msg_set_destport(msg, dport);
108 msg_set_errcode(msg, errcode); 105 msg_set_errcode(msg, errcode);
@@ -195,7 +192,7 @@ err:
195 * 192 *
196 * Returns message data size or errno: -ENOMEM, -EFAULT 193 * Returns message data size or errno: -ENOMEM, -EFAULT
197 */ 194 */
198int tipc_msg_build(struct net *net, struct tipc_msg *mhdr, struct msghdr *m, 195int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
199 int offset, int dsz, int pktmax, struct sk_buff_head *list) 196 int offset, int dsz, int pktmax, struct sk_buff_head *list)
200{ 197{
201 int mhsz = msg_hdr_sz(mhdr); 198 int mhsz = msg_hdr_sz(mhdr);
@@ -227,8 +224,8 @@ int tipc_msg_build(struct net *net, struct tipc_msg *mhdr, struct msghdr *m,
227 } 224 }
228 225
229 /* Prepare reusable fragment header */ 226 /* Prepare reusable fragment header */
230 tipc_msg_init(net, &pkthdr, MSG_FRAGMENTER, FIRST_FRAGMENT, INT_H_SIZE, 227 tipc_msg_init(msg_prevnode(mhdr), &pkthdr, MSG_FRAGMENTER,
231 msg_destnode(mhdr)); 228 FIRST_FRAGMENT, INT_H_SIZE, msg_destnode(mhdr));
232 msg_set_size(&pkthdr, pktmax); 229 msg_set_size(&pkthdr, pktmax);
233 msg_set_fragm_no(&pkthdr, pktno); 230 msg_set_fragm_no(&pkthdr, pktno);
234 231
@@ -338,7 +335,7 @@ bool tipc_msg_bundle(struct sk_buff_head *list, struct sk_buff *skb, u32 mtu)
338 * Replaces buffer if successful 335 * Replaces buffer if successful
339 * Returns true if success, otherwise false 336 * Returns true if success, otherwise false
340 */ 337 */
341bool tipc_msg_make_bundle(struct net *net, struct sk_buff_head *list, 338bool tipc_msg_make_bundle(struct sk_buff_head *list,
342 struct sk_buff *skb, u32 mtu, u32 dnode) 339 struct sk_buff *skb, u32 mtu, u32 dnode)
343{ 340{
344 struct sk_buff *bskb; 341 struct sk_buff *bskb;
@@ -362,7 +359,8 @@ bool tipc_msg_make_bundle(struct net *net, struct sk_buff_head *list,
362 359
363 skb_trim(bskb, INT_H_SIZE); 360 skb_trim(bskb, INT_H_SIZE);
364 bmsg = buf_msg(bskb); 361 bmsg = buf_msg(bskb);
365 tipc_msg_init(net, bmsg, MSG_BUNDLER, 0, INT_H_SIZE, dnode); 362 tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0,
363 INT_H_SIZE, dnode);
366 msg_set_seqno(bmsg, msg_seqno(msg)); 364 msg_set_seqno(bmsg, msg_seqno(msg));
367 msg_set_ack(bmsg, msg_ack(msg)); 365 msg_set_ack(bmsg, msg_ack(msg));
368 msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); 366 msg_set_bcast_ack(bmsg, msg_bcast_ack(msg));
@@ -379,10 +377,9 @@ bool tipc_msg_make_bundle(struct net *net, struct sk_buff_head *list,
379 * Consumes buffer if failure 377 * Consumes buffer if failure
380 * Returns true if success, otherwise false 378 * Returns true if success, otherwise false
381 */ 379 */
382bool tipc_msg_reverse(struct net *net, struct sk_buff *buf, u32 *dnode, 380bool tipc_msg_reverse(u32 own_addr, struct sk_buff *buf, u32 *dnode,
383 int err) 381 int err)
384{ 382{
385 struct tipc_net *tn = net_generic(net, tipc_net_id);
386 struct tipc_msg *msg = buf_msg(buf); 383 struct tipc_msg *msg = buf_msg(buf);
387 uint imp = msg_importance(msg); 384 uint imp = msg_importance(msg);
388 struct tipc_msg ohdr; 385 struct tipc_msg ohdr;
@@ -402,7 +399,7 @@ bool tipc_msg_reverse(struct net *net, struct sk_buff *buf, u32 *dnode,
402 msg_set_errcode(msg, err); 399 msg_set_errcode(msg, err);
403 msg_set_origport(msg, msg_destport(&ohdr)); 400 msg_set_origport(msg, msg_destport(&ohdr));
404 msg_set_destport(msg, msg_origport(&ohdr)); 401 msg_set_destport(msg, msg_origport(&ohdr));
405 msg_set_prevnode(msg, tn->own_addr); 402 msg_set_prevnode(msg, own_addr);
406 if (!msg_short(msg)) { 403 if (!msg_short(msg)) {
407 msg_set_orignode(msg, msg_destnode(&ohdr)); 404 msg_set_orignode(msg, msg_destnode(&ohdr));
408 msg_set_destnode(msg, msg_orignode(&ohdr)); 405 msg_set_destnode(msg, msg_orignode(&ohdr));