Re: [PATCH net-next v5 3/6] vhost/vsock: support MSG_EOR bit processing

2021-09-03 Thread Stefano Garzarella

On Fri, Sep 03, 2021 at 03:32:35PM +0300, Arseny Krasnov wrote:

'MSG_EOR' handling has similar logic as 'MSG_EOM' - if bit present
in packet's header, reset it to 0. Then restore it back if packet
processing wasn't completed. Instead of bool variable for each
flag, bit mask variable was added: it has logical OR of 'MSG_EOR'
and 'MSG_EOM' if needed, to restore flags, this variable is ORed
with flags field of packet.

Signed-off-by: Arseny Krasnov 
---
drivers/vhost/vsock.c | 22 +-
1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index feaf650affbe..938aefbc75ec 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -114,7 +114,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
size_t nbytes;
size_t iov_len, payload_len;
int head;
-   bool restore_flag = false;
+   u32 flags_to_restore = 0;

spin_lock_bh(>send_pkt_list_lock);
if (list_empty(>send_pkt_list)) {
@@ -179,15 +179,20 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
 * created dynamically and are initialized with header
 * of current packet(except length). But in case of
 * SOCK_SEQPACKET, we also must clear message delimeter
-* bit(VIRTIO_VSOCK_SEQ_EOM). Otherwise, instead of one
-* packet with delimeter(which marks end of message),
-* there will be sequence of packets with delimeter
-* bit set. After initialized header will be copied to
-* rx buffer, this bit will be restored.
+* bit (VIRTIO_VSOCK_SEQ_EOM) and MSG_EOR bit
+* (VIRTIO_VSOCK_SEQ_EOR) if set. Otherwise,
+* there will be sequence of packets with these
+* bits set. After initialized header will be copied to
+* rx buffer, these required bits will be restored.
 */
if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM) 
{
pkt->hdr.flags &= 
~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
-   restore_flag = true;
+   flags_to_restore |= VIRTIO_VSOCK_SEQ_EOM;
+
+   if (le32_to_cpu(pkt->hdr.flags) & 
VIRTIO_VSOCK_SEQ_EOR) {
+   pkt->hdr.flags &= 
~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
+   flags_to_restore |= 
VIRTIO_VSOCK_SEQ_EOR;
+   }
}
}

@@ -224,8 +229,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
 * to send it with the next available buffer.
 */
if (pkt->off < pkt->len) {
-   if (restore_flag)
-   pkt->hdr.flags |= 
cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
+   pkt->hdr.flags |= cpu_to_le32(flags_to_restore);

			/* We are queueing the same virtio_vsock_pkt to 
			handle

 * the remaining bytes, and we want to deliver it
--
2.25.1



Reviewed-by: Stefano Garzarella 

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


Re: [PATCH net-next v4 3/6] vhost/vsock: support MSG_EOR bit processing

2021-09-03 Thread Stefano Garzarella

On Fri, Sep 03, 2021 at 08:55:39AM +0200, Stefano Garzarella wrote:

On Fri, Sep 03, 2021 at 09:15:38AM +0300, Arseny Krasnov wrote:

'MSG_EOR' handling has similar logic as 'MSG_EOM' - if bit present
in packet's header, reset it to 0. Then restore it back if packet
processing wasn't completed. Instead of bool variable for each
flag, bit mask variable was added: it has logical OR of 'MSG_EOR'
and 'MSG_EOM' if needed, to restore flags, this variable is ORed
with flags field of packet.

Signed-off-by: Arseny Krasnov 
---
drivers/vhost/vsock.c | 22 +-
1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index feaf650affbe..93e8d635e18f 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -114,7 +114,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
size_t nbytes;
size_t iov_len, payload_len;
int head;
-   bool restore_flag = false;
+   u32 flags_to_restore = 0;

spin_lock_bh(>send_pkt_list_lock);
if (list_empty(>send_pkt_list)) {
@@ -179,15 +179,20 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
 * created dynamically and are initialized with header
 * of current packet(except length). But in case of
 * SOCK_SEQPACKET, we also must clear message delimeter
-* bit(VIRTIO_VSOCK_SEQ_EOM). Otherwise, instead of one
-* packet with delimeter(which marks end of message),
-* there will be sequence of packets with delimeter
-* bit set. After initialized header will be copied to
-* rx buffer, this bit will be restored.
+* bit (VIRTIO_VSOCK_SEQ_EOM) and MSG_EOR bit
+* (VIRTIO_VSOCK_SEQ_EOR) if set. Otherwise,
+* there will be sequence of packets with these
+* bits set. After initialized header will be copied to
+* rx buffer, these required bits will be restored.
 */
if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM) 
{
pkt->hdr.flags &= 
~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
-   restore_flag = true;
+   flags_to_restore |= VIRTIO_VSOCK_SEQ_EOM;
+
+   if (le32_to_cpu(pkt->hdr.flags & 
VIRTIO_VSOCK_SEQ_EOR)) {

  ^
Ooops, le32_to_cpu() should close before bitwise and operator.
I missed this, but kernel test robot discovered :-)


+   pkt->hdr.flags &= 
~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
+   flags_to_restore |= 
VIRTIO_VSOCK_SEQ_EOR;
+   }
}
}

@@ -224,8 +229,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
 * to send it with the next available buffer.
 */
if (pkt->off < pkt->len) {
-   if (restore_flag)
-   pkt->hdr.flags |= 
cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
+   pkt->hdr.flags |= cpu_to_le32(flags_to_restore);

/* We are queueing the same virtio_vsock_pkt to handle
 * the remaining bytes, and we want to deliver it
-- 2.25.1



Reviewed-by: Stefano Garzarella 


NACK

Please resend fixing the issue.

Stefano

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


Re: [virtio-comment] Re: [PATCH v5] virtio-vsock: add description for datagram type

2021-09-03 Thread Stefano Garzarella

On Fri, Sep 03, 2021 at 03:57:24AM -0400, Michael S. Tsirkin wrote:

On Fri, Sep 03, 2021 at 09:22:24AM +0200, Stefano Garzarella wrote:

On Thu, Sep 02, 2021 at 05:08:01PM -0700, Jiang Wang . wrote:
> On Thu, Sep 2, 2021 at 7:07 AM Stefan Hajnoczi  wrote:
> > On Thu, Jun 10, 2021 at 06:12:03PM +, Jiang Wang wrote:


[...]


> > >
> > > -There are currently no feature bits defined for this device.
> > > +\begin{description}
> > > +\item[VIRTIO_VSOCK_F_STREAM (0)] Device has support for stream socket 
type.
> > > +\end{description}
> > > +
> > > +\begin{description}
> > > +\item[VIRTIO_VSOCK_F_DGRAM (2)] Device has support for datagram socket 
type.
> >
> > Is this really bit 2 or did you mean bit 1 (value 0x2)?
> >
> I left bit 1 for SEQPACKET feature bit.  That will probably merge
> before this patch.

Yep, SEQPACKET implementation is also merged in the linux kernel using the
feature bit 1 (0x2), bit 0 (0x1) was left free for stream.

>
> > What happens to the virtqueue layout when VIRTIO_VSOCK_F_DGRAM is
> > present and VIRTIO_VSOCK_F_STREAM is absent? The virtqueue section above
> > implies that VIRTIO_VSOCK_F_STREAM is always present.
> >
> yeah, good question. I  think then it means the first two queues will be used
> for dgram?
>
> > > +\end{description}
> > > +
> > > +If no feature bits are defined, assume device only supports stream 
socket type.
> >
> > It's cleaner to define VIRTIO_VSOCK_F_NO_STREAM (0) instead. When the
> > bit is set the stream socket type is not available and the stream_rx/tx
> > virtqueues are absent.
> >
> > This way it's not necessary to define special behavior depending on
> > certain combinations of feature bits.
> >
> Agree. I went back and read old emails again and found I missed the
> negative bit part. So repeating the previous question, if
> VIRTIO_VSOCK_F_NO_STREAM  and VIRTIO_VSOCK_F_DGRAM
> present, then we will only have 3 queues and the first two are for dgram, 
right?
>
> Also, I am wondering what if an implementation only sets
> VIRTIO_VSOCK_F_NO_STREAM bit, but somehow forgot (or for whatever
> reason) to set VIRTIO_VSOCK_F_DGRAM bit? Does that mean there will
> be no virtqueues? The implementation is a mistake? Because it will not
> do anything.
> Do we need to explicitly add a sentence in the spec to say something like
> "Don't set VIRTIO_VSOCK_F_NO_STREAM alone" etc?

Good point.

IIRC we thought to add F_STREAM to allow devices for example that support
only DGRAM, but we said to consider stream supported if no feature was set
for backward compatibility.
With F_NO_STREAM we can do the same, but actually we could have this strange
case. I don't think it's a big problem, in the end it's a configuration
error. Maybe F_NO_STREMA is clearer since the original device spec supports
streams without any feature bit defined.

Stefano


How about that instead of VIRTIO_VSOCK_F_NO_STREAM we do

VIRTIO_VSOCK_F_TYPE /* device supports multiple socket types */

then with VIRTIO_VSOCK_F_TYPE clear we only have stream.



For SEQPACKET it should be okay, since it depends on stream queues, but 
DGRAM will have its own queues, so with F_TYPE it seems to me more 
difficult to handle the case in which a device supports DGRAM but not 
STREAM.



We should also make SEQPACKET depend on this VIRTIO_VSOCK_F_TYPE -
linux guests do not validate that right now but
it's probably not too late to add such a patch to linux
as a bugfix.


Yep, also with F_NO_STREAM we should do a validation, since F_SEQPACKET 
depends on !F_NO_STREAM.


I'll take care of this when we decide what flag to use.

Stefano

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


Re: [PATCH 1/1] virtio-blk: remove unneeded "likely" statements

2021-09-03 Thread Michael S. Tsirkin
On Thu, Sep 02, 2021 at 10:13:04PM +0300, Max Gurtovoy wrote:
> 
> On 9/2/2021 6:00 PM, Stefan Hajnoczi wrote:
> > On Mon, Aug 30, 2021 at 03:01:11PM +0300, Max Gurtovoy wrote:
> > > Usually we use "likely/unlikely" to optimize the fast path. Remove
> > > redundant "likely" statements in the control path to ease on the code.
> > > 
> > > Signed-off-by: Max Gurtovoy 
> > > ---
> > >   drivers/block/virtio_blk.c | 4 ++--
> > >   1 file changed, 2 insertions(+), 2 deletions(-)
> > It would be nice to tweak the commit description before merging this. I
> > had trouble parsing the second sentence. If I understand correctly the
> > purpose of this patch is to make the code simpler and easier to read:
> > 
> >s/ease on the code/simplify the code and make it easier to read/
> 
> I'm ok with this change in commit message.
> 
> MST,
> 
> can you apply this change if you'll pick this commit ?
> 
> -Max.


Just repost with a fixed commit log pls, easier for me.
Thanks!

> > 
> > Reviewed-by: Stefan Hajnoczi 

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


Re: [External] Re: [virtio-comment] [PATCH v5] virtio-vsock: add description for datagram type

2021-09-03 Thread Michael S. Tsirkin
On Tue, Aug 31, 2021 at 06:24:34PM -0700, Jiang Wang . wrote:
> On Tue, Aug 31, 2021 at 6:13 PM Michael S. Tsirkin  wrote:
> >
> > On Thu, Jun 10, 2021 at 06:12:03PM +, Jiang Wang wrote:
> > > Add supports for datagram type for virtio-vsock. Datagram
> > > sockets are connectionless and unreliable. To avoid contention
> > > with stream and other sockets, add two more virtqueues and
> > > a new feature bit to identify if those two new queues exist or not.
> > >
> > > Also add descriptions for resource management of datagram, which
> > > does not use the existing credit update mechanism associated with
> > > stream sockets.
> > >
> > > Signed-off-by: Jiang Wang 
> >
> > Is this going anywhere? Linux with this included was just released but
> > if no one has the cycles to work on the spec then it's not too late to
> > disable the guest code in a stable@ patch.
> >
> 
> Hi Michael,
> 
> I am still working on this (fixing the migration issue), but would
> like to know if there are any more
> comments or not.  I did not notice any commits related to vsock
> dgram merged to Linux kernel, could you show me the commit link?
> 
> Thanks and regards,
> 
> Jiang

My bad I was thinking of seqpacket. I see that description
was not posted as well, so all is well.

> > > ---
> > >
> > > V2: addressed the comments for the previous version.
> > > V3: add description for the mergeable receive buffer.
> > > V4: add a feature bit for stream and reserver a bit for seqpacket.
> > > Fix mrg_rxbuf related sentences.
> > > V5: removed mergeable rx buffer part. It will go to a
> > > separate patch. Fixed comments about tx, rx, feature bit etc.
> > >
> > >  virtio-vsock.tex | 71 
> > > +++-
> > >  1 file changed, 60 insertions(+), 11 deletions(-)
> > >
> > > diff --git a/virtio-vsock.tex b/virtio-vsock.tex
> > > index da7e641..26a62ac 100644
> > > --- a/virtio-vsock.tex
> > > +++ b/virtio-vsock.tex
> > > @@ -9,14 +9,37 @@ \subsection{Device ID}\label{sec:Device Types / Socket 
> > > Device / Device ID}
> > >
> > >  \subsection{Virtqueues}\label{sec:Device Types / Socket Device / 
> > > Virtqueues}
> > >  \begin{description}
> > > -\item[0] rx
> > > -\item[1] tx
> > > +\item[0] stream rx
> > > +\item[1] stream tx
> > > +\item[2] datagram rx
> > > +\item[3] datagram tx
> > > +\item[4] event
> > > +\end{description}
> > > +The virtio socket device uses 5 queues if feature bit 
> > > VIRTIO_VSOCK_F_DRGAM is set. Otherwise, it
> > > +only uses 3 queues, as the following.
> > > +
> > > +\begin{description}
> > > +\item[0] stream rx
> > > +\item[1] stream tx
> > >  \item[2] event
> > >  \end{description}
> > >
> > > +When behavior differs between stream and datagram rx/tx virtqueues
> > > +their full names are used. Common behavior is simply described in
> > > +terms of rx/tx virtqueues and applies to both stream and datagram
> > > +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_STREAM (0)] Device has support for stream socket 
> > > type.
> > > +\end{description}
> > > +
> > > +\begin{description}
> > > +\item[VIRTIO_VSOCK_F_DGRAM (2)] Device has support for datagram socket 
> > > type.
> > > +\end{description}
> > > +
> > > +If no feature bits are defined, assume device only supports stream 
> > > socket type.
> > >
> > >  \subsection{Device configuration layout}\label{sec:Device Types / Socket 
> > > Device / Device configuration layout}
> > >
> > > @@ -107,6 +130,9 @@ \subsection{Device Operation}\label{sec:Device Types 
> > > / Socket Device / Device Op
> > >
> > >  \subsubsection{Virtqueue Flow Control}\label{sec:Device Types / Socket 
> > > Device / Device Operation / Virtqueue Flow Control}
> > >
> > > +Flow control applies to stream sockets; datagram sockets do not have
> > > +flow control.
> > > +
> > >  The tx virtqueue carries packets initiated by applications and replies to
> > >  received packets.  The rx virtqueue carries packets initiated by the 
> > > device and
> > >  replies to previously transmitted packets.
> > > @@ -140,12 +166,15 @@ \subsubsection{Addressing}\label{sec:Device Types / 
> > > Socket Device / Device Opera
> > >  consists of a (cid, port number) tuple. The header fields used for this 
> > > are
> > >  \field{src_cid}, \field{src_port}, \field{dst_cid}, and \field{dst_port}.
> > >
> > > -Currently only stream sockets are supported. \field{type} is 1 for stream
> > > -socket types.
> > > +Currently stream and datagram (dgram) sockets are supported. 
> > > \field{type} is 1 for stream
> > > +socket types. \field{type} is 3 for dgram socket types.
> > >
> > >  Stream sockets provide in-order, guaranteed, connection-oriented delivery
> > >  without message boundaries.
> > >
> > > +Datagram sockets provide unordered, unreliable, connectionless messages
> > > 

Re: [virtio-comment] Re: [PATCH v5] virtio-vsock: add description for datagram type

2021-09-03 Thread Michael S. Tsirkin
On Fri, Sep 03, 2021 at 09:22:24AM +0200, Stefano Garzarella wrote:
> On Thu, Sep 02, 2021 at 05:08:01PM -0700, Jiang Wang . wrote:
> > On Thu, Sep 2, 2021 at 7:07 AM Stefan Hajnoczi  wrote:
> > > 
> > > On Thu, Jun 10, 2021 at 06:12:03PM +, Jiang Wang wrote:
> > > > Add supports for datagram type for virtio-vsock. Datagram
> > > > sockets are connectionless and unreliable. To avoid contention
> > > > with stream and other sockets, add two more virtqueues and
> > > > a new feature bit to identify if those two new queues exist or not.
> > > >
> > > > Also add descriptions for resource management of datagram, which
> > > > does not use the existing credit update mechanism associated with
> > > > stream sockets.
> > > >
> > > > Signed-off-by: Jiang Wang 
> > > > ---
> > > 
> > > Overall this looks good. The tricky thing will be implementing dgram
> > > sockets in a way that minimizes dropped packets and provides some degree
> > > of fairness between senders. Those are implementation issues though and
> > > not visible at the device specification level.
> > > 
> > > > diff --git a/virtio-vsock.tex b/virtio-vsock.tex
> > > > index da7e641..26a62ac 100644
> > > > --- a/virtio-vsock.tex
> > > > +++ b/virtio-vsock.tex
> > > > @@ -9,14 +9,37 @@ \subsection{Device ID}\label{sec:Device Types / 
> > > > Socket Device / Device ID}
> > > >
> > > >  \subsection{Virtqueues}\label{sec:Device Types / Socket Device / 
> > > > Virtqueues}
> > > >  \begin{description}
> > > > -\item[0] rx
> > > > -\item[1] tx
> > > > +\item[0] stream rx
> > > > +\item[1] stream tx
> > > > +\item[2] datagram rx
> > > > +\item[3] datagram tx
> > > > +\item[4] event
> > > > +\end{description}
> > > > +The virtio socket device uses 5 queues if feature bit 
> > > > VIRTIO_VSOCK_F_DRGAM is set. Otherwise, it
> > > > +only uses 3 queues, as the following.
> > > 
> > > s/as the following/as follows:/
> > > 
> > Will do.
> > 
> > > > +
> > > > +\begin{description}
> > > > +\item[0] stream rx
> > > > +\item[1] stream tx
> > > >  \item[2] event
> > > >  \end{description}
> > > >
> > > > +When behavior differs between stream and datagram rx/tx virtqueues
> > > > +their full names are used. Common behavior is simply described in
> > > > +terms of rx/tx virtqueues and applies to both stream and datagram
> > > > +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_STREAM (0)] Device has support for stream socket 
> > > > type.
> > > > +\end{description}
> > > > +
> > > > +\begin{description}
> > > > +\item[VIRTIO_VSOCK_F_DGRAM (2)] Device has support for datagram socket 
> > > > type.
> > > 
> > > Is this really bit 2 or did you mean bit 1 (value 0x2)?
> > > 
> > I left bit 1 for SEQPACKET feature bit.  That will probably merge
> > before this patch.
> 
> Yep, SEQPACKET implementation is also merged in the linux kernel using the
> feature bit 1 (0x2), bit 0 (0x1) was left free for stream.
> 
> > 
> > > What happens to the virtqueue layout when VIRTIO_VSOCK_F_DGRAM is
> > > present and VIRTIO_VSOCK_F_STREAM is absent? The virtqueue section above
> > > implies that VIRTIO_VSOCK_F_STREAM is always present.
> > > 
> > yeah, good question. I  think then it means the first two queues will be 
> > used
> > for dgram?
> > 
> > > > +\end{description}
> > > > +
> > > > +If no feature bits are defined, assume device only supports stream 
> > > > socket type.
> > > 
> > > It's cleaner to define VIRTIO_VSOCK_F_NO_STREAM (0) instead. When the
> > > bit is set the stream socket type is not available and the stream_rx/tx
> > > virtqueues are absent.
> > > 
> > > This way it's not necessary to define special behavior depending on
> > > certain combinations of feature bits.
> > > 
> > Agree. I went back and read old emails again and found I missed the
> > negative bit part. So repeating the previous question, if
> > VIRTIO_VSOCK_F_NO_STREAM  and VIRTIO_VSOCK_F_DGRAM
> > present, then we will only have 3 queues and the first two are for dgram, 
> > right?
> > 
> > Also, I am wondering what if an implementation only sets
> > VIRTIO_VSOCK_F_NO_STREAM bit, but somehow forgot (or for whatever
> > reason) to set VIRTIO_VSOCK_F_DGRAM bit? Does that mean there will
> > be no virtqueues? The implementation is a mistake? Because it will not
> > do anything.
> > Do we need to explicitly add a sentence in the spec to say something like
> > "Don't set VIRTIO_VSOCK_F_NO_STREAM alone" etc?
> 
> Good point.
> 
> IIRC we thought to add F_STREAM to allow devices for example that support
> only DGRAM, but we said to consider stream supported if no feature was set
> for backward compatibility.
> With F_NO_STREAM we can do the same, but actually we could have this strange
> case. I don't think it's a big problem, in the end it's a configuration
> error. Maybe F_NO_STREMA is clearer since 

Re: [virtio-comment] Re: [PATCH v5] virtio-vsock: add description for datagram type

2021-09-03 Thread Stefano Garzarella

On Thu, Sep 02, 2021 at 05:08:01PM -0700, Jiang Wang . wrote:

On Thu, Sep 2, 2021 at 7:07 AM Stefan Hajnoczi  wrote:


On Thu, Jun 10, 2021 at 06:12:03PM +, Jiang Wang wrote:
> Add supports for datagram type for virtio-vsock. Datagram
> sockets are connectionless and unreliable. To avoid contention
> with stream and other sockets, add two more virtqueues and
> a new feature bit to identify if those two new queues exist or not.
>
> Also add descriptions for resource management of datagram, which
> does not use the existing credit update mechanism associated with
> stream sockets.
>
> Signed-off-by: Jiang Wang 
> ---

Overall this looks good. The tricky thing will be implementing dgram
sockets in a way that minimizes dropped packets and provides some degree
of fairness between senders. Those are implementation issues though and
not visible at the device specification level.

> diff --git a/virtio-vsock.tex b/virtio-vsock.tex
> index da7e641..26a62ac 100644
> --- a/virtio-vsock.tex
> +++ b/virtio-vsock.tex
> @@ -9,14 +9,37 @@ \subsection{Device ID}\label{sec:Device Types / Socket 
Device / Device ID}
>
>  \subsection{Virtqueues}\label{sec:Device Types / Socket Device / Virtqueues}
>  \begin{description}
> -\item[0] rx
> -\item[1] tx
> +\item[0] stream rx
> +\item[1] stream tx
> +\item[2] datagram rx
> +\item[3] datagram tx
> +\item[4] event
> +\end{description}
> +The virtio socket device uses 5 queues if feature bit VIRTIO_VSOCK_F_DRGAM 
is set. Otherwise, it
> +only uses 3 queues, as the following.

s/as the following/as follows:/


Will do.


> +
> +\begin{description}
> +\item[0] stream rx
> +\item[1] stream tx
>  \item[2] event
>  \end{description}
>
> +When behavior differs between stream and datagram rx/tx virtqueues
> +their full names are used. Common behavior is simply described in
> +terms of rx/tx virtqueues and applies to both stream and datagram
> +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_STREAM (0)] Device has support for stream socket type.
> +\end{description}
> +
> +\begin{description}
> +\item[VIRTIO_VSOCK_F_DGRAM (2)] Device has support for datagram socket type.

