On Tue, Mar 14, 2017 at 01:11:24PM +0100, Maxime Coquelin wrote: > >+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 ">=" ?
Nice catch! > >+#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? It comes from the vhost-user spec: --yliu --- * VHOST_USER_SET_VRING_KICK Id: 12 Equivalent ioctl: VHOST_SET_VRING_KICK Master payload: u64 Set the event file descriptor for adding buffers to the vring. It is passed in the ancillary data. Bits (0-7) of the payload contain the vring index. Bit 8 is the invalid FD flag. This flag is set when there is no file descriptor in the ancillary data. This signals that polling should be used instead of waiting for a kick. > > 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