Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756244Ab1EPVX7 (ORCPT ); Mon, 16 May 2011 17:23:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51672 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754522Ab1EPVX5 (ORCPT ); Mon, 16 May 2011 17:23:57 -0400 Date: Tue, 17 May 2011 00:24:01 +0300 From: "Michael S. Tsirkin" To: Shirley Ma Cc: David Miller , Eric Dumazet , Avi Kivity , Arnd Bergmann , netdev@vger.kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH V5 4/6 net-next] vhost: vhost TX zero-copy support Message-ID: <20110516212401.GF18148@redhat.com> References: <1305574484.3456.30.camel@localhost.localdomain> <20110516204540.GD18148@redhat.com> <1305579414.3456.49.camel@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1305579414.3456.49.camel@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2006 Lines: 57 On Mon, May 16, 2011 at 01:56:54PM -0700, Shirley Ma wrote: > On Mon, 2011-05-16 at 23:45 +0300, Michael S. Tsirkin wrote: > > > +/* Since we need to keep the order of used_idx as avail_idx, it's > > possible that > > > + * DMA done not in order in lower device driver for some reason. To > > prevent > > > + * used_idx out of order, upend_idx is used to track avail_idx > > order, done_idx > > > + * is used to track used_idx order. Once lower device DMA done, > > then upend_idx > > > + * can move to done_idx. > > > > Could you clarify this please? virtio explicitly allows out of order > > completion of requests. Does it simplify code that we try to keep > > used index updates in-order? Because if not, this is not > > really a requirement. > > Hello Mike, > > Based on my testing, vhost_add_used() must be in order from > vhost_get_vq_desc(). Otherwise, virtio_net ring seems get double > freed. Double-freed or you get NULL below? > I didn't spend time on debugging this. > > in virtqueue_get_buf > > if (unlikely(!vq->data[i])) { > BAD_RING(vq, "id %u is not a head!\n", i); > return NULL; > } Yes but i used here is the head that we read from the ring, not the ring index itself. i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id we must complete any id only once, but in any order. > That's the reason I created the upend_idx and done_idx. > > Thanks > Shirley Very strange, it sounds like a bug, but I can't tell where: in host or in guest. If it's in the guest, we must fix it. If in host, we should only fix it if it makes life simpler for us. Could you try to nail it down pls? Another question: will code get simpler or more complex if that restriction's removed? -- MST -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/