Is this really bit 2 or did you mean bit 1 (value 0x2)?


I left bit 1 for SEQPACKET feature bit.  That will probably merge
before this patch.


Yep, SEQPACKET implementation is also merged in the linux kernel using 
the feature bit 1 (0x2), bit 0 (0x1) was left free for stream.





What happens to the virtqueue layout when VIRTIO_VSOCK_F_DGRAM is
present and VIRTIO_VSOCK_F_STREAM is absent? The virtqueue section above
implies that VIRTIO_VSOCK_F_STREAM is always present.


yeah, good question. I  think then it means the first two queues will be used
for dgram?


> +\end{description}
> +
> +If no feature bits are defined, assume device only supports stream socket 
type.

It's cleaner to define VIRTIO_VSOCK_F_NO_STREAM (0) instead. When the
bit is set the stream socket type is not available and the stream_rx/tx
virtqueues are absent.

This way it's not necessary to define special behavior depending on
certain combinations of feature bits.


Agree. I went back and read old emails again and found I missed the
negative bit part. So repeating the previous question, if
VIRTIO_VSOCK_F_NO_STREAM  and VIRTIO_VSOCK_F_DGRAM
present, then we will only have 3 queues and the first two are for dgram, right?

Also, I am wondering what if an implementation only sets
VIRTIO_VSOCK_F_NO_STREAM bit, but somehow forgot (or for whatever
reason) to set VIRTIO_VSOCK_F_DGRAM bit? Does that mean there will
be no virtqueues? The implementation is a mistake? Because it will not
do anything.
Do we need to explicitly add a sentence in the spec to say something like
"Don't set VIRTIO_VSOCK_F_NO_STREAM alone" etc?


