> -----Original Message----- > From: Parthasarathy Bhuvaragan > Sent: Friday, 13 January, 2017 05:14 > To: tipc-discussion@lists.sourceforge.net; Jon Maloy <jon.ma...@ericsson.com>; > Ying Xue <ying....@windriver.com>; ru...@innovsys.com > Subject: [PATCH net v1 1/1] tipc: allocate user memory with GFP_KERNEL flag > > Until now, we
always allocate memory with GFP_ATOMIC flag. > When the system is under memory pressure and a user tries to send, the send may fail due to low memory. However, a 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 allocations in user context. Acked-by: jon > > Reported-by: Rune Torgersen <ru...@innovsys.com> > Signed-off-by: Parthasarathy Bhuvaragan > <parthasarathy.bhuvara...@ericsson.com> > --- > net/tipc/discover.c | 4 ++-- > net/tipc/link.c | 2 +- > net/tipc/msg.c | 16 ++++++++-------- > net/tipc/msg.h | 2 +- > 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, > > /* Send response, if necessary */ > if (respond && (mtyp == DSC_REQ_MSG)) { > - rskb = tipc_buf_acquire(MAX_H_SIZE); > + rskb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); > if (!rskb) > return; > 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, > req = kmalloc(sizeof(*req), GFP_ATOMIC); > if (!req) > return -ENOMEM; > - req->buf = tipc_buf_acquire(MAX_H_SIZE); > + req->buf = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); > if (!req->buf) { > kfree(req); > return -ENOMEM; > diff --git a/net/tipc/link.c b/net/tipc/link.c > index b758ca8b2f79..b0f8646e0631 100644 > --- a/net/tipc/link.c > +++ b/net/tipc/link.c > @@ -1384,7 +1384,7 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct > tipc_link *tnl, > msg_set_seqno(hdr, seqno++); > pktlen = msg_size(hdr); > msg_set_size(&tnlhdr, pktlen + INT_H_SIZE); > - tnlskb = tipc_buf_acquire(pktlen + INT_H_SIZE); > + tnlskb = tipc_buf_acquire(pktlen + INT_H_SIZE, GFP_ATOMIC); > if (!tnlskb) { > pr_warn("%sunable to send packet\n", link_co_err); > 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) > * NOTE: Headroom is reserved to allow prepending of a data link header. > * There may also be unrequested tailroom present at the buffer's end. > */ > -struct sk_buff *tipc_buf_acquire(u32 size) > +struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp) > { > struct sk_buff *skb; > unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; > > - skb = alloc_skb_fclone(buf_size, GFP_ATOMIC); > + skb = alloc_skb_fclone(buf_size, gfp); > if (skb) { > skb_reserve(skb, BUF_HEADROOM); > skb_put(skb, size); > @@ -95,7 +95,7 @@ struct sk_buff *tipc_msg_create(uint user, uint type, > struct tipc_msg *msg; > struct sk_buff *buf; > > - buf = tipc_buf_acquire(hdr_sz + data_sz); > + buf = tipc_buf_acquire(hdr_sz + data_sz, GFP_ATOMIC); > if (unlikely(!buf)) > return NULL; > > @@ -261,7 +261,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr > *m, > > /* No fragmentation needed? */ > if (likely(msz <= pktmax)) { > - skb = tipc_buf_acquire(msz); > + skb = tipc_buf_acquire(msz, GFP_KERNEL); > if (unlikely(!skb)) > return -ENOMEM; > skb_orphan(skb); > @@ -282,7 +282,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr > *m, > msg_set_importance(&pkthdr, msg_importance(mhdr)); > > /* Prepare first fragment */ > - skb = tipc_buf_acquire(pktmax); > + skb = tipc_buf_acquire(pktmax, GFP_KERNEL); > if (!skb) > return -ENOMEM; > skb_orphan(skb); > @@ -313,7 +313,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr > *m, > pktsz = drem + INT_H_SIZE; > else > pktsz = pktmax; > - skb = tipc_buf_acquire(pktsz); > + skb = tipc_buf_acquire(pktsz, GFP_KERNEL); > if (!skb) { > rc = -ENOMEM; > goto error; > @@ -448,7 +448,7 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct > tipc_msg *msg, > if (msz > (max / 2)) > return false; > > - _skb = tipc_buf_acquire(max); > + _skb = tipc_buf_acquire(max, GFP_ATOMIC); > if (!_skb) > return false; > > @@ -496,7 +496,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff > **skb, int err) > > /* Never return SHORT header; expand by replacing buffer if necessary > */ > if (msg_short(hdr)) { > - *skb = tipc_buf_acquire(BASIC_H_SIZE + dlen); > + *skb = tipc_buf_acquire(BASIC_H_SIZE + dlen, GFP_ATOMIC); > if (!*skb) > goto exit; > memcpy((*skb)->data + BASIC_H_SIZE, msg_data(hdr), dlen); > diff --git a/net/tipc/msg.h b/net/tipc/msg.h > index 850ae0e469f5..f07b51e3f6f1 100644 > --- a/net/tipc/msg.h > +++ b/net/tipc/msg.h > @@ -818,7 +818,7 @@ static inline bool msg_is_reset(struct tipc_msg *hdr) > return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == > RESET_MSG); > } > > -struct sk_buff *tipc_buf_acquire(u32 size); > +struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp); > bool tipc_msg_validate(struct sk_buff *skb); > bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); > 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, > u32 dest) > { > struct tipc_net *tn = net_generic(net, tipc_net_id); > - struct sk_buff *buf = tipc_buf_acquire(INT_H_SIZE + size); > + struct sk_buff *buf = tipc_buf_acquire(INT_H_SIZE + size, GFP_ATOMIC); > struct tipc_msg *msg; > > if (buf != NULL) { > -- > 2.1.4 ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion