`On Wed, May 25, 2011 at 11:05:04AM +0930, Rusty Russell wrote:> On Mon, 23 May 2011 14:19:00 +0300, "Michael S. Tsirkin" <mst@redhat.com> wrote:> > I do understand how it seems a waste to leave direct space> > in the ring while we might in practice have space> > due to indirect. Didn't come up with a nice way to> > solve this yet - but 'no worse than now :)'> > Let's just make it "bool free_old_xmit_skbs(unsigned int max)".  max ==> 2 for the normal xmit path, so we're low latency but we keep ahead on> average.  max == -1 for the "we're out of capacity, we may have to stop> the queue".> > That keeps it simple and probably the right thing...> > Thanks,> Rusty.Hmm I'm not sure I got it, need to think about this.I'd like to go back and document how my design was supposed to work.This really should have been in commit log or even a comment.I thought we need a min, not a max.We start with this:	while ((c = (virtqueue_get_capacity(vq) < 2 + MAX_SKB_FRAGS) &&		(skb = get_buf)))		kfree_skb(skb);	return !c;This is clean and simple, right? And it's exactly asking for what we need.But this way we always keep a lot of memory in skbs even when rate ofcommunication is low.So we add the min parameter:	int n = 0;	while ((((c = (virtqueue_get_capacity(vq) < 2 + MAX_SKB_FRAGS)) ||		 n++ < min) && (skb = get_buf)))		kfree_skb(skb);	return !c;on the normal path min == 2 so we're low latency but we keep ahead onaverage. min == 0 for the "we're out of capacity, we may have to stopthe queue".Does the above make sense at all?-- MST`