Good point.

IIRC we thought to add F_STREAM to allow devices for example that 
support only DGRAM, but we said to consider stream supported if no 
feature was set for backward compatibility.


With F_NO_STREAM we can do the same, but actually we could have this 
strange case. I don't think it's a big problem, in the end it's a 
configuration error. Maybe F_NO_STREMA is clearer since the original 
device spec supports streams without any feature bit defined.


Stefano

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


Re: [PATCH v4 3/3] virtio-mem: disallow mapping virtio-mem memory via /dev/mem

2021-09-03 Thread Michael S. Tsirkin
On Thu, Sep 02, 2021 at 06:09:19PM +0200, David Hildenbrand wrote:
> We don't want user space to be able to map virtio-mem device memory
> directly (e.g., via /dev/mem) in order to have guarantees that in a sane
> setup we'll never accidentially access unplugged memory within the
> device-managed region of a virtio-mem device, just as required by the
> virtio-spec.
> 
> As soon as the virtio-mem driver is loaded, the device region is visible
> in /proc/iomem via the parent device region. From that point on user space
> is aware of the device region and we want to disallow mapping anything
> inside that region (where we will dynamically (un)plug memory) until
> the driver has been unloaded cleanly and e.g., another driver might take
> over.
> 
> By creating our parent IORESOURCE_SYSTEM_RAM resource with
> IORESOURCE_EXCLUSIVE, we will disallow any /dev/mem access to our
> device region until the driver was unloaded cleanly and removed the
> parent region. This will work even though only some memory blocks are
> actually currently added to Linux and appear as busy in the resource tree.
> 
> So access to the region from user space is only possible
> a) if we don't load the virtio-mem driver.
> b) after unloading the virtio-mem driver cleanly.
> 
> Don't build virtio-mem if access to /dev/mem cannot be restricticted --
> if we have CONFIG_DEVMEM=y but CONFIG_STRICT_DEVMEM is not set.
> 
> Reviewed-by: Dan Williams 
> Signed-off-by: David Hildenbrand 


