aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorParthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com>2017-01-13 09:46:25 -0500
committerDavid S. Miller <davem@davemloft.net>2017-01-16 13:31:53 -0500
commit57d5f64d83ab5b5a5118b1597386dd76eaf4340d (patch)
treed0dbe9d1335b2835b42d78ebe2525a9b3f97c768 /net/tipc
parent34c55cf2fc75f8bf6ba87df321038c064cf2d426 (diff)
tipc: allocate user memory with GFP_KERNEL flag
Until now, we allocate memory always with GFP_ATOMIC flag. When the system is under memory pressure and a user tries to send, the send fails due to low memory. However, the user application can wait for free memory if we allocate it using GFP_KERNEL flag. In this commit, we use allocate memory with GFP_KERNEL for all user allocation. Reported-by: Rune Torgersen <runet@innovsys.com> Acked-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/discover.c4
-rw-r--r--net/tipc/link.c2
-rw-r--r--net/tipc/msg.c16
-rw-r--r--net/tipc/msg.h2
-rw-r--r--net/tipc/name_distr.c2
5 files changed, 13 insertions, 13 deletions
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index 6b109a808d4c..02462d67d191 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -169,7 +169,7 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb,
169 169
170 /* Send response, if necessary */ 170 /* Send response, if necessary */
171 if (respond && (mtyp == DSC_REQ_MSG)) { 171 if (respond && (mtyp == DSC_REQ_MSG)) {
172 rskb = tipc_buf_acquire(MAX_H_SIZE); 172 rskb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC);
173 if (!rskb) 173 if (!rskb)
174 return; 174 return;
175 tipc_disc_init_msg(net, rskb, DSC_RESP_MSG, bearer); 175 tipc_disc_init_msg(net, rskb, DSC_RESP_MSG, bearer);
@@ -278,7 +278,7 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b,
278 req = kmalloc(sizeof(*req), GFP_ATOMIC); 278 req = kmalloc(sizeof(*req), GFP_ATOMIC);
279 if (!req) 279 if (!req)
280 return -ENOMEM; 280 return -ENOMEM;
281 req->buf = tipc_buf_acquire(MAX_H_SIZE); 281 req->buf = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC);
282 if (!req->buf) { 282 if (!req->buf) {
283 kfree(req); 283 kfree(req);
284 return -ENOMEM; 284 return -ENOMEM;
diff --git a/net/tipc/link.c b/net/tipc/link.c
index bda89bf9f4ff..4e8647aef01c 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1395,7 +1395,7 @@ tnl:
1395 msg_set_seqno(hdr, seqno++); 1395 msg_set_seqno(hdr, seqno++);
1396 pktlen = msg_size(hdr); 1396 pktlen = msg_size(hdr);
1397 msg_set_size(&tnlhdr, pktlen + INT_H_SIZE); 1397 msg_set_size(&tnlhdr, pktlen + INT_H_SIZE);
1398 tnlskb = tipc_buf_acquire(pktlen + INT_H_SIZE); 1398 tnlskb = tipc_buf_acquire(pktlen + INT_H_SIZE, GFP_ATOMIC);
1399 if (!tnlskb) { 1399 if (!tnlskb) {
1400 pr_warn("%sunable to send packet\n", link_co_err); 1400 pr_warn("%sunable to send packet\n", link_co_err);
1401 return; 1401 return;
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index a22be502f1bd..ab02d0742476 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -58,12 +58,12 @@ static unsigned int align(unsigned int i)
58 * NOTE: Headroom is reserved to allow prepending of a data link header. 58 * NOTE: Headroom is reserved to allow prepending of a data link header.
59 * There may also be unrequested tailroom present at the buffer's end. 59 * There may also be unrequested tailroom present at the buffer's end.
60 */ 60 */
61struct sk_buff *tipc_buf_acquire(u32 size) 61struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp)
62{ 62{
63 struct sk_buff *skb; 63 struct sk_buff *skb;
64 unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; 64 unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u;
65 65
66 skb = alloc_skb_fclone(buf_size, GFP_ATOMIC); 66 skb = alloc_skb_fclone(buf_size, gfp);
67 if (skb) { 67 if (skb) {
68 skb_reserve(skb, BUF_HEADROOM); 68 skb_reserve(skb, BUF_HEADROOM);
69 skb_put(skb, size); 69 skb_put(skb, size);
@@ -95,7 +95,7 @@ struct sk_buff *tipc_msg_create(uint user, uint type,
95 struct tipc_msg *msg; 95 struct tipc_msg *msg;
96 struct sk_buff *buf; 96 struct sk_buff *buf;
97 97
98 buf = tipc_buf_acquire(hdr_sz + data_sz); 98 buf = tipc_buf_acquire(hdr_sz + data_sz, GFP_ATOMIC);
99 if (unlikely(!buf)) 99 if (unlikely(!buf))
100 return NULL; 100 return NULL;
101 101
@@ -261,7 +261,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
261 261
262 /* No fragmentation needed? */ 262 /* No fragmentation needed? */
263 if (likely(msz <= pktmax)) { 263 if (likely(msz <= pktmax)) {
264 skb = tipc_buf_acquire(msz); 264 skb = tipc_buf_acquire(msz, GFP_KERNEL);
265 if (unlikely(!skb)) 265 if (unlikely(!skb))
266 return -ENOMEM; 266 return -ENOMEM;
267 skb_orphan(skb); 267 skb_orphan(skb);
@@ -282,7 +282,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
282 msg_set_importance(&pkthdr, msg_importance(mhdr)); 282 msg_set_importance(&pkthdr, msg_importance(mhdr));
283 283
284 /* Prepare first fragment */ 284 /* Prepare first fragment */
285 skb = tipc_buf_acquire(pktmax); 285 skb = tipc_buf_acquire(pktmax, GFP_KERNEL);
286 if (!skb) 286 if (!skb)
287 return -ENOMEM; 287 return -ENOMEM;
288 skb_orphan(skb); 288 skb_orphan(skb);
@@ -313,7 +313,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,
313 pktsz = drem + INT_H_SIZE; 313 pktsz = drem + INT_H_SIZE;
314 else 314 else
315 pktsz = pktmax; 315 pktsz = pktmax;
316 skb = tipc_buf_acquire(pktsz); 316 skb = tipc_buf_acquire(pktsz, GFP_KERNEL);
317 if (!skb) { 317 if (!skb) {
318 rc = -ENOMEM; 318 rc = -ENOMEM;
319 goto error; 319 goto error;
@@ -448,7 +448,7 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg,
448 if (msz > (max / 2)) 448 if (msz > (max / 2))
449 return false; 449 return false;
450 450
451 _skb = tipc_buf_acquire(max); 451 _skb = tipc_buf_acquire(max, GFP_ATOMIC);
452 if (!_skb) 452 if (!_skb)
453 return false; 453 return false;
454 454
@@ -496,7 +496,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err)
496 496
497 /* Never return SHORT header; expand by replacing buffer if necessary */ 497 /* Never return SHORT header; expand by replacing buffer if necessary */
498 if (msg_short(hdr)) { 498 if (msg_short(hdr)) {
499 *skb = tipc_buf_acquire(BASIC_H_SIZE + dlen); 499 *skb = tipc_buf_acquire(BASIC_H_SIZE + dlen, GFP_ATOMIC);
500 if (!*skb) 500 if (!*skb)
501 goto exit; 501 goto exit;
502 memcpy((*skb)->data + BASIC_H_SIZE, msg_data(hdr), dlen); 502 memcpy((*skb)->data + BASIC_H_SIZE, msg_data(hdr), dlen);
diff --git a/net/tipc/msg.h b/net/tipc/msg.h
index 8d408612ffa4..2c3dc38abf9c 100644
--- a/net/tipc/msg.h
+++ b/net/tipc/msg.h
@@ -820,7 +820,7 @@ static inline bool msg_is_reset(struct tipc_msg *hdr)
820 return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG); 820 return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG);
821} 821}
822 822
823struct sk_buff *tipc_buf_acquire(u32 size); 823struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp);
824bool tipc_msg_validate(struct sk_buff *skb); 824bool tipc_msg_validate(struct sk_buff *skb);
825bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); 825bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
826void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type, 826void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type,
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c
index c1cfd92de17a..23f8899e0f8c 100644
--- a/net/tipc/name_distr.c
+++ b/net/tipc/name_distr.c
@@ -69,7 +69,7 @@ static struct sk_buff *named_prepare_buf(struct net *net, u32 type, u32 size,
69 u32 dest) 69 u32 dest)
70{ 70{
71 struct tipc_net *tn = net_generic(net, tipc_net_id); 71 struct tipc_net *tn = net_generic(net, tipc_net_id);
72 struct sk_buff *buf = tipc_buf_acquire(INT_H_SIZE + size); 72 struct sk_buff *buf = tipc_buf_acquire(INT_H_SIZE + size, GFP_ATOMIC);
73 struct tipc_msg *msg; 73 struct tipc_msg *msg;
74 74
75 if (buf != NULL) { 75 if (buf != NULL) {