On Wed, Apr 27, 2011 at 02:59:27PM +0930, Rusty Russell wrote:
> On Sat, 23 Apr 2011 18:13:34 -0500, Rob Landley <[email protected]>
> wrote:
> > From: Rob Landley <[email protected]>
> >
> > Going indirect for only two buffers isn't likely to be a performance win
> > because the kmalloc/kfree overhead for the indirect block can't be cheaper
> > than one extra linked list traversal.
>
> Unfortunately it's not completely clear. QEMU sets fairly small rings,
> and the virtio-net driver uses 2 descriptors minimum. The effect can be
> a real bottleneck for small packets.
>
> Now, virtio-net could often stuff the virtio_net_hdr in the space before
> the packet data (saving a descriptor) but I think that will need a
> feature bit since qemu (incorrectly) used to insist on a separate
> descriptor for that header.
>
> > Properly "tuning" the threshold would probably be workload-specific.
> > (One big downside of not going indirect is extra pressure on the table
> > entries, and table size varies.) But I think that in the general case,
> > 2 is a defensible minimum?
>
> I'd be tempted to say that once we fill the ring, we should drop the
> threshold.
>
> Michael?
>
> Thanks,
> Rusty.
Yes, one idea is to use part of a ring (e.g. 1/4 of a ring) for direct
entries, and the rest for indirect. So we end up with a threshold like
max(1, vq->num_free - in - out - vq->num * N)
(above is pseudo-code, must take care of unsigned vs signed etc)
and I think I'd try with N = 3/4 or maybe N = 1/2
--
MST
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/virtualization