> ---
>  drivers/virtio/Kconfig  | 1 +
>  drivers/virtio/virtio_mem.c | 4 +++-
>  2 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig
> index ce1b3f6ec325..ff80cd03f1d1 100644
> --- a/drivers/virtio/Kconfig
> +++ b/drivers/virtio/Kconfig
> @@ -101,6 +101,7 @@ config VIRTIO_MEM
>   depends on MEMORY_HOTPLUG_SPARSE
>   depends on MEMORY_HOTREMOVE
>   depends on CONTIG_ALLOC
> + depends on !DEVMEM || STRICT_DEVMEM
>   help
>This driver provides access to virtio-mem paravirtualized memory
>devices, allowing to hotplug and hotunplug memory.

It would be nicer if there was a symbol in the MEMORY_ namespace
we can depend on exported by mm and depending on !DEVMEM ||
STRICT_DEVMEM.

E.g.

config MEMORY_EXCLUSIVE
def_bool y
depends on !DEVMEM || STRICT_DEVMEM

and then in virtio
depends on MEMORY_EXCLUSIVE


the virtio change itself is ok though:

Acked-by: Michael S. Tsirkin 

for merging through -mm.

> diff --git a/drivers/virtio/virtio_mem.c b/drivers/virtio/virtio_mem.c
> index b91bc810a87e..c2d93492cf0f 100644
> --- a/drivers/virtio/virtio_mem.c
> +++ b/drivers/virtio/virtio_mem.c
> @@ -2523,8 +2523,10 @@ static int virtio_mem_create_resource(struct 
> virtio_mem *vm)
>   if (!name)
>   return -ENOMEM;
>  
> + /* Disallow mapping device memory via /dev/mem completely. */
>   vm->parent_resource = __request_mem_region(vm->addr, vm->region_size,
> -name, IORESOURCE_SYSTEM_RAM);
> +name, IORESOURCE_SYSTEM_RAM |
> +IORESOURCE_EXCLUSIVE);
>   if (!vm->parent_resource) {
>   kfree(name);
>   dev_warn(>vdev->dev, "could not reserve device region\n");
> -- 
> 2.31.1

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


Re: [PATCH net-next v4 3/6] vhost/vsock: support MSG_EOR bit processing

2021-09-03 Thread Stefano Garzarella

On Fri, Sep 03, 2021 at 09:15:38AM +0300, Arseny Krasnov wrote:

'MSG_EOR' handling has similar logic as 'MSG_EOM' - if bit present
in packet's header, reset it to 0. Then restore it back if packet
processing wasn't completed. Instead of bool variable for each
flag, bit mask variable was added: it has logical OR of 'MSG_EOR'
and 'MSG_EOM' if needed, to restore flags, this variable is ORed
with flags field of packet.

Signed-off-by: Arseny Krasnov 
---
drivers/vhost/vsock.c | 22 +-
1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index feaf650affbe..93e8d635e18f 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -114,7 +114,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
size_t nbytes;
size_t iov_len, payload_len;
int head;
-   bool restore_flag = false;
+   u32 flags_to_restore = 0;

spin_lock_bh(>send_pkt_list_lock);
if (list_empty(>send_pkt_list)) {
@@ -179,15 +179,20 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
 * created dynamically and are initialized with header
 * of current packet(except length). But in case of
 * SOCK_SEQPACKET, we also must clear message delimeter
-* bit(VIRTIO_VSOCK_SEQ_EOM). Otherwise, instead of one
-* packet with delimeter(which marks end of message),
-* there will be sequence of packets with delimeter
-* bit set. After initialized header will be copied to
-* rx buffer, this bit will be restored.
+* bit (VIRTIO_VSOCK_SEQ_EOM) and MSG_EOR bit
+* (VIRTIO_VSOCK_SEQ_EOR) if set. Otherwise,
+* there will be sequence of packets with these
+* bits set. After initialized header will be copied to
+* rx buffer, these required bits will be restored.
 */
if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM) 
{
pkt->hdr.flags &= 
~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
-   restore_flag = true;
+   flags_to_restore |= VIRTIO_VSOCK_SEQ_EOM;
+
+   if (le32_to_cpu(pkt->hdr.flags & 
VIRTIO_VSOCK_SEQ_EOR)) {
+   pkt->hdr.flags &= 
~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
+   flags_to_restore |= 
VIRTIO_VSOCK_SEQ_EOR;
+   }
}
}

@@ -224,8 +229,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
 * to send it with the next available buffer.
 */
if (pkt->off < pkt->len) {
-   if (restore_flag)
-   pkt->hdr.flags |= 
cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
+   pkt->hdr.flags |= cpu_to_le32(flags_to_restore);

/* We are queueing the same virtio_vsock_pkt to handle
 * the remaining bytes, and we want to deliver it
--
2.25.1



Reviewed-by: Stefano Garzarella 

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