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

2018-04-17 Thread Sameeh Jubran
On Tue, Apr 17, 2018 at 4:30 AM, Vijayabhaskar Balakrishna <
vijay.balakris...@oracle.com> wrote:

>
>
> On 4/16/2018 6:05 AM, Sameeh Jubran wrote:
>
>> From: Sameeh Jubran 
>>
>> 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
>> system.
>>
>> 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/ne
>> twork/ndis-receive-side-scaling2
>>
>> Signed-off-by: Sameeh Jubran 
>> ---
>>   content.tex | 114 ++
>> ++
>>   1 file changed, 114 insertions(+)
>>
>> diff --git a/content.tex b/content.tex
>> index 3d538e8..8076147 100644
>> --- a/content.tex
>> +++ b/content.tex
>> @@ -4017,6 +4017,7 @@ The device MUST NOT queue packets on receive queues
>> greater than
>>   \begin{lstlisting}
>>   // steering mode flags
>>   #define STEERING_MODE_AUTO  1
>> +#define STEERING_MODE_RSS   2
>> struct virtio_net_steering_modes {
>>   le32 steering_modes;
>> @@ -4027,6 +4028,7 @@ le32 steering_mode;
>>   le32 command;
>> union {
>> +struct virtio_net_rss rss_conf;
>>   }
>>   };
>>   @@ -4066,6 +4068,118 @@ 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}
>> +
>> +\begin{lstlisting}
>> +#define RSS_HASH_FUNCTION_NONE  1
>> +#define RSS_HASH_FUNCTION_TOEPLITZ  2
>> +#define RSS_HASH_FUNCTION_SYMMETRIC 3
>>
> Above are bit fields?  Should it be 0x1, 0x2, 0x4 etc.,

Will do.

>
> +
>> +// Hash function fields
>> +#define RSS_HASH_FIELDS_IPV4  0x0100
>> +#define RSS_HASH_FIELDS_TCP_IPV4  0x0200
>> +#define RSS_HASH_FIELDS_IPV6  0x0400
>> +#define RSS_HASH_FIELDS_IPV6_EX   0x0800
>> +#define RSS_HASH_FIELDS_TCP_IPV6  0x1000
>> +#define RSS_HASH_FIELDS_TCP_IPV6_EX   0x2000
>> +
>> +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_GET_SUPPORTED_FUNCTIONS   0
>> +#define VIRTIO_NET_SM_CTRL_RSS_SET   1
>> +\end{lstlisting}
>> +
>> +If the VIRTIO_NET_F_CTRL_STEERING_MODE is negotiated the driver can
>> send control
>> +commands for the RSS configuration. 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.
>> +
>> +The class VIRTIO_NET_CTRL_RSS has two commands:
>> +
>> +\begin{enumerate}
>> +\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.
>> +\end{enumerate}
>> +
>> +\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. Zero or
>> more
>> +flags of the RSS_HASH_FUNCTION flags MUST be used to fill the
>> \field{hash_function}
>> +field.
>> +
>> +The device MUST drop all previous RSS configuration upon receiving
>> +VIRTIO_NET_SM_CTRL_RSS_SET command.
>> +
>> +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 and distribute the
>> packets
>> +through the virqueues using the 

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

2018-04-16 Thread Vijayabhaskar Balakrishna



On 4/16/2018 6:05 AM, Sameeh Jubran wrote:

From: Sameeh Jubran 

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
system.

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 
---
  content.tex | 114 
  1 file changed, 114 insertions(+)

diff --git a/content.tex b/content.tex
index 3d538e8..8076147 100644
--- a/content.tex
+++ b/content.tex
@@ -4017,6 +4017,7 @@ The device MUST NOT queue packets on receive queues 
greater than
  \begin{lstlisting}
  // steering mode flags
  #define STEERING_MODE_AUTO  1
+#define STEERING_MODE_RSS   2
  
  struct virtio_net_steering_modes {

  le32 steering_modes;
@@ -4027,6 +4028,7 @@ le32 steering_mode;
  le32 command;
  
  union {

+struct virtio_net_rss rss_conf;
  }
  };
  
@@ -4066,6 +4068,118 @@ 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}

+
+\begin{lstlisting}
+#define RSS_HASH_FUNCTION_NONE  1
+#define RSS_HASH_FUNCTION_TOEPLITZ  2
+#define RSS_HASH_FUNCTION_SYMMETRIC 3

Above are bit fields?  Should it be 0x1, 0x2, 0x4 etc.,

+
+// Hash function fields
+#define RSS_HASH_FIELDS_IPV4  0x0100
+#define RSS_HASH_FIELDS_TCP_IPV4  0x0200
+#define RSS_HASH_FIELDS_IPV6  0x0400
+#define RSS_HASH_FIELDS_IPV6_EX   0x0800
+#define RSS_HASH_FIELDS_TCP_IPV6  0x1000
+#define RSS_HASH_FIELDS_TCP_IPV6_EX   0x2000
+
+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_GET_SUPPORTED_FUNCTIONS   0
+#define VIRTIO_NET_SM_CTRL_RSS_SET   1
+\end{lstlisting}
+
+If the VIRTIO_NET_F_CTRL_STEERING_MODE is negotiated the driver can send 
control
+commands for the RSS configuration. 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.
+
+The class VIRTIO_NET_CTRL_RSS has two commands:
+
+\begin{enumerate}
+\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.
+\end{enumerate}
+
+\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. Zero or more
+flags of the RSS_HASH_FUNCTION flags MUST be used to fill the 
\field{hash_function}
+field.
+
+The device MUST drop all previous RSS configuration upon receiving
+VIRTIO_NET_SM_CTRL_RSS_SET command.
+
+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 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
+\begin{enumerate}
+\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 hashing for the packet and

calculate the hash for the