From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 8D86C2C74 for ; Tue, 14 Mar 2017 13:11:30 +0100 (CET) Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A0C8980F75; Tue, 14 Mar 2017 12:11:30 +0000 (UTC) Received: from [10.36.116.175] (ovpn-116-175.ams2.redhat.com [10.36.116.175]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2ECBQOm023788 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 14 Mar 2017 08:11:28 -0400 To: Yuanhan Liu , dev@dpdk.org References: <1488534682-3494-1-git-send-email-yuanhan.liu@linux.intel.com> <1488534682-3494-8-git-send-email-yuanhan.liu@linux.intel.com> Cc: Harris James R , Liu Changpeng From: Maxime Coquelin Message-ID: <482f834a-9e22-0bec-1fd7-1be68563b7f7@redhat.com> Date: Tue, 14 Mar 2017 13:11:24 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <1488534682-3494-8-git-send-email-yuanhan.liu@linux.intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 14 Mar 2017 12:11:30 +0000 (UTC) Subject: Re: [dpdk-dev] [PATCH 07/17] vhost: export vhost vring info X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Mar 2017 12:11:31 -0000 On 03/03/2017 10:51 AM, Yuanhan Liu wrote: > Signed-off-by: Yuanhan Liu > --- > lib/librte_vhost/rte_vhost_version.map | 1 + > lib/librte_vhost/rte_virtio_net.h | 13 +++++++++++++ > lib/librte_vhost/vhost.c | 30 ++++++++++++++++++++++++++++++ > lib/librte_vhost/vhost.h | 2 ++ > 4 files changed, 46 insertions(+) > > diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map > index 85a2796..efde936 100644 > --- a/lib/librte_vhost/rte_vhost_version.map > +++ b/lib/librte_vhost/rte_vhost_version.map > @@ -37,5 +37,6 @@ DPDK_17.05 { > rte_vhost_driver_set_features; > rte_vhost_get_negotiated_features > rte_vhost_get_vhost_memory; > + rte_vhost_get_vhost_vring; > > } DPDK_16.07; > diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h > index e7b1599..80209ad 100644 > --- a/lib/librte_vhost/rte_virtio_net.h > +++ b/lib/librte_vhost/rte_virtio_net.h > @@ -80,6 +80,17 @@ struct rte_vhost_memory { > struct rte_vhost_mem_region regions[0]; > }; > > +struct rte_vhost_vring { > + struct vring_desc *desc; > + struct vring_avail *avail; > + struct vring_used *used; > + uint64_t log_guest_addr; > + > + int callfd; > + int kickfd; > + uint16_t size; > +}; > + > /** > * Device and vring operations. > */ > @@ -211,5 +222,7 @@ uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id, > > int rte_vhost_get_vhost_memory(int vid, struct rte_vhost_memory **mem); > uint64_t rte_vhost_get_negotiated_features(int vid); > +int rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx, > + struct rte_vhost_vring *vring); > > #endif /* _VIRTIO_NET_H_ */ > diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c > index 8046aef..b175f0e 100644 > --- a/lib/librte_vhost/vhost.c > +++ b/lib/librte_vhost/vhost.c > @@ -375,6 +375,36 @@ struct virtio_net * > return 0; > } > > +int > +rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx, > + struct rte_vhost_vring *vring) > +{ > + struct virtio_net *dev; > + struct vhost_virtqueue *vq; > + > + dev = get_device(vid); > + if (!dev) > + return -1; > + > + if (vring_idx > VHOST_MAX_VRING) Shouldn't be ">=" ? > + return -1; > + > + vq = dev->virtqueue[vring_idx]; > + if (!vq) > + return -1; > + > + vring->desc = vq->desc; > + vring->avail = vq->avail; > + vring->used = vq->used; > + vring->log_guest_addr = vq->log_guest_addr; > + > + vring->callfd = vq->callfd; > + vring->kickfd = vq->kickfd; > + vring->size = vq->size; > + > + return 0; > +} > + > uint16_t > rte_vhost_avail_entries(int vid, uint16_t queue_id) > { > diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h > index ed7b2c9..b0ef0cc 100644 > --- a/lib/librte_vhost/vhost.h > +++ b/lib/librte_vhost/vhost.h > @@ -138,6 +138,8 @@ struct vhost_virtqueue { > #ifndef VIRTIO_NET_F_MQ > #define VIRTIO_NET_F_MQ 22 > #endif > + > +#define VHOST_MAX_VRING 0x100 Looking at the code, I'm not clear where this limitation comes from. It seems that it can be up to 0x10000, no? struct virtio_net { ... struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2]; with: #ifdef VIRTIO_NET_F_MQ #define VHOST_MAX_QUEUE_PAIRS VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX #define VHOST_SUPPORTS_MQ (1ULL << VIRTIO_NET_F_MQ) #else #define VHOST_MAX_QUEUE_PAIRS 1 #define VHOST_SUPPORTS_MQ 0 #endif and: #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000 Regards, Maxime