vsock/virtio: reduce credit update messages
In order to reduce the number of credit update messages, we send them only when the space available seen by the transmitter is less than VIRTIO_VSOCK_MAX_PKT_BUF_SIZE. Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
473c7391ce
commit
b89d882dc9
|
@ -41,6 +41,7 @@ struct virtio_vsock_sock {
|
||||||
|
|
||||||
/* Protected by rx_lock */
|
/* Protected by rx_lock */
|
||||||
u32 fwd_cnt;
|
u32 fwd_cnt;
|
||||||
|
u32 last_fwd_cnt;
|
||||||
u32 rx_bytes;
|
u32 rx_bytes;
|
||||||
struct list_head rx_queue;
|
struct list_head rx_queue;
|
||||||
};
|
};
|
||||||
|
|
|
@ -211,6 +211,7 @@ static void virtio_transport_dec_rx_pkt(struct virtio_vsock_sock *vvs,
|
||||||
void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt)
|
void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt)
|
||||||
{
|
{
|
||||||
spin_lock_bh(&vvs->tx_lock);
|
spin_lock_bh(&vvs->tx_lock);
|
||||||
|
vvs->last_fwd_cnt = vvs->fwd_cnt;
|
||||||
pkt->hdr.fwd_cnt = cpu_to_le32(vvs->fwd_cnt);
|
pkt->hdr.fwd_cnt = cpu_to_le32(vvs->fwd_cnt);
|
||||||
pkt->hdr.buf_alloc = cpu_to_le32(vvs->buf_alloc);
|
pkt->hdr.buf_alloc = cpu_to_le32(vvs->buf_alloc);
|
||||||
spin_unlock_bh(&vvs->tx_lock);
|
spin_unlock_bh(&vvs->tx_lock);
|
||||||
|
@ -261,6 +262,7 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk,
|
||||||
struct virtio_vsock_sock *vvs = vsk->trans;
|
struct virtio_vsock_sock *vvs = vsk->trans;
|
||||||
struct virtio_vsock_pkt *pkt;
|
struct virtio_vsock_pkt *pkt;
|
||||||
size_t bytes, total = 0;
|
size_t bytes, total = 0;
|
||||||
|
u32 free_space;
|
||||||
int err = -EFAULT;
|
int err = -EFAULT;
|
||||||
|
|
||||||
spin_lock_bh(&vvs->rx_lock);
|
spin_lock_bh(&vvs->rx_lock);
|
||||||
|
@ -291,11 +293,19 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk,
|
||||||
virtio_transport_free_pkt(pkt);
|
virtio_transport_free_pkt(pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free_space = vvs->buf_alloc - (vvs->fwd_cnt - vvs->last_fwd_cnt);
|
||||||
|
|
||||||
spin_unlock_bh(&vvs->rx_lock);
|
spin_unlock_bh(&vvs->rx_lock);
|
||||||
|
|
||||||
/* Send a credit pkt to peer */
|
/* We send a credit update only when the space available seen
|
||||||
virtio_transport_send_credit_update(vsk, VIRTIO_VSOCK_TYPE_STREAM,
|
* by the transmitter is less than VIRTIO_VSOCK_MAX_PKT_BUF_SIZE
|
||||||
NULL);
|
*/
|
||||||
|
if (free_space < VIRTIO_VSOCK_MAX_PKT_BUF_SIZE) {
|
||||||
|
virtio_transport_send_credit_update(vsk,
|
||||||
|
VIRTIO_VSOCK_TYPE_STREAM,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue