All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arseny Krasnov <arseny.krasnov@kaspersky.com>
To: Stefano Garzarella <sgarzare@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	Jorgen Hansen <jhansen@vmware.com>,
	Norbert Slusarek <nslusarek@gmx.net>,
	Andra Paraschiv <andraprs@amazon.com>,
	Colin Ian King <colin.king@canonical.com>,
	Jeff Vander Stoep <jeffv@google.com>,
	Alexander Popov <alex.popov@linux.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"virtualization@lists.linux-foundation.org" 
	<virtualization@lists.linux-foundation.org>,
	"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"stsp2@yandex.ru" <stsp2@yandex.ru>,
	"oxffffaa@gmail.com" <oxffffaa@gmail.com>
Subject: Re: [RFC PATCH v7 14/22] virtio/vsock: rest of SOCK_SEQPACKET support
Date: Thu, 25 Mar 2021 19:03:24 +0300	[thread overview]
Message-ID: <14dacfcf-1385-93d0-b413-611e6b7fca4a@kaspersky.com> (raw)
In-Reply-To: <20210325101841.o7gs7peafxwb7rfd@steredhat>


On 25.03.2021 13:18, Stefano Garzarella wrote:
> On Tue, Mar 23, 2021 at 04:13:29PM +0300, Arseny Krasnov wrote:
>> This adds rest of logic for SEQPACKET:
>> 1) SEQPACKET specific functions which send SEQ_BEGIN/SEQ_END.
>>   Note that both functions may sleep to wait enough space for
>>   SEQPACKET header.
>> 2) SEQ_BEGIN/SEQ_END in TAP packet capture.
>> 3) Send SHUTDOWN on socket close for SEQPACKET type.
>> 4) Set SEQPACKET packet type during send.
>> 5) Set MSG_EOR in flags for SEQPACKET during send.
>> 6) 'seqpacket_allow' flag to virtio transport.
>>
>> Signed-off-by: Arseny Krasnov <arseny.krasnov@kaspersky.com>
>> ---
>> v6 -> v7:
>> In 'virtio_transport_seqpacket_enqueue()', 'next_tx_msg_id' is updated
>> in both cases when message send successfully or error occured.
>>
>> include/linux/virtio_vsock.h            |  7 ++
>> net/vmw_vsock/virtio_transport_common.c | 88 ++++++++++++++++++++++++-
>> 2 files changed, 93 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
>> index 0e3aa395c07c..ab5f56fd7251 100644
>> --- a/include/linux/virtio_vsock.h
>> +++ b/include/linux/virtio_vsock.h
>> @@ -22,6 +22,7 @@ struct virtio_vsock_seq_state {
>> 	u32 user_read_seq_len;
>> 	u32 user_read_copied;
>> 	u32 curr_rx_msg_id;
>> +	u32 next_tx_msg_id;
>> };
>>
>> /* Per-socket state (accessed via vsk->trans) */
>> @@ -76,6 +77,8 @@ struct virtio_transport {
>>
>> 	/* Takes ownership of the packet */
>> 	int (*send_pkt)(struct virtio_vsock_pkt *pkt);
>> +
>> +	bool seqpacket_allow;
>> };
>>
>> ssize_t
>> @@ -89,6 +92,10 @@ virtio_transport_dgram_dequeue(struct vsock_sock *vsk,
>> 			       size_t len, int flags);
>>
>> int
>> +virtio_transport_seqpacket_enqueue(struct vsock_sock *vsk,
>> +				   struct msghdr *msg,
>> +				   size_t len);
>> +int
>> virtio_transport_seqpacket_dequeue(struct vsock_sock *vsk,
>> 				   struct msghdr *msg,
>> 				   int flags,
>> diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
>> index bfe0d7026bf8..01a56c7da8bd 100644
>> --- a/net/vmw_vsock/virtio_transport_common.c
>> +++ b/net/vmw_vsock/virtio_transport_common.c
>> @@ -139,6 +139,8 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque)
>> 		break;
>> 	case VIRTIO_VSOCK_OP_CREDIT_UPDATE:
>> 	case VIRTIO_VSOCK_OP_CREDIT_REQUEST:
>> +	case VIRTIO_VSOCK_OP_SEQ_BEGIN:
>> +	case VIRTIO_VSOCK_OP_SEQ_END:
>> 		hdr->op = cpu_to_le16(AF_VSOCK_OP_CONTROL);
>> 		break;
>> 	default:
>> @@ -187,7 +189,12 @@ static int virtio_transport_send_pkt_info(struct vsock_sock *vsk,
>> 	struct virtio_vsock_pkt *pkt;
>> 	u32 pkt_len = info->pkt_len;
>>
>> -	info->type = VIRTIO_VSOCK_TYPE_STREAM;
>> +	info->type = virtio_transport_get_type(sk_vsock(vsk));
>> +
>> +	if (info->type == VIRTIO_VSOCK_TYPE_SEQPACKET &&
>> +	    info->msg &&
>> +	    info->msg->msg_flags & MSG_EOR)
>> +		info->flags |= VIRTIO_VSOCK_RW_EOR;
>>
>> 	t_ops = virtio_transport_get_ops(vsk);
>> 	if (unlikely(!t_ops))
>> @@ -401,6 +408,43 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk,
>> 	return err;
>> }
>>
>> +static int virtio_transport_seqpacket_send_ctrl(struct vsock_sock *vsk,
>> +						int type,
>> +						size_t len,
>> +						int flags)
>> +{
>> +	struct virtio_vsock_sock *vvs = vsk->trans;
>> +	struct virtio_vsock_pkt_info info = {
>> +		.op = type,
>> +		.vsk = vsk,
>> +		.pkt_len = sizeof(struct virtio_vsock_seq_hdr)
>> +	};
>> +
>> +	struct virtio_vsock_seq_hdr seq_hdr = {
>> +		.msg_id = cpu_to_le32(vvs->seq_state.next_tx_msg_id),
>> +		.msg_len = cpu_to_le32(len)
>> +	};
>> +
>> +	struct kvec seq_hdr_kiov = {
>> +		.iov_base = (void *)&seq_hdr,
>> +		.iov_len = sizeof(struct virtio_vsock_seq_hdr)
>> +	};
>> +
>> +	struct msghdr msg = {0};
>> +
>> +	//XXX: do we need 'vsock_transport_send_notify_data' pointer?
>> +	if (vsock_wait_space(sk_vsock(vsk),
>> +			     sizeof(struct virtio_vsock_seq_hdr),
>> +			     flags, NULL))
>> +		return -1;
>> +
>> +	iov_iter_kvec(&msg.msg_iter, WRITE, &seq_hdr_kiov, 1, sizeof(seq_hdr));
>> +
>> +	info.msg = &msg;
>> +
>> +	return virtio_transport_send_pkt_info(vsk, &info);
>> +}
>> +
>> static inline void virtio_transport_remove_pkt(struct virtio_vsock_pkt *pkt)
>> {
>> 	list_del(&pkt->list);
>> @@ -595,6 +639,46 @@ virtio_transport_seqpacket_dequeue(struct vsock_sock *vsk,
>> }
>> EXPORT_SYMBOL_GPL(virtio_transport_seqpacket_dequeue);
>>
>> +int
>> +virtio_transport_seqpacket_enqueue(struct vsock_sock *vsk,
>> +				   struct msghdr *msg,
>> +				   size_t len)
>> +{
>> +	int written = -1;
>> +
>> +	if (msg->msg_iter.iov_offset == 0) {
>> +		/* Send SEQBEGIN. */
>> +		if (virtio_transport_seqpacket_send_ctrl(vsk,
>> +							 VIRTIO_VSOCK_OP_SEQ_BEGIN,
>> +							 len,
>> +							 msg->msg_flags) < 0)
>> +			goto out;
>> +	}
>> +
>> +	written = virtio_transport_stream_enqueue(vsk, msg, len);
>> +
>> +	if (written < 0)
>> +		goto out;
>> +
>> +	if (msg->msg_iter.count == 0) {
>> +		/* Send SEQEND. */
>> +		virtio_transport_seqpacket_send_ctrl(vsk,
>> +						     VIRTIO_VSOCK_OP_SEQ_END,
>> +						     0,
>> +						     msg->msg_flags);
> What happen if this fail?
>
> In the previous version we returned -1, now we return the bytes 
> transmitted, is that right?
Ack, i'll fix it
>
> The rest LGTM.
>
>> +	}
>> +out:
>> +	/* Update next id on error or message transmission done. */
>> +	if (written < 0 || msg->msg_iter.count == 0) {
>> +		struct virtio_vsock_sock *vvs = vsk->trans;
>> +
>> +		vvs->seq_state.next_tx_msg_id++;
>> +	}
>> +
>> +	return written;
>> +}
>> +EXPORT_SYMBOL_GPL(virtio_transport_seqpacket_enqueue);
>> +
>> int
>> virtio_transport_dgram_dequeue(struct vsock_sock *vsk,
>> 			       struct msghdr *msg,
>> @@ -1014,7 +1098,7 @@ void virtio_transport_release(struct vsock_sock *vsk)
>> 	struct sock *sk = &vsk->sk;
>> 	bool remove_sock = true;
>>
>> -	if (sk->sk_type == SOCK_STREAM)
>> +	if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET)
>> 		remove_sock = virtio_transport_close(vsk);
>>
>> 	list_for_each_entry_safe(pkt, tmp, &vvs->rx_queue, list) {
>> -- 
>> 2.25.1
>>
>

  reply	other threads:[~2021-03-25 16:04 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-23 13:07 [RFC PATCH v7 00/22] virtio/vsock: introduce SOCK_SEQPACKET support Arseny Krasnov
2021-03-23 13:08 ` [RFC PATCH v7 01/22] af_vsock: update functions for connectible socket Arseny Krasnov
2021-03-23 13:09 ` [RFC PATCH v7 02/22] af_vsock: separate wait data loop Arseny Krasnov
2021-03-23 13:09 ` [RFC PATCH v7 03/22] af_vsock: separate receive " Arseny Krasnov
2021-03-25  9:06   ` Stefano Garzarella
2021-03-25  9:06     ` Stefano Garzarella
2021-03-23 13:10 ` [RFC PATCH v7 04/22] af_vsock: implement SEQPACKET receive loop Arseny Krasnov
2021-03-25  9:34   ` Stefano Garzarella
2021-03-25  9:34     ` Stefano Garzarella
2021-03-25 16:01     ` Arseny Krasnov
2021-03-23 13:10 ` [RFC PATCH v7 05/22] af_vsock: separate wait space loop Arseny Krasnov
2021-03-25  9:37   ` Stefano Garzarella
2021-03-25  9:37     ` Stefano Garzarella
2021-03-23 13:10 ` [RFC PATCH v7 06/22] af_vsock: implement send logic for SEQPACKET Arseny Krasnov
2021-03-25  9:42   ` Stefano Garzarella
2021-03-25  9:42     ` Stefano Garzarella
2021-03-23 13:11 ` [RFC PATCH v7 07/22] af_vsock: rest of SEQPACKET support Arseny Krasnov
2021-03-23 13:11 ` [RFC PATCH v7 08/22] af_vsock: update comments for stream sockets Arseny Krasnov
2021-03-23 13:11 ` [RFC PATCH v7 09/22] virtio/vsock: set packet's type in virtio_transport_send_pkt_info() Arseny Krasnov
2021-03-23 13:12 ` [RFC PATCH v7 10/22] virtio/vsock: simplify credit update function API Arseny Krasnov
2021-03-23 13:12 ` [RFC PATCH v7 11/22] virtio/vsock: dequeue callback for SOCK_SEQPACKET Arseny Krasnov
2021-03-25  9:56   ` Stefano Garzarella
2021-03-25  9:56     ` Stefano Garzarella
2021-03-25 16:02     ` Arseny Krasnov
2021-03-23 13:12 ` [RFC PATCH v7 12/22] virtio/vsock: fetch length for SEQPACKET record Arseny Krasnov
2021-03-25 10:08   ` Stefano Garzarella
2021-03-25 10:08     ` Stefano Garzarella
2021-03-25 16:02     ` Arseny Krasnov
2021-03-23 13:13 ` [RFC PATCH v7 13/22] virtio/vsock: add SEQPACKET receive logic Arseny Krasnov
2021-03-25 10:09   ` Stefano Garzarella
2021-03-25 10:09     ` Stefano Garzarella
2021-03-23 13:13 ` [RFC PATCH v7 14/22] virtio/vsock: rest of SOCK_SEQPACKET support Arseny Krasnov
2021-03-25 10:18   ` Stefano Garzarella
2021-03-25 10:18     ` Stefano Garzarella
2021-03-25 16:03     ` Arseny Krasnov [this message]
2021-03-23 13:13 ` [RFC PATCH v7 15/22] virtio/vsock: SEQPACKET support feature bit Arseny Krasnov
2021-03-25 10:26   ` Stefano Garzarella
2021-03-25 10:26     ` Stefano Garzarella
2021-03-25 16:04     ` Arseny Krasnov
2021-03-23 13:14 ` [RFC PATCH v7 16/22] virtio/vsock: setup SEQPACKET ops for transport Arseny Krasnov
2021-03-25 10:39   ` Stefano Garzarella
2021-03-25 10:39     ` Stefano Garzarella
2021-03-25 16:04     ` Arseny Krasnov
2021-03-23 13:14 ` [RFC PATCH v7 17/22] vhost/vsock: " Arseny Krasnov
2021-03-25 10:42   ` Stefano Garzarella
2021-03-25 10:42     ` Stefano Garzarella
2021-03-25 16:04     ` Arseny Krasnov
2021-03-23 13:14 ` [RFC PATCH v7 18/22] vsock/loopback: " Arseny Krasnov
2021-03-25 10:48   ` Stefano Garzarella
2021-03-25 10:48     ` Stefano Garzarella
2021-03-23 13:14 ` [RFC PATCH v7 19/22] vhost/vsock: SEQPACKET feature bit support Arseny Krasnov
2021-03-23 13:15 ` [RFC PATCH v7 20/22] virtio/vsock: " Arseny Krasnov
2021-03-23 13:15 ` [RFC PATCH v7 21/22] vsock_test: add SOCK_SEQPACKET tests Arseny Krasnov
2021-03-23 13:15 ` [RFC PATCH v7 22/22] virtio/vsock: update trace event for SEQPACKET Arseny Krasnov
2021-03-25 10:52 ` [RFC PATCH v7 00/22] virtio/vsock: introduce SOCK_SEQPACKET support Stefano Garzarella
2021-03-25 10:52   ` Stefano Garzarella
2021-03-25 16:05   ` Arseny Krasnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=14dacfcf-1385-93d0-b413-611e6b7fca4a@kaspersky.com \
    --to=arseny.krasnov@kaspersky.com \
    --cc=alex.popov@linux.com \
    --cc=andraprs@amazon.com \
    --cc=colin.king@canonical.com \
    --cc=davem@davemloft.net \
    --cc=jasowang@redhat.com \
    --cc=jeffv@google.com \
    --cc=jhansen@vmware.com \
    --cc=kuba@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=nslusarek@gmx.net \
    --cc=oxffffaa@gmail.com \
    --cc=sgarzare@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=stsp2@yandex.ru \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.