On Mon, Sep 10, 2012 at 11:42:25AM +0930, Rusty Russell wrote:
> OK, I read the spec (pasted below for easy of reading), but I'm still
> confused over how this will work.
> 
> I thought normal net drivers have the hardware provide an rxhash for
> each packet, and we map that to CPU to queue the packet on[1].  We hope
> that the receiving process migrates to that CPU, so xmit queue
> matches.

This ony works sometimes.  For example it's common to pin netperf to a
cpu to get consistent performance.  Proper hardware must obey what
applications want it to do, not the other way around.

> For virtio this would mean a new per-packet rxhash value, right?
> 
> Why are we doing something different?  What am I missing?
> 
> Thanks,
> Rusty.
> [1] Everything I Know About Networking I Learned From LWN:
>     https://lwn.net/Articles/362339/

I think you missed this:

        Some network interfaces can help with the distribution of incoming
        packets; they have multiple receive queues and multiple interrupt lines.
        Others, though, are equipped with a single queue, meaning that the
        driver for that hardware must deal with all incoming packets in a
        single, serialized stream. Parallelizing such a stream requires some
        intelligence on the part of the host operating system. 

In other words RPS is a hack to speed up networking on cheapo
hardware, this is one of the reasons it is off by default.
Good hardware has multiple receive queues.
We can implement a good one so we do not need RPS.

Also not all guest OS-es support RPS.

Does this clarify?

> ---
> Transmit Packet Steering
> 
> When VIRTIO_NET_F_MULTIQUEUE feature bit is negotiated, guest can use any of 
> multiple configured transmit queues to transmit a given packet. To avoid 
> packet reordering by device (which generally leads to performance 
> degradation) driver should attempt to utilize the same transmit virtqueue for 
> all packets of a given transmit flow. For bi-directional protocols (in 
> practice, TCP), a given network connection can utilize both transmit and 
> receive queues. For best performance, packets from a single connection should 
> utilize the paired transmit and receive queues from the same virtqueue pair; 
> for example both transmitqN and receiveqN. This rule makes it possible to 
> optimize processing on the device side, but this is not a hard requirement: 
> devices should function correctly even when this rule is not followed.
> 
> Driver selects an active steering rule using VIRTIO_NET_CTRL_STEERING command 
> (this controls both which virtqueue is selected for a given packet for 
> receive and notifies the device which virtqueues are about to be used for 
> transmit).
> 
> This command accepts a single out argument in the following format:
> 
> #define VIRTIO_NET_CTRL_STEERING               4
> 
> The field rule specifies the function used to select transmit virtqueue for a 
> given packet; the field param makes it possible to pass an extra parameter if 
> appropriate. When rule is set to VIRTIO_NET_CTRL_STEERING_SINGLE (this is the 
> default) all packets are steered to the default virtqueue transmitq (1); 
> param is unused; this is the default. With any other rule, When rule is set 
> to VIRTIO_NET_CTRL_STEERING_RX_FOLLOWS_TX packets are steered by driver to 
> the first N=(param+1) multiqueue virtqueues transmitq1...transmitqN; the 
> default transmitq is unused. Driver must have configured all these (param+1) 
> virtqueues beforehand.
> 
> Supported steering rules can be added and removed in the future. Driver 
> should check that the request to change the steering rule was successful by 
> checking ack values of the command. As selecting a specific steering is an 
> optimization feature, drivers should avoid hard failure and fall back on 
> using a supported steering rule if this command fails. The default steering 
> rule is VIRTIO_NET_CTRL_STEERING_SINGLE. It will not be removed.
> 
> When the steering rule is modified, some packets can still be outstanding in 
> one or more of the transmit virtqueues. Since drivers might choose to modify 
> the current steering rule at a high rate (e.g. adaptively in response to 
> changes in the workload) to avoid reordering packets, device is recommended 
> to complete processing of the transmit queue(s) utilized by the original 
> steering before processing any packets delivered by the modified steering 
> rule.
> 
> For debugging, the current steering rule can also be read from the 
> configuration space.
> 
> Receive Packet Steering
> 
> When VIRTIO_NET_F_MULTIQUEUE feature bit is negotiated, device can use any of 
> multiple configured receive queues to pass a given packet to driver. Driver 
> controls which virtqueue is selected in practice by configuring packet 
> steering rule using VIRTIO_NET_CTRL_STEERING command, as described 
> above[sub:Transmit-Packet-Steering].
> 
> The field rule specifies the function used to select receive virtqueue for a 
> given packet; the field param makes it possible to pass an extra parameter if 
> appropriate. When rule is set to VIRTIO_NET_CTRL_STEERING_SINGLE all packets 
> are steered to the default virtqueue receiveq (0); param is unused; this is 
> the default. When rule is set to VIRTIO_NET_CTRL_STEERING_RX_FOLLOWS_TX 
> packets are steered by host to the first N=(param+1) multiqueue virtqueues 
> receiveq1...receiveqN; the default receiveq is unused. Driver must have 
> configured all these (param+1) virtqueues beforehand. For best performance 
> for bi-directional flows (such as TCP) device should detect the flow to 
> virtqueue pair mapping on transmit and select the receive virtqueue from the 
> same virtqueue pair. For uni-directional flows, or when this mapping 
> information is missing, a device-specific steering function is used.
> 
> Supported steering rules can be added and removed in the future. Driver 
> should probe for supported rules by checking ack values of the command.
> 
> When the steering rule is modified, some packets can still be outstanding in 
> one or more of the virtqueues. Device is not required to wait for these 
> packets to be consumed before delivering packets using the new streering 
> rule. Drivers modifying the steering rule at a high rate (e.g. adaptively in 
> response to changes in the workload) are recommended to complete processing 
> of the receive queue(s) utilized by the original steering before processing 
> any packets delivered by the modified steering rule.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to