mptcp_subflow_send_ack(mptcp_subflow_tcp_sock(subflow));
 }
 
-static void mptcp_subflow_cleanup_rbuf(struct sock *ssk)
+static void mptcp_subflow_cleanup_rbuf(struct sock *ssk, int copied)
 {
        bool slow;
 
        slow = lock_sock_fast(ssk);
        if (tcp_can_send_ack(ssk))
-               tcp_cleanup_rbuf(ssk, 1);
+               tcp_cleanup_rbuf(ssk, copied);
        unlock_sock_fast(ssk, slow);
 }
 
                              (ICSK_ACK_PUSHED2 | ICSK_ACK_PUSHED)));
 }
 
-static void mptcp_cleanup_rbuf(struct mptcp_sock *msk)
+static void mptcp_cleanup_rbuf(struct mptcp_sock *msk, int copied)
 {
        int old_space = READ_ONCE(msk->old_wspace);
        struct mptcp_subflow_context *subflow;
        int space =  __mptcp_space(sk);
        bool cleanup, rx_empty;
 
-       cleanup = (space > 0) && (space >= (old_space << 1));
-       rx_empty = !__mptcp_rmem(sk);
+       cleanup = (space > 0) && (space >= (old_space << 1)) && copied;
+       rx_empty = !__mptcp_rmem(sk) && copied;
 
        mptcp_for_each_subflow(msk, subflow) {
                struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
 
                if (cleanup || mptcp_subflow_could_cleanup(ssk, rx_empty))
-                       mptcp_subflow_cleanup_rbuf(ssk);
+                       mptcp_subflow_cleanup_rbuf(ssk, copied);
        }
 }
 
 
                copied += bytes_read;
 
-               /* be sure to advertise window change */
-               mptcp_cleanup_rbuf(msk);
-
                if (skb_queue_empty(&msk->receive_queue) && __mptcp_move_skbs(msk))
                        continue;
 
                }
 
                pr_debug("block timeout %ld\n", timeo);
+               mptcp_cleanup_rbuf(msk, copied);
                err = sk_wait_data(sk, &timeo, NULL);
                if (err < 0) {
                        err = copied ? : err;
                }
        }
 
+       mptcp_cleanup_rbuf(msk, copied);
+
 out_err:
        if (cmsg_flags && copied >= 0) {
                if (cmsg_flags & MPTCP_CMSG_TS)