aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-10-22 08:51:44 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-24 09:56:44 -0400
commit60852d679575b0d7ce62497938116f92654ae908 (patch)
tree767fe010b1c9e2c96d6c23dd91d652386a1a3ec7 /net/tipc
parent959e1781aa230aecc90e4deb80117fd9a53dede7 (diff)
tipc: let neighbor discoverer tranmsit consumable buffers
The neighbor discovery function currently uses the function tipc_bearer_send() for transmitting packets, assuming that the sent buffers are not consumed by the called function. We want to change this, in order to avoid unnecessary buffer cloning elswhere in the code. This commit introduces a new function tipc_bearer_skb() which consumes the sent buffers, and let the discoverer functions use this new call instead. The discoverer does now itself perform the cloning when that is necessary. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bearer.c18
-rw-r--r--net/tipc/bearer.h3
-rw-r--r--net/tipc/discover.c26
-rw-r--r--net/tipc/link.c3
4 files changed, 38 insertions, 12 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index b39f631fd6d7..11333916279f 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -477,6 +477,24 @@ int tipc_bearer_mtu(struct net *net, u32 bearer_id)
477 return mtu; 477 return mtu;
478} 478}
479 479
480/* tipc_bearer_xmit_skb - sends buffer to destination over bearer
481 */
482void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
483 struct sk_buff *skb,
484 struct tipc_media_addr *dest)
485{
486 struct tipc_net *tn = tipc_net(net);
487 struct tipc_bearer *b;
488
489 rcu_read_lock();
490 b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
491 if (likely(b))
492 b->media->send_msg(net, skb, b, dest);
493 rcu_read_unlock();
494 /* Until we remove cloning in tipc_l2_send_msg(): */
495 kfree_skb(skb);
496}
497
480/* tipc_bearer_xmit() -send buffer to destination over bearer 498/* tipc_bearer_xmit() -send buffer to destination over bearer
481 */ 499 */
482void tipc_bearer_xmit(struct net *net, u32 bearer_id, 500void tipc_bearer_xmit(struct net *net, u32 bearer_id,
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index 2ba8a7e274a5..5a600e1b197f 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -219,6 +219,9 @@ void tipc_bearer_stop(struct net *net);
219void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf, 219void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
220 struct tipc_media_addr *dest); 220 struct tipc_media_addr *dest);
221int tipc_bearer_mtu(struct net *net, u32 bearer_id); 221int tipc_bearer_mtu(struct net *net, u32 bearer_id);
222void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
223 struct sk_buff *skb,
224 struct tipc_media_addr *dest);
222void tipc_bearer_xmit(struct net *net, u32 bearer_id, 225void tipc_bearer_xmit(struct net *net, u32 bearer_id,
223 struct sk_buff_head *xmitq, 226 struct sk_buff_head *xmitq,
224 struct tipc_media_addr *dst); 227 struct tipc_media_addr *dst);
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index 6cd36f93aeb4..afe8c47c4085 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -167,11 +167,10 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb,
167 /* Send response, if necessary */ 167 /* Send response, if necessary */
168 if (respond && (mtyp == DSC_REQ_MSG)) { 168 if (respond && (mtyp == DSC_REQ_MSG)) {
169 rskb = tipc_buf_acquire(MAX_H_SIZE); 169 rskb = tipc_buf_acquire(MAX_H_SIZE);
170 if (rskb) { 170 if (!rskb)
171 tipc_disc_init_msg(net, rskb, DSC_RESP_MSG, bearer); 171 return;
172 tipc_bearer_send(net, bearer->identity, rskb, &maddr); 172 tipc_disc_init_msg(net, rskb, DSC_RESP_MSG, bearer);
173 kfree_skb(rskb); 173 tipc_bearer_xmit_skb(net, bearer->identity, rskb, &maddr);
174 }
175 } 174 }
176} 175}
177 176
@@ -225,6 +224,7 @@ void tipc_disc_remove_dest(struct tipc_link_req *req)
225static void disc_timeout(unsigned long data) 224static void disc_timeout(unsigned long data)
226{ 225{
227 struct tipc_link_req *req = (struct tipc_link_req *)data; 226 struct tipc_link_req *req = (struct tipc_link_req *)data;
227 struct sk_buff *skb;
228 int max_delay; 228 int max_delay;
229 229
230 spin_lock_bh(&req->lock); 230 spin_lock_bh(&req->lock);
@@ -242,9 +242,9 @@ static void disc_timeout(unsigned long data)
242 * hold at fast polling rate if don't have any associated nodes, 242 * hold at fast polling rate if don't have any associated nodes,
243 * otherwise hold at slow polling rate 243 * otherwise hold at slow polling rate
244 */ 244 */
245 tipc_bearer_send(req->net, req->bearer_id, req->buf, &req->dest); 245 skb = skb_clone(req->buf, GFP_ATOMIC);
246 246 if (skb)
247 247 tipc_bearer_xmit_skb(req->net, req->bearer_id, skb, &req->dest);
248 req->timer_intv *= 2; 248 req->timer_intv *= 2;
249 if (req->num_nodes) 249 if (req->num_nodes)
250 max_delay = TIPC_LINK_REQ_SLOW; 250 max_delay = TIPC_LINK_REQ_SLOW;
@@ -271,6 +271,7 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr,
271 struct tipc_media_addr *dest) 271 struct tipc_media_addr *dest)
272{ 272{
273 struct tipc_link_req *req; 273 struct tipc_link_req *req;
274 struct sk_buff *skb;
274 275
275 req = kmalloc(sizeof(*req), GFP_ATOMIC); 276 req = kmalloc(sizeof(*req), GFP_ATOMIC);
276 if (!req) 277 if (!req)
@@ -292,7 +293,9 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr,
292 setup_timer(&req->timer, disc_timeout, (unsigned long)req); 293 setup_timer(&req->timer, disc_timeout, (unsigned long)req);
293 mod_timer(&req->timer, jiffies + req->timer_intv); 294 mod_timer(&req->timer, jiffies + req->timer_intv);
294 b_ptr->link_req = req; 295 b_ptr->link_req = req;
295 tipc_bearer_send(net, req->bearer_id, req->buf, &req->dest); 296 skb = skb_clone(req->buf, GFP_ATOMIC);
297 if (skb)
298 tipc_bearer_xmit_skb(net, req->bearer_id, skb, &req->dest);
296 return 0; 299 return 0;
297} 300}
298 301
@@ -316,6 +319,7 @@ void tipc_disc_delete(struct tipc_link_req *req)
316void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr) 319void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr)
317{ 320{
318 struct tipc_link_req *req = b_ptr->link_req; 321 struct tipc_link_req *req = b_ptr->link_req;
322 struct sk_buff *skb;
319 323
320 spin_lock_bh(&req->lock); 324 spin_lock_bh(&req->lock);
321 tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b_ptr); 325 tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b_ptr);
@@ -325,6 +329,8 @@ void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr)
325 req->num_nodes = 0; 329 req->num_nodes = 0;
326 req->timer_intv = TIPC_LINK_REQ_INIT; 330 req->timer_intv = TIPC_LINK_REQ_INIT;
327 mod_timer(&req->timer, jiffies + req->timer_intv); 331 mod_timer(&req->timer, jiffies + req->timer_intv);
328 tipc_bearer_send(net, req->bearer_id, req->buf, &req->dest); 332 skb = skb_clone(req->buf, GFP_ATOMIC);
333 if (skb)
334 tipc_bearer_xmit_skb(net, req->bearer_id, skb, &req->dest);
329 spin_unlock_bh(&req->lock); 335 spin_unlock_bh(&req->lock);
330} 336}
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 3b98f8e70626..7d3b6e7d852a 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1300,9 +1300,8 @@ void tipc_link_proto_xmit(struct tipc_link *l, u32 msg_typ, int probe_msg,
1300 skb = __skb_dequeue(&xmitq); 1300 skb = __skb_dequeue(&xmitq);
1301 if (!skb) 1301 if (!skb)
1302 return; 1302 return;
1303 tipc_bearer_send(l->owner->net, l->bearer_id, skb, l->media_addr); 1303 tipc_bearer_xmit_skb(l->owner->net, l->bearer_id, skb, l->media_addr);
1304 l->rcv_unacked = 0; 1304 l->rcv_unacked = 0;
1305 kfree_skb(skb);
1306} 1305}
1307 1306
1308static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, 1307static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe,