Improve fairness in virtio transports

This BZ 2009935 highlighted a fairness issue in the Linux kernel when virtio-vsock and vhost-vsock are used.

The driver/device is only unfair between directly managed sockets (sockets that communicate with the same VM). There is no interference with sockets of other VMs and therefore managed by other drivers/devices.

Currently in both transports there is a single worker sending packets to the other peer and a single list where sockets enqueue packets to send.

If a socket queues a lot of small packets, it may delay other sockets a lot. The credit mechanism does not prevent this problem.

One solution might be to have a list of ready packets for each socket and a single list of ready sockets that the worker scrolls through, sending a maximum number of packets before moving on to the next ready socket. Unfortunately an application could create a lot of sockets to get around this mechanism, so it's worth taking a closer look at how TCP handles this problem. Maybe using skbuff also in vsock and reusing the same code.

Edited by Stefano Garzarella