forked from luck/tmp_suning_uos_patched
net: allow __skb_ext_alloc to sleep
mptcp calls this from the transmit side, from process context. Allow a sleeping allocation instead of unconditional GFP_ATOMIC. Acked-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5c8264435d
commit
4930f4831b
|
@ -4165,7 +4165,7 @@ struct skb_ext {
|
|||
char data[] __aligned(8);
|
||||
};
|
||||
|
||||
struct skb_ext *__skb_ext_alloc(void);
|
||||
struct skb_ext *__skb_ext_alloc(gfp_t flags);
|
||||
void *__skb_ext_set(struct sk_buff *skb, enum skb_ext_id id,
|
||||
struct skb_ext *ext);
|
||||
void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id);
|
||||
|
|
|
@ -6087,13 +6087,15 @@ static void *skb_ext_get_ptr(struct skb_ext *ext, enum skb_ext_id id)
|
|||
/**
|
||||
* __skb_ext_alloc - allocate a new skb extensions storage
|
||||
*
|
||||
* @flags: See kmalloc().
|
||||
*
|
||||
* Returns the newly allocated pointer. The pointer can later attached to a
|
||||
* skb via __skb_ext_set().
|
||||
* Note: caller must handle the skb_ext as an opaque data.
|
||||
*/
|
||||
struct skb_ext *__skb_ext_alloc(void)
|
||||
struct skb_ext *__skb_ext_alloc(gfp_t flags)
|
||||
{
|
||||
struct skb_ext *new = kmem_cache_alloc(skbuff_ext_cache, GFP_ATOMIC);
|
||||
struct skb_ext *new = kmem_cache_alloc(skbuff_ext_cache, flags);
|
||||
|
||||
if (new) {
|
||||
memset(new->offset, 0, sizeof(new->offset));
|
||||
|
@ -6188,7 +6190,7 @@ void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)
|
|||
} else {
|
||||
newoff = SKB_EXT_CHUNKSIZEOF(*new);
|
||||
|
||||
new = __skb_ext_alloc();
|
||||
new = __skb_ext_alloc(GFP_ATOMIC);
|
||||
if (!new)
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -367,8 +367,10 @@ static void mptcp_stop_timer(struct sock *sk)
|
|||
|
||||
static bool mptcp_ext_cache_refill(struct mptcp_sock *msk)
|
||||
{
|
||||
const struct sock *sk = (const struct sock *)msk;
|
||||
|
||||
if (!msk->cached_ext)
|
||||
msk->cached_ext = __skb_ext_alloc();
|
||||
msk->cached_ext = __skb_ext_alloc(sk->sk_allocation);
|
||||
|
||||
return !!msk->cached_ext;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user