diff options
author | Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com> | 2017-01-13 09:46:25 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-01-16 13:31:53 -0500 |
commit | 57d5f64d83ab5b5a5118b1597386dd76eaf4340d (patch) | |
tree | d0dbe9d1335b2835b42d78ebe2525a9b3f97c768 /net/tipc | |
parent | 34c55cf2fc75f8bf6ba87df321038c064cf2d426 (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.c | 4 | ||||
-rw-r--r-- | net/tipc/link.c | 2 | ||||
-rw-r--r-- | net/tipc/msg.c | 16 | ||||
-rw-r--r-- | net/tipc/msg.h | 2 | ||||
-rw-r--r-- | net/tipc/name_distr.c | 2 |
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 | */ |
61 | struct sk_buff *tipc_buf_acquire(u32 size) | 61 | struct 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 | ||
823 | struct sk_buff *tipc_buf_acquire(u32 size); | 823 | struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp); |
824 | bool tipc_msg_validate(struct sk_buff *skb); | 824 | bool tipc_msg_validate(struct sk_buff *skb); |
825 | bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); | 825 | bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); |
826 | void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type, | 826 | void 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) { |