Please ignore the typos, I mistakenly sent the patch without the fixes. I'll resend the fixes along with v2.
On Thu, Jan 25, 2018 at 6:27 PM, Sameeh Jubran <[email protected]> wrote: > From: Sameeh Jubran <[email protected]> > > 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 <[email protected]> > --- > content.tex | 133 ++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++ > 1 file changed, 133 insertions(+) > > diff --git a/content.tex b/content.tex > index c840588..5969b28 100644 > --- a/content.tex > +++ b/content.tex > @@ -3115,6 +3115,9 @@ features. > > \item[VIRTIO_NET_F_CTRL_MAC_ADDR(23)] Set MAC address through control > channel. > + > +\item[VIRTIO_NET_F_CTRL_RSS(24)] Device supports configurable RSS hash > + functions. > \end{description} > > \subsubsection{Feature bit requirements}\label{sec:Device Types / Network > Device / Feature bits / Feature bit requirements} > @@ -3138,6 +3141,8 @@ Some networking feature bits require other > networking feature bits > \item[VIRTIO_NET_F_GUEST_ANNOUNCE] Requires VIRTIO_NET_F_CTRL_VQ. > \item[VIRTIO_NET_F_MQ] Requires VIRTIO_NET_F_CTRL_VQ. > \item[VIRTIO_NET_F_CTRL_MAC_ADDR] Requires VIRTIO_NET_F_CTRL_VQ. > + > +\item[VIRTIO_NET_F_CTRL_RSS] Requires VIRTIO_NET_F_MQ. > \end{description} > > \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / > Network Device / Feature bits / Legacy Interface: Feature bits} > @@ -3308,6 +3313,7 @@ struct virtio_net_hdr { > u8 flags; > #define VIRTIO_NET_HDR_GSO_NONE 0 > #define VIRTIO_NET_HDR_GSO_TCPV4 1 > +#define VIRTIO_NET_HDR_GSO_RSS 2 > #define VIRTIO_NET_HDR_GSO_UDP 3 > #define VIRTIO_NET_HDR_GSO_TCPV6 4 > #define VIRTIO_NET_HDR_GSO_ECN 0x80 > @@ -3317,6 +3323,8 @@ struct virtio_net_hdr { > le16 csum_start; > le16 csum_offset; > le16 num_buffers; > +// Only if RSS hash offload has been negotiated > + le64 rss_hash_value; > }; > \end{lstlisting} > > @@ -4007,6 +4015,131 @@ VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET command. > The device MUST NOT queue packets on receive queues greater than > \field{virtqueue_pairs} once it has placed the > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET command in the used ring. > > +\paragraph{RSS hash offload}\label{sec:Device Types / Network Device / > Device Operation / Control Virtqueue / RSS hash offload} > + > +\begin{lstlisting} > +#define RSS_HASH_FUNCTION_NONE 1 > +#define RSS_HASH_FUNCTION_TOEPLITZ 2 > +#define RSS_HASH_FUNCTION_SYMMETRIC 3 > + > +// 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_ctrl_rss_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_F_CTRL_RSS 24 > + > +#define VIRTIO_NET_CTRL_RSS 6 > +#define VIRTIO_NET_CTRL_RSS_GET_SUPPORTED_FUNCTIONS 0 > +#define VIRTIO_NET_CTRL_RSS_DISABLE 1 > +#define VIRTIO_NET_CTRL_RSS_SET 2 > +\end{lstlisting} > + > +If the VIRTIO_NET_F_CTRL_RSS is negotiated the driver can send control > +commands for the RSS configuration. > + > +The class VIRTIO_NET_CTRL_RSS has three commands: > + > +\begin{enumerate} > +\item VIRTIO_NET_CTRL_RSS_GET_SUPPLIED_FUNCTIONS returns the hash > functions > + supported by the device to the driver. > +\item VIRTIO_NET_CTRL_RSS_DISABLE Instructs the device that RSS hashing > is no > + longer required. > +\item VIRTIO_NET_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} > + > +If this feaure has been negotiated, the virtio header has an additional > +field{rss_hash_value} field attached to it. > + > +\devicenormative{\subparagraph}{RSS hash offload}{Device Types / Network > Device / Device Operation / Control Virtqueue / RSS hash offload} > + > +The device MUST fill the virtio_net_ctrl_rss_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. > + > +Upon recieving VIRTIO_NET_CTRL_DISABLE the device SHOULD stop calculating > and > +attaching hashes for the packets as well as stop setting the > VIRTIO_NET_HDR_GSO_RSS > +in the \field{gso_type} field, however the \field{hash_function} field is > kept > +as a part of the header. > + > +The device MUST drop all previous RSS configuration upon receiving > +VIRTIO_NET_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 > + recieved the device MUST calculate the hashing for the packet and > + store it in the virtio-net header in rss_hash_value and the hash > + fields used in the calculation in rss_hash_type. > +\end{enumerate} > + > +In case of any unexpected values/ unsupported hash function the driver > +MUST return VIRTIO_NET_ERR in the \field{ack} field. > + > +\drivernormative{\subparagraph}{RSS hash offload}{Device Types / Network > Device / Device Operation / Control Virtqueue / RSS hash offload} > + > +If the driver negotiates the feature VIRTIO_NET_F_CTRL_RSS the driver > SHOULD > +send VIRTIO_NET_CTRL_RSS_SET command to the device along with the RSS > structure > +filled. The RSS structure fields should be filled as follows: > + > +\begin{itemize} > +\item The driver SHOULD choose the hash function that SHOULD be used and > fill > + it in the \field{hash_function} field along with the approperiate > flags > + in the \field{hash_function_flags} field. These flags inidicate 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 suitable hash key should > be set > + 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. > +\end{itemize} > +Once the configuration phase is over successfully, the packets SHOULD > have the > +\field{rss_hash_value} field with the hash value that was calculated by > the > +device. > + > +Whenever the driver wants to discard the current RSS settings, it can > send an > +VIRTIO_NET_CTRL_RSS_SET command along with rss structure that has > +RSS_HASH_FUNCTION_NONE the \field{hash_function} field. > + > +The driver MUST check the \field{ack} field value provided by the device, > in > +case the value is not VIRTIO_NET_OK then the driver MUST hanlde faliure > and > +retry another hash function or else give up. > + > \subparagraph{Legacy Interface: Automatic receive steering in multiqueue > mode}\label{sec:Device Types / Network Device / Device Operation / Control > Virtqueue / Automatic receive steering in multiqueue mode / Legacy > Interface: Automatic receive steering in multiqueue mode} > When using the legacy interface, transitional devices and drivers > MUST format \field{virtqueue_pairs} > -- > 2.13.6 > > -- Respectfully, *Sameeh Jubran* *Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>* *Software Engineer @ Daynix <http://www.daynix.com>.*
