Skip to content

Commit

Permalink
content: Rename confusing queue_notify_data and vqn names
Browse files Browse the repository at this point in the history
Currently queue_notify_data register indicates the device
internal queue notification content. This register is
meaningful only when feature bit VIRTIO_F_NOTIF_CONFIG_DATA is
negotiated.

However, above register name often get confusing association with
very similar feature bit VIRTIO_F_NOTIFICATION_DATA.

When VIRTIO_F_NOTIFICATION_DATA feature bit is negotiated,
notification really involves sending additional queue progress
related information (not queue identifier or index).

Hence
1. to avoid any misunderstanding and association of
queue_notify_data with similar name VIRTIO_F_NOTIFICATION_DATA,

and
2. to reflect that queue_notify_data is the actual device
internal virtqueue identifier/index/data/cookie,

a. rename queue_notify_data to queue_notif_config_data.

b. rename ambiguous vqn to a union of vq_index and vq_config_data

c. The driver notification section assumes that queue notification contains
vq index always. CONFIG_DATA feature bit introduction missed to
update the driver notification section. Hence, correct it.

Fixes: oasis-tcs#163
Acked-by: Halil Pasic <[email protected]>
Signed-off-by: Parav Pandit <[email protected]>
Signed-off-by: Michael S. Tsirkin <[email protected]>

Reviewed-by: David Edmondson <[email protected]>
  • Loading branch information
