new_wnd_end = new_snd_una + tcp_sk(ssk)->snd_wnd;
 
-       if (after64(new_wnd_end, msk->wnd_end)) {
+       if (after64(new_wnd_end, msk->wnd_end))
                msk->wnd_end = new_wnd_end;
-               __mptcp_wnd_updated(sk, ssk);
-       }
+
+       /* this assumes mptcp_incoming_options() is invoked after tcp_ack() */
+       if (after64(msk->wnd_end, READ_ONCE(msk->snd_nxt)) &&
+           sk_stream_memory_free(ssk))
+               __mptcp_check_push(sk, ssk);
 
        if (after64(new_snd_una, old_snd_una)) {
                msk->snd_una = new_snd_una;
                 * helpers are cheap.
                 */
                mptcp_data_lock(subflow->conn);
-               if (mptcp_send_head(subflow->conn))
-                       __mptcp_wnd_updated(subflow->conn, sk);
+               if (sk_stream_memory_free(sk))
+                       __mptcp_check_push(subflow->conn, sk);
                __mptcp_data_acked(subflow->conn);
                mptcp_data_unlock(subflow->conn);
                return;
 
                mptcp_schedule_work(sk);
 }
 
-void __mptcp_wnd_updated(struct sock *sk, struct sock *ssk)
+void __mptcp_check_push(struct sock *sk, struct sock *ssk)
 {
        if (!mptcp_send_head(sk))
                return;
 
 void mptcp_data_ready(struct sock *sk, struct sock *ssk);
 bool mptcp_finish_join(struct sock *sk);
 bool mptcp_schedule_work(struct sock *sk);
-void __mptcp_wnd_updated(struct sock *sk, struct sock *ssk);
+void __mptcp_check_push(struct sock *sk, struct sock *ssk);
 void __mptcp_data_acked(struct sock *sk);
 void mptcp_subflow_eof(struct sock *sk);
 bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
 
 run_test 10 10 1 50 "balanced bwidth with unbalanced delay"
 
 # we still need some additional infrastructure to pass the following test-cases
-# run_test 30 10 0 0 "unbalanced bwidth"
-# run_test 30 10 1 50 "unbalanced bwidth with unbalanced delay"
-# run_test 30 10 50 1 "unbalanced bwidth with opposed, unbalanced delay"
+run_test 30 10 0 0 "unbalanced bwidth"
+run_test 30 10 1 50 "unbalanced bwidth with unbalanced delay"
+run_test 30 10 50 1 "unbalanced bwidth with opposed, unbalanced delay"
 exit $ret