|
@@ -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);
|