static inline void vring_init(struct vring *vr, unsigned int num, uint8_t *p, unsigned long align) { vr->num = num; vr->desc = (struct vring_desc *) p; vr->avail = (struct vring_avail *) (p + num * sizeof(struct vring_desc)); vr->used = (void *) RTE_ALIGN_CEIL((uintptr_t)(&vr->avail->ring[num]), align); }
There is a bug in vr->used calculation. 2 bytes of used_event_idx isn't considered. Would submit a fix. __u16 available[num]; __u16 used_event_idx;