On Mon, Sep 10, 2012 at 09:16:29AM +0300, Michael S. Tsirkin wrote:
> 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?

I would like to add that on many processors, sending
IPCs between guest CPUs requires exits on sending *and*
receiving path, making it very expensive.

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