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


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-dev message

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

Subject: Re: [virtio-dev] [PATCH v3 2/2] content: net: steering mode: Add RSS

Hi Sameeh,

See inline..

On 4/18/2018 3:46 AM, Sameeh Jubran wrote:
From: Sameeh Jubran <sjubran@redhat.com>

This commit introduces the RSS feature into virtio-net. It is introduced
as a sub mode for a general command which configures the steering mode.

Most modern high end network devices today support configurable hash functions,
this commit introduces RSS - Receive Side Scaling - [1] to virtio net device.

The RSS is a technology from Microsoft that boosts network device performance
by efficiently distributing the traffic among the CPUs in a multiprocessor

This feature is supported in most of the modern network cards as well as most
modern OSes including Linux and Windows. It is worth mentioning that both DPDK
and Hyper-v support RSS too.

[1] https://docs.microsoft.com/en-us/windows-hardware/drivers/network/ndis-receive-side-scaling2

Signed-off-by: Sameeh Jubran <sjubran@redhat.com>
  content.tex | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 109 insertions(+)

diff --git a/content.tex b/content.tex
index 6b1f7ca..3ea2b6a 100644
--- a/content.tex
+++ b/content.tex
@@ -4023,6 +4023,7 @@ according to the native endian of the guest rather than
  // steering mode flags
  #define STEERING_MODE_AUTO          0x1
+#define STEERING_MODE_RSS           0x2
// Used by the devide for returning to the driver the supported steering modes
  struct virtio_net_steering_modes {
@@ -4035,6 +4036,7 @@ le32 command;
// A union which can be used for passing structures to one of the sub modes
      union {
+    struct virtio_net_rss rss_conf;
@@ -4074,6 +4076,113 @@ If this feature has been negotiated, the virtio header has an additional This is the default steering mode, please refer to the "Automatic receive steering in multiqueue" section. +\subparagraph{Receive Side Scaling}{Device Types / Network Device / Device Operation / Control Virtqueue / Steering mode / Receive Side Scaling}
+// Hash function fields
+#define RSS_HASH_FIELDS_IPV4          0x00000100
+#define RSS_HASH_FIELDS_TCP_IPV4      0x00000200
+#define RSS_HASH_FIELDS_IPV6          0x00000400
+#define RSS_HASH_FIELDS_IPV6_EX       0x00000800
+#define RSS_HASH_FIELDS_TCP_IPV6      0x00001000
+#define RSS_HASH_FIELDS_TCP_IPV6_EX   0x00002000
+struct virtio_net_rss_supported_hash{
+le32 hash_function;
+struct virtio_net_rss {
+le32 hash_function;
+le32 hash_function_flags;
+le32 hash_key_length;
+le32 indirection_table_length;
+	struct {
+		le32 hash_key[hash_key_length];
+		le32 indirection_table[indirection_table_length];
+	}
+#define VIRTIO_NET_SM_CTRL_RSS_SET                       1
+If the VIRTIO_NET_F_CTRL_STEERING_MODE is negotiated the driver can send control
+commands using the VIRTIO_NET_CTRL_SM_CONTROL command along with the STEERING_MODE_RSS
+flag for configuring RSS the virtio_net_steering_mode should be filled. The
+\field{steering_mode} field should be filled with the STEERING_MODE_RSS flag along
+with one of the VIRTIO_NET_SM_CTRL_RSS commands in the \field{command} field. The
+\field{rss_conf} field should be used.
May be reworded for clarify along the lines: If theVIRTIO_NET_F_CTRL_STEERING_MODE feature bit is negotiated, the driver can send steering mode control command, VIRTIO_NET_CTRL_SM_CONTROL, with the STEERING_MODE_RSSflag for configuring RSS provided it is one of the supported modes.  The supported steering modes returned by device in response to VIRTIO_NET_CTRL_SM_GET_SUPPORTED_MODES command issued by the driver.
For configuring particulars of RSS steering mode, the various fields of
virtio_net_steering_mode should be filled by the driver.  This includes
\field{steering_mode} with  STEERING_MODE_RSS flag along
with one of the VIRTIO_NET_SM_CTRL_RSS commands in the \field{command}
field in addition to union \field{rss_conf} field members.
+The class VIRTIO_NET_CTRL_RSS has two commands:
+\item VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_FUNCTIONS returns the hash functions
+	supported by the device to the driver.
+\item VIRTIO_NET_SM_CTRL_RSS_SET applies the new RSS configuration. The command is
+	used by the driver for setting RSS hash function, hash key and
+	indirection table in the device.
+\devicenormative{\subparagraph}{Receive Side Scaling}{Device Types / Network Device / Device Operation / Control Virtqueue / Steering mode / Receive Side Scaling}
+The device MUST fill the virtio_net_rss_supported_hash structure with the hash
+functions it supports and return the structure to the driver. One or more
+flags of the RSS_HASH_FUNCTION flags MUST be used to fill the \field{hash_function}
+The device MUST drop all previous RSS configuration upon receiving
+The device MUST set the RSS configuration according to the settings provided as
+follows, once the configuration process is completed the device SHOULD apply
+the hash function to each of the incoming packets with regards to the flags in
+the \field{hash_function_flags} fields and distribute the packets through the
+virqueues using the calculated hash and the indirection table that were earlier
+provided by the driver.
+Setting RSS configuration
+\item The driver fills all of the fields and passes them through the control
+	queue to the device.
+\item The device sets the RSS configuration as provided by the driver.
+\item If the device successfully applied the configuration, on each packet
+	received the device MUST calculate the hash for the packet using
+	the fields specified in \field{hash_function_flags} and store it in the
+	virtio-net header in the \field{hash} field and the hash fields
+	used in the calculation.
+\drivernormative{\subparagraph}{Receive Side Scaling}{Device Types / Network Device / Device Operation / Control Virtqueue / Steering mode / Receive Side Scaling}
+If the driver wants to set RSS hash it should fill the RSS structure fields
+as follows:
+\item The driver SHOULD choose the hash function that SHOULD be used and fill
+	it in the \field{hash_function} field along with the appropriate flags
+	in the \field{hash_function_flags} field. These flags indicate to the
+	device which packet fields MUST be used in the calculation process of
+	the hash.
+\item Once the hash function has been chosen a hash key should also be set by
+	the driver in the \field{hash_key} field, the length of the key should
+	be stored in the \field{hash_key_length} field.
+\item Lastly the driver should fill the indirection table array in the
+	\field{indirection_table} field while setting the array length in
+	\field{indirection_table_length}. This structure is used by the device
+	for determining in which RX virt queue the packet should be placed.
+Once the configuration phase is over successfully, the packets SHOULD have the
+\field{hash} field with the hash value that was calculated by the device.
+Whenever the driver wants to stop performing RSS, it can switch back to
Should we say: ..stop performing RSS or any earlier configured steering mode,
+Automatic Steering Mode using the VIRTIO_NET_CTRL_SM_CONTROL command along with
  \paragraph{Offloads State Configuration}\label{sec:Device Types / Network Device / Device Operation / Control Virtqueue / Offloads State Configuration}
If the VIRTIO_NET_F_CTRL_GUEST_OFFLOADS feature is negotiated, the driver can

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