From: Jason Wang <jasowang@redhat.com>
To: Jiang Wang <jiang.wang@bytedance.com>,
mst@redhat.com, cohuck@redhat.com,
virtio-comment@lists.oasis-open.org
Cc: cong.wang@bytedance.com, duanxiongchun@bytedance.com,
virtualization@lists.linux-foundation.org,
xieyongji@bytedance.com, chaiwen.cc@bytedance.com,
stefanha@redhat.com, asias@redhat.com,
arseny.krasnov@kaspersky.com
Subject: Re: [RFC PATCH v1] vsock: add mergeable rx buffer description
Date: Fri, 11 Jun 2021 14:17:10 +0800 [thread overview]
Message-ID: <8c4e38e4-c13e-4c83-8375-df0e2f144020@redhat.com> (raw)
In-Reply-To: <20210610183935.1000999-1-jiang.wang@bytedance.com>
在 2021/6/11 上午2:39, Jiang Wang 写道:
> Mergeable rx buffer is already supported by virtio-net, and
> it can save memory for big packets. It will also be beneficial
> for the vsock devices, so add it to the spec.
A lot of duplication with the virtio-net mergeable rx buffer description.
I wonder whether we can have a generic feature like VIRTIO_F_MRG_BUFFER
instead.
>
> ---
> V0 -> V1: I send similar patch with vsock dgram before and
> already got some comments. This version fixed those,such as
> use present tense for feature bit etc. Also the feature bit
> value is 3, because we expect to have some other featue bits
> defined soon.
>
> virtio-vsock.tex | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 77 insertions(+), 1 deletion(-)
>
> diff --git a/virtio-vsock.tex b/virtio-vsock.tex
> index da7e641..d529291 100644
> --- a/virtio-vsock.tex
> +++ b/virtio-vsock.tex
> @@ -16,7 +16,9 @@ \subsection{Virtqueues}\label{sec:Device Types / Socket Device / Virtqueues}
>
> \subsection{Feature bits}\label{sec:Device Types / Socket Device / Feature bits}
>
> -There are currently no feature bits defined for this device.
> +\begin{description}
> +\item[VIRTIO_VSOCK_F_MRG_RXBUF (3)] Driver can merge receive buffers.
> +\end{description}
>
> \subsection{Device configuration layout}\label{sec:Device Types / Socket Device / Device configuration layout}
>
> @@ -64,6 +66,8 @@ \subsection{Device Operation}\label{sec:Device Types / Socket Device / Device Op
>
> Packets transmitted or received contain a header before the payload:
>
> +If feature VIRTIO_VSOCK_F_MRG_RXBUF is not negotiated, use the following header.
> +
> \begin{lstlisting}
> struct virtio_vsock_hdr {
> le64 src_cid;
> @@ -79,6 +83,15 @@ \subsection{Device Operation}\label{sec:Device Types / Socket Device / Device Op
> };
> \end{lstlisting}
>
> +If feature VIRTIO_VSOCK_F_MRG_RXBUF is negotiated, use the following header.
> +\begin{lstlisting}
> +struct virtio_vsock_hdr_mrg_rxbuf {
> + struct virtio_vsock_hdr hdr;
> + le16 num_buffers;
> +};
> +\end{lstlisting}
> +
> +
> The upper 32 bits of src_cid and dst_cid are reserved and zeroed.
>
> Most packets simply transfer data but control packets are also used for
> @@ -170,6 +183,23 @@ \subsubsection{Buffer Space Management}\label{sec:Device Types / Socket Device /
> previously receiving a VIRTIO_VSOCK_OP_CREDIT_REQUEST packet. This allows
> communicating updates any time a change in buffer space occurs.
>
> +\drivernormative{\paragraph}{Device Operation: Buffer Space Management}{Device Types / Socket Device / Device Operation / Setting Up Receive Buffers}
> +\begin{itemize}
> +\item If VIRTIO_VSOCK_F_MRG_RXBUF is negotiated, each buffer MUST be at
> +least the size of the struct virtio_vsock_hdr_mgr_rxbuf.
> +\end{itemize}
> +
> +\begin{note}
> +Obviously each buffer can be split across multiple descriptor elements.
> +\end{note}
> +
> +\devicenormative{\paragraph}{Device Operation: Buffer Space Management}{Device Types / Socket Device / Device Operation / Setting Up Receive Buffers}
> +The device MUST set \field{num_buffers} to the number of descriptors used when
> +transmitting the packet.
Interesting, does this mean it works for tx? Virtio-net had:
"The driver MUST set num_buffers to zero."
> +
> +The device MUST use only a single descriptor if VIRTIO_VSOCK_F_MRG_RXBUF
> +is not negotiated.
Though virtio-net using something similar. But I think we need to
clarify, what we really need is "a single buffer" not "a single descriptor".
> +
> \drivernormative{\paragraph}{Device Operation: Buffer Space Management}{Device Types / Socket Device / Device Operation / Buffer Space Management}
> VIRTIO_VSOCK_OP_RW data packets MUST only be transmitted when the peer has
> sufficient free buffer space for the payload.
> @@ -188,6 +218,7 @@ \subsubsection{Receive and Transmit}\label{sec:Device Types / Socket Device / De
> The driver queues outgoing packets on the tx virtqueue and incoming packet
> receive buffers on the rx virtqueue. Packets are of the following form:
>
> +If VIRTIO_VSOCK_F_MRG_RXBUF is not negotiated, use the following.
> \begin{lstlisting}
> struct virtio_vsock_packet {
> struct virtio_vsock_hdr hdr;
> @@ -195,9 +226,41 @@ \subsubsection{Receive and Transmit}\label{sec:Device Types / Socket Device / De
> };
> \end{lstlisting}
>
> +Otherwise, use the following form:
> +\begin{lstlisting}
> +struct virtio_vsock_packet_mrg_rxbuf {
> + struct virtio_vsock_hdr_mrg_rxbuf hdr;
> + u8 data[];
> +};
> +\end{lstlisting}
> +
> Virtqueue buffers for outgoing packets are read-only. Virtqueue buffers for
> incoming packets are write-only.
>
> +When transmitting packets to the device, \field{num_buffers} is not used.
> +
> +\begin{enumerate}
> +\item \field{num_buffers} indicates how many descriptors
Similarly, I think what we want here is "buffers" instead of "descriptors".
Thanks
> + this packet is spread over (including this one).
> + This is valid only if VIRTIO_VSOCK_F_MRG_RXBUF is negotiated.
> + This allows receipt of large packets without having to allocate large
> + buffers: a packet that does not fit in a single buffer can flow
> + over to the next buffer, and so on. In this case, there will be
> + at least \field{num_buffers} used buffers in the virtqueue, and the device
> + chains them together to form a single packet in a way similar to
> + how it would store it in a single buffer spread over multiple
> + descriptors.
> + The other buffers will not begin with a struct virtio_vsock_hdr.
> +
> + If VIRTIO_VSOCK_F_MRG_RXBUF is not negotiated, then only one
> + descriptor is used.
> +
> +\item If
> + \field{num_buffers} is one, then the entire packet will be
> + contained within this buffer, immediately following the struct
> + virtio_vsock_hdr.
> +\end{enumerate}
> +
> \drivernormative{\paragraph}{Device Operation: Receive and Transmit}{Device Types / Socket Device / Device Operation / Receive and Transmit}
>
> The \field{guest_cid} configuration field MUST be used as the source CID when
> @@ -213,6 +276,19 @@ \subsubsection{Receive and Transmit}\label{sec:Device Types / Socket Device / De
> A VIRTIO_VSOCK_OP_RST reply MUST be sent if a packet is received with an
> unknown \field{type} value.
>
> +If VIRTIO_VSOCK_F_MRG_RXBUF has been negotiated, the device MUST set
> +\field{num_buffers} to indicate the number of buffers
> +the packet (including the header) is spread over.
> +
> +If a receive packet is spread over multiple buffers, the device
> +MUST use all buffers but the last (i.e. the first $\field{num_buffers} -
> +1$ buffers) completely up to the full length of each buffer
> +supplied by the driver.
> +
> +The device MUST use all buffers used by a single receive
> +packet together, such that at least \field{num_buffers} are
> +observed by driver as used.
> +
> \subsubsection{Stream Sockets}\label{sec:Device Types / Socket Device / Device Operation / Stream Sockets}
>
> Connections are established by sending a VIRTIO_VSOCK_OP_REQUEST packet. If a
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2021-06-11 6:17 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-10 18:39 [RFC PATCH v1] vsock: add mergeable rx buffer description Jiang Wang
2021-06-11 6:17 ` Jason Wang [this message]
2021-06-21 17:12 ` [External] " Jiang Wang .
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=8c4e38e4-c13e-4c83-8375-df0e2f144020@redhat.com \
--to=jasowang@redhat.com \
--cc=arseny.krasnov@kaspersky.com \
--cc=asias@redhat.com \
--cc=chaiwen.cc@bytedance.com \
--cc=cohuck@redhat.com \
--cc=cong.wang@bytedance.com \
--cc=duanxiongchun@bytedance.com \
--cc=jiang.wang@bytedance.com \
--cc=mst@redhat.com \
--cc=stefanha@redhat.com \
--cc=virtio-comment@lists.oasis-open.org \
--cc=virtualization@lists.linux-foundation.org \
--cc=xieyongji@bytedance.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).