static bool virtio_transport_inc_rx_pkt(struct virtio_vsock_sock *vvs,
                                        u32 len)
 {
-       if (vvs->rx_bytes + len > vvs->buf_alloc)
+       if (vvs->buf_used + len > vvs->buf_alloc)
                return false;
 
        vvs->rx_bytes += len;
+       vvs->buf_used += len;
        return true;
 }
 
 static void virtio_transport_dec_rx_pkt(struct virtio_vsock_sock *vvs,
-                                       u32 len)
+                                       u32 bytes_read, u32 bytes_dequeued)
 {
-       vvs->rx_bytes -= len;
-       vvs->fwd_cnt += len;
+       vvs->rx_bytes -= bytes_read;
+       vvs->buf_used -= bytes_dequeued;
+       vvs->fwd_cnt += bytes_dequeued;
 }
 
 void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct sk_buff *skb)
                                   size_t len)
 {
        struct virtio_vsock_sock *vvs = vsk->trans;
-       size_t bytes, total = 0;
        struct sk_buff *skb;
        u32 fwd_cnt_delta;
        bool low_rx_bytes;
        int err = -EFAULT;
+       size_t total = 0;
        u32 free_space;
 
        spin_lock_bh(&vvs->rx_lock);
        }
 
        while (total < len && !skb_queue_empty(&vvs->rx_queue)) {
+               size_t bytes, dequeued = 0;
+
                skb = skb_peek(&vvs->rx_queue);
 
                bytes = min_t(size_t, len - total,
                VIRTIO_VSOCK_SKB_CB(skb)->offset += bytes;
 
                if (skb->len == VIRTIO_VSOCK_SKB_CB(skb)->offset) {
-                       u32 pkt_len = le32_to_cpu(virtio_vsock_hdr(skb)->len);
-
-                       virtio_transport_dec_rx_pkt(vvs, pkt_len);
+                       dequeued = le32_to_cpu(virtio_vsock_hdr(skb)->len);
                        __skb_unlink(skb, &vvs->rx_queue);
                        consume_skb(skb);
                }
+
+               virtio_transport_dec_rx_pkt(vvs, bytes, dequeued);
        }
 
        fwd_cnt_delta = vvs->fwd_cnt - vvs->last_fwd_cnt;
                                msg->msg_flags |= MSG_EOR;
                }
 
-               virtio_transport_dec_rx_pkt(vvs, pkt_len);
+               virtio_transport_dec_rx_pkt(vvs, pkt_len, pkt_len);
                kfree_skb(skb);
        }
 
        struct sock *sk = sk_vsock(vsk);
        struct virtio_vsock_hdr *hdr;
        struct sk_buff *skb;
+       u32 pkt_len;
        int off = 0;
        int err;
 
        if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOM)
                vvs->msg_count--;
 
-       virtio_transport_dec_rx_pkt(vvs, le32_to_cpu(hdr->len));
+       pkt_len = le32_to_cpu(hdr->len);
+       virtio_transport_dec_rx_pkt(vvs, pkt_len, pkt_len);
        spin_unlock_bh(&vvs->rx_lock);
 
        virtio_transport_send_credit_update(vsk);