int tcp_v4_early_demux(struct sk_buff *skb);
 int tcp_v4_rcv(struct sk_buff *skb);
 
-void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb);
+void tcp_remove_empty_skb(struct sock *sk);
 int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);
 int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size);
 
  * importantly be able to generate EPOLLOUT for Edge Trigger epoll()
  * users.
  */
-void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb)
+void tcp_remove_empty_skb(struct sock *sk)
 {
+       struct sk_buff *skb = tcp_write_queue_tail(sk);
+
        if (skb && TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) {
                tcp_unlink_write_queue(skb, sk);
                if (tcp_write_queue_empty(sk))
        return copied;
 
 do_error:
-       tcp_remove_empty_skb(sk, tcp_write_queue_tail(sk));
+       tcp_remove_empty_skb(sk);
        if (copied)
                goto out;
 out_err:
        return copied + copied_syn;
 
 do_error:
-       skb = tcp_write_queue_tail(sk);
-       tcp_remove_empty_skb(sk, skb);
+       tcp_remove_empty_skb(sk);
 
        if (copied + copied_syn)
                goto out;
 
                u64 snd_una = READ_ONCE(msk->snd_una);
 
                if (snd_una != msk->snd_nxt) {
-                       tcp_remove_empty_skb(ssk, tcp_write_queue_tail(ssk));
+                       tcp_remove_empty_skb(ssk);
                        return 0;
                }
 
 
        copy = min_t(size_t, copy, info->limit - info->sent);
        if (!sk_wmem_schedule(ssk, copy)) {
-               tcp_remove_empty_skb(ssk, tcp_write_queue_tail(ssk));
+               tcp_remove_empty_skb(ssk);
                return -ENOMEM;
        }