On Sun, Mar 07, 2021 at 09:02:01PM +0300, Arseny Krasnov wrote:
This adds transport callback and it's logic for SEQPACKET dequeue.
Callback fetches RW packets from rx queue of socket until whole record
is copied(if user's buffer is full, user is not woken up). This is done
to not stall sender, because if we wake up user and it leaves syscall,
nobody will send credit update for rest of record, and sender will wait
for next enter of read syscall at receiver's side. So if user buffer is
full, we just send credit update and drop data. If during copy SEQ_BEGIN
was found(and not all data was copied), copying is restarted by reset
user's iov iterator(previous unfinished data is dropped).

Signed-off-by: Arseny Krasnov <arseny.kras...@kaspersky.com>
---
include/linux/virtio_vsock.h            |  13 +++
include/uapi/linux/virtio_vsock.h       |  16 ++++
net/vmw_vsock/virtio_transport_common.c | 116 ++++++++++++++++++++++++
3 files changed, 145 insertions(+)

diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
index dc636b727179..466a5832d2f5 100644
--- a/include/linux/virtio_vsock.h
+++ b/include/linux/virtio_vsock.h
@@ -18,6 +18,12 @@ enum {
        VSOCK_VQ_MAX    = 3,
};

+struct virtio_vsock_seqpack_state {
+       u32 user_read_seq_len;
+       u32 user_read_copied;
+       u32 curr_rx_msg_id;
+};
+
/* Per-socket state (accessed via vsk->trans) */
struct virtio_vsock_sock {
        struct vsock_sock *vsk;
@@ -36,6 +42,8 @@ struct virtio_vsock_sock {
        u32 rx_bytes;
        u32 buf_alloc;
        struct list_head rx_queue;
+
+       struct virtio_vsock_seqpack_state seqpacket_state;

Following 'virtio_vsock_seq_hdr', maybe we can shorten in:

        struct virtio_vsock_seq_state seq_state;

The rest LGTM.

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to