OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-comment message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [PATCH] virtio-pci: introduce VIRITO_F_QUEUE_STATE


On Tue, Mar 16, 2021 at 7:08 AM Jason Wang <jasowang@redhat.com> wrote:
>
>
> å 2021/3/15 äå8:24, Eugenio Perez Martin åé:
> > On Mon, Mar 15, 2021 at 3:59 AM Jason Wang <jasowang@redhat.com> wrote:
> >> This patch adds the ability to save and restore virtqueue state via a
> >> new field in the common configuration infrastructure.
> >>
> >> To simply the implementation, no new device status is introduced. For
> >> device, the requirements is not to forget the queue state after
> >> virtio reset and clear the virtqueue state upon ACKNOWLEDGE. For
> >> driver, it must set the virtqueue state before setting DRIVER_OK.
> >>
> >> To save a virtqueue state, the driver then need:
> >>
> >> 1) reset device
> >> 2) read virtqueue statue
> >>
> >> To restore a virtqueue state, the driver need:
> >>
> >> 1) reset device
> >> 2) perform necessary setups (e.g features negotiation)
> >> 3) write virtqueue state
> >> 4) set DRIVER_OK
> >>
> >> The main user should be live migration.
> >>
> >> Signed-off-by: Jason Wang <jasowang@redhat.com>
> >> ---
> >>   content.tex                 | 38 +++++++++++++++++++++++++++++++++++++
> >>   virtqueue-state-packed-le.c |  7 +++++++
> >>   virtqueue-state-split-le.c  |  4 ++++
> >>   3 files changed, 49 insertions(+)
> >>   create mode 100644 virtqueue-state-packed-le.c
> >>   create mode 100644 virtqueue-state-split-le.c
> >>
> >> diff --git a/content.tex b/content.tex
> >> index 620c0e2..d7bff25 100644
> >> --- a/content.tex
> >> +++ b/content.tex
> >> @@ -837,6 +837,7 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport
> >>           le64 queue_driver;              /* read-write */
> >>           le64 queue_device;              /* read-write */
> >>           le16 queue_notify_data;         /* read-only for driver */
> > In my opinion it would be more clear to add an explicit le16 reserved[3] here.
>
>
> Good point, but then we need to document those revserved dependency with
> this feature?
>

Maybe I should have proposed naming that field "padding", but with
"reserved" I tried to signal that it can have future uses.

> Another solution is not using an "opaque" u64 here. Instead we could use:
>
> le16 last_avail_idx;
> le16 {
>      last_avail_idx : 15;
>      last_avail_wrap_counter : 1
> };
> le16 {
>      used_idx : 15;
>      used_wrap_counter : 1;
> }
>
> Is this better?
>

I find this even better, actually, yes.

Thanks!

> Thanks
>
>
> >
> >> +        le64 queue_state;               /* read-write */
> >>   };
> >>   \end{lstlisting}
> >>
> >> @@ -916,6 +917,29 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport
> >>           may benefit from providing another value, for example an internal virtqueue
> >>           identifier, or an internal offset related to the virtqueue number.
> >>           \end{note}
> >> +
> >> +\item[\field{queue_state}]
> >> +        This field exists only if VIRTIO_F_QUEUE_STATE has been
> >> +        negotiated. The driver will use this field to get or set the
> >> +        virtqueue state by reading or writing the 64bit from the
> >> +        field.
> >> +        When VIRTIO_F_RING_PACKED has not been negotiated, the driver
> >> +        can set and get the following states:
> >> +        \lstinputlisting{virtqueue-state-split-le.c}
> >> +        The field \field{last_avail_idx} is the location where the
> >> +        device read for next index from the available ring.
> >> +        When VIRTIO_F_RING_PACKED has been negotiated, the driver can
> >> +        set and get the following states:
> >> +        \lstinputlisting{virtqueue-state-packed-le.c}
> >> +        The field \field{last_avail_idx} is the next location where
> >> +        device read for the next descriptor from the descriptor
> >> +        ring. The field \field{last_avail_wrap_counter} is the last
> >> +        driver ring wrap counter that is observed by the device. The
> >> +        field \field{used_idx} is the next location where device write
> >> +        used descriptor do descriptor ring. The field
> >> +        \field{used_wrap_counter} is the wrap counter that is used by
> >> +        the device. See also \ref{sec:Packed Virtqueues / Driver and Device Ring Wrap Counters}.
> >> +
> >>   \end{description}
> >>
> >>   \devicenormative{\paragraph}{Common configuration structure layout}{Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / Common configuration structure layout}
> >> @@ -964,6 +988,10 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport
> >>   present either a value of 0 or a power of 2 in
> >>   \field{queue_size}.
> >>
> >> +If VIRTIO_F_QUEUE_STATE has been negotiated, a device MUST NOT clear
> >> +the queue state upon reset and MUST reset the queue state when
> >> +ACKNOWLEDGE has been set through \field{device status} bit.
> >> +
> >>   \drivernormative{\paragraph}{Common configuration structure layout}{Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / Common configuration structure layout}
> >>
> >>   The driver MUST NOT write to \field{device_feature}, \field{num_queues}, \field{config_generation}, \field{queue_notify_off} or \field{queue_notify_data}.
> >> @@ -981,6 +1009,13 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport
> >>
> >>   The driver MUST NOT write a 0 to \field{queue_enable}.
> >>
> >> +If VIRTIO_F_QUEUE_STATE has been negotiated, a driver SHOULD set the
> >> +state of each virtqueue through \field{queue_state} before setting the
> >> +DRIVER_OK \field{device status} bit and SHOULD NOT write to
> >> +\field{queue_state} after setting the DRIVER_OK \field{device status}
> >> +bit. If a driver want to get the virtqueue state, it MUST first reset
> >> +the device then read state from \field{queue_state}.
> >> +
> >>   \subsubsection{Notification structure layout}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / Notification capability}
> >>
> >>   The notification location is found using the VIRTIO_PCI_CAP_NOTIFY_CFG
> >> @@ -6596,6 +6631,9 @@ \chapter{Reserved Feature Bits}\label{sec:Reserved Feature Bits}
> >>     transport specific.
> >>     For more details about driver notifications over PCI see \ref{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Available Buffer Notifications}.
> >>
> >> +\item[VIRTIO_F_QUEUE_STATE(40)] This feature indicates that the driver
> >> +  can set and get the virtqueue state.
> >> +
> >>   \end{description}
> >>
> >>   \drivernormative{\section}{Reserved Feature Bits}{Reserved Feature Bits}
> >> diff --git a/virtqueue-state-packed-le.c b/virtqueue-state-packed-le.c
> >> new file mode 100644
> >> index 0000000..f21f9c2
> >> --- /dev/null
> >> +++ b/virtqueue-state-packed-le.c
> >> @@ -0,0 +1,7 @@
> >> +le64 {
> >> +       last_avail_idx : 15;
> >> +       last_avail_wrap_counter : 1;
> >> +       used_idx : 15;
> >> +       used_wrap_counter : 1;
> >> +       reserved : 32;
> >> +};
> >> diff --git a/virtqueue-state-split-le.c b/virtqueue-state-split-le.c
> >> new file mode 100644
> >> index 0000000..daeb4a3
> >> --- /dev/null
> >> +++ b/virtqueue-state-split-le.c
> >> @@ -0,0 +1,4 @@
> >> +le64 {
> >> +       last_avail_idx : 16;
> >> +       reserved: 48;
> >> +};
> >> --
> >> 2.24.3 (Apple Git-128)
> >>
>



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]