paravmellanox authored and mstsirkin committed May 19, 2023
1 parent 362f1ca commit cc4a560
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 24 deletions.
11 changes: 8 additions & 3 deletions content.tex
Original file line number Diff line number Diff line change
Expand Up @@ -449,8 +449,12 @@ \section{Driver Notifications} \label{sec:Basic Facilities of a Virtio Device /
notification to the device.

When VIRTIO_F_NOTIFICATION_DATA has not been negotiated,
this notification involves sending the
virtqueue index to the device (method depending on the transport).
this notification contains either a virtqueue index if
VIRTIO_F_NOTIF_CONFIG_DATA is not negotiated or device supplied virtqueue
notification config data if VIRTIO_F_NOTIF_CONFIG_DATA is negotiated.

The notification method and supplying any such virtqueue notification config data
is transport specific.

However, some devices benefit from the ability to find out the
amount of available data in the queue without accessing the virtqueue in memory:
Expand All @@ -461,7 +465,8 @@ \section{Driver Notifications} \label{sec:Basic Facilities of a Virtio Device /
the following information:

\begin{description}
\item [vqn] VQ number to be notified.
\item [vq_index or vq_notif_config_data] Either virtqueue index or device
supplied queue notification config data corresponding to a virtqueue.
\item [next_off] Offset
within the ring where the next available ring entry
will be written.
Expand Down
2 changes: 1 addition & 1 deletion notifications-be.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
be32 {
vqn : 16;
vq_index: 16; /* previously known as vqn */
next_off : 15;
next_wrap : 1;
};
2 changes: 1 addition & 1 deletion notifications-le.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
le32 {
vqn : 16;
vq_index: 16; /* previously known as vqn */
next_off : 15;
next_wrap : 1;
};
71 changes: 52 additions & 19 deletions transport-pci.tex
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport
le64 queue_desc; /* read-write */
le64 queue_driver; /* read-write */
le64 queue_device; /* read-write */
le16 queue_notify_data; /* read-only for driver */
le16 queue_notif_config_data; /* read-only for driver */
le16 queue_reset; /* read-write */

/* About the administration virtqueue. */
Expand Down Expand Up @@ -393,17 +393,21 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport
\item[\field{queue_device}]
The driver writes the physical address of Device Area here. See section \ref{sec:Basic Facilities of a Virtio Device / Virtqueues}.

\item[\field{queue_notify_data}]
\item[\field{queue_notif_config_data}]
This field exists only if VIRTIO_F_NOTIF_CONFIG_DATA has been negotiated.
The driver will use this value to put it in the 'virtqueue number' field
in the available buffer notification structure.
The driver will use this value when driver sends available buffer
notification to the device.
See section \ref{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Available Buffer Notifications}.
\begin{note}
This field provides the device with flexibility to determine how virtqueues
will be referred to in available buffer notifications.
In a trivial case the device can set \field{queue_notify_data}=vqn. Some devices
may benefit from providing another value, for example an internal virtqueue
identifier, or an internal offset related to the virtqueue number.
In a trivial case the device can set \field{queue_notif_config_data} to
the virtqueue index. Some devices may benefit from providing another value,
for example an internal virtqueue identifier, or an internal offset
related to the virtqueue index.
\end{note}
\begin{note}
This field was previously known as queue_notify_data.
\end{note}

\item[\field{queue_reset}]
Expand Down Expand Up @@ -493,7 +497,9 @@ \subsubsection{Common configuration structure layout}\label{sec:Virtio Transport

\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}.
The driver MUST NOT write to \field{device_feature}, \field{num_queues},
\field{config_generation}, \field{queue_notify_off} or
\field{queue_notif_config_data}.

If VIRTIO_F_RING_PACKED has been negotiated,
the driver MUST NOT write the value 0 to \field{queue_size}.
Expand Down Expand Up @@ -1068,13 +1074,22 @@ \subsubsection{Available Buffer Notifications}\label{sec:Virtio Transport Option

When VIRTIO_F_NOTIFICATION_DATA has not been negotiated,
the driver sends an available buffer notification to the device by writing
the 16-bit virtqueue index
of this virtqueue to the Queue Notify address.
only the 16-bit notification value to the Queue Notify address of the
virtqueue. A notification value depends on the negotiation of
VIRTIO_F_NOTIF_CONFIG_DATA.

When VIRTIO_F_NOTIFICATION_DATA has been negotiated,
the driver sends an available buffer notification to the device by writing
the following 32-bit value to the Queue Notify address:
\lstinputlisting{notifications-le.c}
If VIRTIO_F_NOTIFICATION_DATA has been negotiated, the driver sends an
available buffer notification to the device by writing the following 32-bit
value to the Queue Notify address:
\lstinputlisting{notifications-data-le.c}

\begin{itemize}
\item When VIRTIO_F_NOTIF_CONFIG_DATA is not negotiated \field{vq_index} is set
to the virtqueue index.

\item When VIRTIO_F_NOTIFICATION_DATA is negotiated,
\field{vq_notif_config_data} is set to \field{queue_notif_config_data}.
\end{itemize}

See \ref{sec:Basic Facilities of a Virtio Device / Driver notifications}~\nameref{sec:Basic Facilities of a Virtio Device / Driver notifications}
for the definition of the components.
Expand All @@ -1083,12 +1098,30 @@ \subsubsection{Available Buffer Notifications}\label{sec:Virtio Transport Option
for how to calculate the Queue Notify address.

\drivernormative{\paragraph}{Available Buffer Notifications}{Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Available Buffer Notifications}
If VIRTIO_F_NOTIF_CONFIG_DATA has been negotiated:

If VIRTIO_F_NOTIFICATION_DATA is not negotiated, the driver notification
MUST be a 16-bit notification.

If VIRTIO_F_NOTIFICATION_DATA is negotiated, the driver notification
MUST be a 32-bit notification.

If VIRTIO_F_NOTIF_CONFIG_DATA is not negotiated:
\begin{itemize}
\item If VIRTIO_F_NOTIFICATION_DATA is not negotiated, the driver MUST set the
notification value to the virtqueue index.

\item If VIRTIO_F_NOTIFICATION_DATA is negotiated, the driver MUST set the
\field{vq_index} to the virtqueue index.

\end{itemize}

If VIRTIO_F_NOTIF_CONFIG_DATA is negotiated:
\begin{itemize}
\item If VIRTIO_F_NOTIFICATION_DATA has not been negotiated, the driver MUST use the
\field{queue_notify_data} value instead of the virtqueue index.
\item If VIRTIO_F_NOTIFICATION_DATA has been negotiated, the driver MUST set the
\field{vqn} field to the \field{queue_notify_data} value.
\item If VIRTIO_F_NOTIFICATION_DATA is not negotiated, the driver MUST set
the notification value to \field{queue_notif_config_data}.

\item If VIRTIO_F_NOTIFICATION_DATA is negotiated, the driver MUST set the
\field{vq_notify_config_data} to the \field{queue_notif_config_data} value.
\end{itemize}

\subsubsection{Used Buffer Notifications}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Used Buffer Notifications}
Expand Down

0 comments on commit cc4a560

Please sign in to comment.