}
 EXPORT_SYMBOL_GPL(sk_msg_is_readable);
 
-static struct sk_msg *sk_psock_create_ingress_msg(struct sock *sk,
-                                                 struct sk_buff *skb)
+static struct sk_msg *alloc_sk_msg(void)
 {
        struct sk_msg *msg;
 
-       if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
+       msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_KERNEL);
+       if (unlikely(!msg))
                return NULL;
+       sg_init_marker(msg->sg.data, NR_MSG_FRAG_IDS);
+       return msg;
+}
 
-       if (!sk_rmem_schedule(sk, skb, skb->truesize))
+static struct sk_msg *sk_psock_create_ingress_msg(struct sock *sk,
+                                                 struct sk_buff *skb)
+{
+       if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
                return NULL;
 
-       msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_KERNEL);
-       if (unlikely(!msg))
+       if (!sk_rmem_schedule(sk, skb, skb->truesize))
                return NULL;
 
-       sk_msg_init(msg);
-       return msg;
+       return alloc_sk_msg();
 }
 
 static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,
 static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb,
                                     u32 off, u32 len)
 {
-       struct sk_msg *msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_ATOMIC);
+       struct sk_msg *msg = alloc_sk_msg();
        struct sock *sk = psock->sk;
        int err;
 
        if (unlikely(!msg))
                return -EAGAIN;
-       sk_msg_init(msg);
        skb_set_owner_r(skb, sk);
        err = sk_psock_skb_ingress_enqueue(skb, off, len, psock, sk, msg);
        if (err < 0)