Since packed indirect descriptors are added and initialized when initializing vring, the reconnection path also needs to be considered. Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup") Cc: stable@dpdk.org Cc: yong.liu@intel.com Signed-off-by: Xuan Ding <xuan.ding@intel.com> --- drivers/net/virtio/virtqueue.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index 1f9af3c31b..47229f35c4 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -208,6 +208,20 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) rte_pktmbuf_free(dxp->cookie); dxp->cookie = NULL; } + + struct virtio_tx_region *txr; + txr = txvq->virtio_net_hdr_mz->addr; + /* first indirect descriptor is always the tx header */ + struct vring_packed_desc *start_dp = + txr[desc_idx].tx_packed_indir; + vring_desc_init_indirect_packed(start_dp, + RTE_DIM(txr[desc_idx].tx_packed_indir)); + start_dp->addr = txvq->virtio_net_hdr_mem + + desc_idx * sizeof(*txr) + + offsetof(struct virtio_tx_region, + tx_hdr); + start_dp->len = vq->hw->vtnet_hdr_size; + } vring_desc_init_packed(vq, size); -- 2.17.1
Hi Xuan, On 8/19/21 07:35, Xuan Ding wrote: > Since packed indirect descriptors are added and initialized when > initializing vring, the reconnection path also needs to be considered. > > Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup") > Cc: stable@dpdk.org > Cc: yong.liu@intel.com > > Signed-off-by: Xuan Ding <xuan.ding@intel.com> > --- > drivers/net/virtio/virtqueue.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c > index 1f9af3c31b..47229f35c4 100644 > --- a/drivers/net/virtio/virtqueue.c > +++ b/drivers/net/virtio/virtqueue.c > @@ -208,6 +208,20 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) > rte_pktmbuf_free(dxp->cookie); > dxp->cookie = NULL; > } It makes me think we might save quite some bytes by not allocating indirect descriptors when feature is not negotiated, but it might have a cost in term of performance. > + > + struct virtio_tx_region *txr; Don't mix declarations within code. > + txr = txvq->virtio_net_hdr_mz->addr; > + /* first indirect descriptor is always the tx header */ > + struct vring_packed_desc *start_dp = > + txr[desc_idx].tx_packed_indir; Ditto. > + vring_desc_init_indirect_packed(start_dp, > + RTE_DIM(txr[desc_idx].tx_packed_indir)); > + start_dp->addr = txvq->virtio_net_hdr_mem > + + desc_idx * sizeof(*txr) > + + offsetof(struct virtio_tx_region, > + tx_hdr); > + start_dp->len = vq->hw->vtnet_hdr_size; > + > } > > vring_desc_init_packed(vq, size); > Thanks, Maxime
Hi Maxime, > -----Original Message----- > From: Maxime Coquelin <maxime.coquelin@redhat.com> > Sent: Thursday, September 23, 2021 4:16 PM > To: Ding, Xuan <xuan.ding@intel.com>; Xia, Chenbo <chenbo.xia@intel.com> > Cc: dev@dpdk.org; Hu, Jiayu <jiayu.hu@intel.com>; Wang, Yinan > <yinan.wang@intel.com>; stable@dpdk.org; Liu, Yong <yong.liu@intel.com> > Subject: Re: [PATCH] net/virtio: fix indirect descriptors reconnection > > Hi Xuan, > > On 8/19/21 07:35, Xuan Ding wrote: > > Since packed indirect descriptors are added and initialized when > > initializing vring, the reconnection path also needs to be considered. > > > > Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup") > > Cc: stable@dpdk.org > > Cc: yong.liu@intel.com > > > > Signed-off-by: Xuan Ding <xuan.ding@intel.com> > > --- > > drivers/net/virtio/virtqueue.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c > > index 1f9af3c31b..47229f35c4 100644 > > --- a/drivers/net/virtio/virtqueue.c > > +++ b/drivers/net/virtio/virtqueue.c > > @@ -208,6 +208,20 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) > > rte_pktmbuf_free(dxp->cookie); > > dxp->cookie = NULL; > > } > > It makes me think we might save quite some bytes by not allocating > indirect descriptors when feature is not negotiated, but it might have > a cost in term of performance. Do you mean we allocate the indirect descriptors after checking the indirect feature in virtio TX queue, instead of allocating it at initialization? If so, that makes sense, and hence we don't to initialize it in two places. > > > + > > + struct virtio_tx_region *txr; > > Don't mix declarations within code. > > > + txr = txvq->virtio_net_hdr_mz->addr; > > + /* first indirect descriptor is always the tx header */ > > + struct vring_packed_desc *start_dp = > > + txr[desc_idx].tx_packed_indir; > > Ditto. Thanks, will update in next version. Regards, Xuan > > > + vring_desc_init_indirect_packed(start_dp, > > + RTE_DIM(txr[desc_idx].tx_packed_indir)); > > + start_dp->addr = txvq->virtio_net_hdr_mem > > + + desc_idx * sizeof(*txr) > > + + offsetof(struct virtio_tx_region, > > + tx_hdr); > > + start_dp->len = vq->hw->vtnet_hdr_size; > > + > > } > > > > vring_desc_init_packed(vq, size); > > > > Thanks, > Maxime
Hi Maxime, > -----Original Message----- > From: Ding, Xuan > Sent: Thursday, September 23, 2021 4:36 PM > To: Maxime Coquelin <maxime.coquelin@redhat.com>; Xia, Chenbo > <Chenbo.Xia@intel.com> > Cc: dev@dpdk.org; Hu, Jiayu <Jiayu.Hu@intel.com>; Wang, Yinan > <yinan.wang@intel.com>; stable@dpdk.org; Liu, Yong <yong.liu@intel.com> > Subject: RE: [PATCH] net/virtio: fix indirect descriptors reconnection > > Hi Maxime, > > > -----Original Message----- > > From: Maxime Coquelin <maxime.coquelin@redhat.com> > > Sent: Thursday, September 23, 2021 4:16 PM > > To: Ding, Xuan <xuan.ding@intel.com>; Xia, Chenbo <chenbo.xia@intel.com> > > Cc: dev@dpdk.org; Hu, Jiayu <jiayu.hu@intel.com>; Wang, Yinan > > <yinan.wang@intel.com>; stable@dpdk.org; Liu, Yong <yong.liu@intel.com> > > Subject: Re: [PATCH] net/virtio: fix indirect descriptors reconnection > > > > Hi Xuan, > > > > On 8/19/21 07:35, Xuan Ding wrote: > > > Since packed indirect descriptors are added and initialized when > > > initializing vring, the reconnection path also needs to be considered. > > > > > > Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup") > > > Cc: stable@dpdk.org > > > Cc: yong.liu@intel.com > > > > > > Signed-off-by: Xuan Ding <xuan.ding@intel.com> > > > --- > > > drivers/net/virtio/virtqueue.c | 14 ++++++++++++++ > > > 1 file changed, 14 insertions(+) > > > > > > diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c > > > index 1f9af3c31b..47229f35c4 100644 > > > --- a/drivers/net/virtio/virtqueue.c > > > +++ b/drivers/net/virtio/virtqueue.c > > > @@ -208,6 +208,20 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) > > > rte_pktmbuf_free(dxp->cookie); > > > dxp->cookie = NULL; > > > } > > > > It makes me think we might save quite some bytes by not allocating > > indirect descriptors when feature is not negotiated, but it might have > > a cost in term of performance. > > Do you mean we allocate the indirect descriptors after checking the indirect > feature in virtio TX queue, > instead of allocating it at initialization? > If so, that makes sense, and hence we don't to initialize it in two places. Sorry for replying myself, as for performance, I can have a try and test the impact on performance. Thanks, Xuan > > > > > > + > > > + struct virtio_tx_region *txr; > > > > Don't mix declarations within code. > > > > > + txr = txvq->virtio_net_hdr_mz->addr; > > > + /* first indirect descriptor is always the tx header */ > > > + struct vring_packed_desc *start_dp = > > > + txr[desc_idx].tx_packed_indir; > > > > Ditto. > > Thanks, will update in next version. > > Regards, > Xuan > > > > > > + vring_desc_init_indirect_packed(start_dp, > > > + RTE_DIM(txr[desc_idx].tx_packed_indir)); > > > + start_dp->addr = txvq->virtio_net_hdr_mem > > > + + desc_idx * sizeof(*txr) > > > + + offsetof(struct virtio_tx_region, > > > + tx_hdr); > > > + start_dp->len = vq->hw->vtnet_hdr_size; > > > + > > > } > > > > > > vring_desc_init_packed(vq, size); > > > > > > > Thanks, > > Maxime
On 9/23/21 11:21, Ding, Xuan wrote: > Hi Maxime, > >> -----Original Message----- >> From: Ding, Xuan >> Sent: Thursday, September 23, 2021 4:36 PM >> To: Maxime Coquelin <maxime.coquelin@redhat.com>; Xia, Chenbo >> <Chenbo.Xia@intel.com> >> Cc: dev@dpdk.org; Hu, Jiayu <Jiayu.Hu@intel.com>; Wang, Yinan >> <yinan.wang@intel.com>; stable@dpdk.org; Liu, Yong <yong.liu@intel.com> >> Subject: RE: [PATCH] net/virtio: fix indirect descriptors reconnection >> >> Hi Maxime, >> >>> -----Original Message----- >>> From: Maxime Coquelin <maxime.coquelin@redhat.com> >>> Sent: Thursday, September 23, 2021 4:16 PM >>> To: Ding, Xuan <xuan.ding@intel.com>; Xia, Chenbo <chenbo.xia@intel.com> >>> Cc: dev@dpdk.org; Hu, Jiayu <jiayu.hu@intel.com>; Wang, Yinan >>> <yinan.wang@intel.com>; stable@dpdk.org; Liu, Yong <yong.liu@intel.com> >>> Subject: Re: [PATCH] net/virtio: fix indirect descriptors reconnection >>> >>> Hi Xuan, >>> >>> On 8/19/21 07:35, Xuan Ding wrote: >>>> Since packed indirect descriptors are added and initialized when >>>> initializing vring, the reconnection path also needs to be considered. >>>> >>>> Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup") >>>> Cc: stable@dpdk.org >>>> Cc: yong.liu@intel.com >>>> >>>> Signed-off-by: Xuan Ding <xuan.ding@intel.com> >>>> --- >>>> drivers/net/virtio/virtqueue.c | 14 ++++++++++++++ >>>> 1 file changed, 14 insertions(+) >>>> >>>> diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c >>>> index 1f9af3c31b..47229f35c4 100644 >>>> --- a/drivers/net/virtio/virtqueue.c >>>> +++ b/drivers/net/virtio/virtqueue.c >>>> @@ -208,6 +208,20 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) >>>> rte_pktmbuf_free(dxp->cookie); >>>> dxp->cookie = NULL; >>>> } >>> >>> It makes me think we might save quite some bytes by not allocating >>> indirect descriptors when feature is not negotiated, but it might have >>> a cost in term of performance. >> >> Do you mean we allocate the indirect descriptors after checking the indirect >> feature in virtio TX queue, >> instead of allocating it at initialization? >> If so, that makes sense, and hence we don't to initialize it in two places. > > Sorry for replying myself, as for performance, I can have a try and test the > impact on performance. Thanks for looking at this, but maybe that could be done later, after having the fix merged first if you don't have the bandwidth? Maxime > Thanks, > Xuan > >> >>> >>>> + >>>> + struct virtio_tx_region *txr; >>> >>> Don't mix declarations within code. >>> >>>> + txr = txvq->virtio_net_hdr_mz->addr; >>>> + /* first indirect descriptor is always the tx header */ >>>> + struct vring_packed_desc *start_dp = >>>> + txr[desc_idx].tx_packed_indir; >>> >>> Ditto. >> >> Thanks, will update in next version. >> >> Regards, >> Xuan >> >>> >>>> + vring_desc_init_indirect_packed(start_dp, >>>> + RTE_DIM(txr[desc_idx].tx_packed_indir)); >>>> + start_dp->addr = txvq->virtio_net_hdr_mem >>>> + + desc_idx * sizeof(*txr) >>>> + + offsetof(struct virtio_tx_region, >>>> + tx_hdr); >>>> + start_dp->len = vq->hw->vtnet_hdr_size; >>>> + >>>> } >>>> >>>> vring_desc_init_packed(vq, size); >>>> >>> >>> Thanks, >>> Maxime >
Tested-by: Yinan Wang <yinan.wang@intel.com>
> -----Original Message-----
> From: Ding, Xuan <xuan.ding@intel.com>
> Sent: 2021?8?19? 13:35
> To: maxime.coquelin@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>
> Cc: dev@dpdk.org; Hu, Jiayu <jiayu.hu@intel.com>; Wang, Yinan
> <yinan.wang@intel.com>; Ding, Xuan <xuan.ding@intel.com>;
> stable@dpdk.org; Liu, Yong <yong.liu@intel.com>
> Subject: [PATCH] net/virtio: fix indirect descriptors reconnection
>
> Since packed indirect descriptors are added and initialized when
> initializing vring, the reconnection path also needs to be considered.
>
> Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup")
> Cc: stable@dpdk.org
> Cc: yong.liu@intel.com
>
> Signed-off-by: Xuan Ding <xuan.ding@intel.com>
Add initialization for packed ring indirect descriptors in reconnection path. Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup") Cc: stable@dpdk.org Cc: yong.liu@intel.com Signed-off-by: Xuan Ding <xuan.ding@intel.com> Tested-by: Yinan Wang <yinan.wang@intel.com> --- v2: * Fix the position of some declarations. --- drivers/net/virtio/virtqueue.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index 1f9af3c31b..65bf792eb0 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -186,6 +186,8 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) struct vq_desc_extra *dxp; struct virtnet_tx *txvq; uint16_t desc_idx; + struct virtio_tx_region *txr; + struct vring_packed_desc *start_dp; vq->vq_used_cons_idx = 0; vq->vq_desc_head_idx = 0; @@ -198,6 +200,7 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) vq->vq_packed.event_flags_shadow = 0; txvq = &vq->txq; + txr = txvq->virtio_net_hdr_mz->addr; memset(txvq->mz->addr, 0, txvq->mz->len); memset(txvq->virtio_net_hdr_mz->addr, 0, txvq->virtio_net_hdr_mz->len); @@ -208,6 +211,17 @@ virtqueue_txvq_reset_packed(struct virtqueue *vq) rte_pktmbuf_free(dxp->cookie); dxp->cookie = NULL; } + + if (virtio_with_feature(vq->hw, VIRTIO_RING_F_INDIRECT_DESC)) { + /* first indirect descriptor is always the tx header */ + start_dp = txr[desc_idx].tx_packed_indir; + vring_desc_init_indirect_packed(start_dp, + RTE_DIM(txr[desc_idx].tx_packed_indir)); + start_dp->addr = txvq->virtio_net_hdr_mem + + desc_idx * sizeof(*txr) + + offsetof(struct virtio_tx_region, tx_hdr); + start_dp->len = vq->hw->vtnet_hdr_size; + } } vring_desc_init_packed(vq, size); -- 2.17.1
On 10/13/21 03:36, Xuan Ding wrote:
> Add initialization for packed ring indirect descriptors
> in reconnection path.
>
> Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup")
> Cc: stable@dpdk.org
> Cc: yong.liu@intel.com
>
> Signed-off-by: Xuan Ding <xuan.ding@intel.com>
> Tested-by: Yinan Wang <yinan.wang@intel.com>
> ---
>
> v2:
> * Fix the position of some declarations.
> ---
> drivers/net/virtio/virtqueue.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Thanks!
Maxime
On 10/13/21 03:36, Xuan Ding wrote:
> Add initialization for packed ring indirect descriptors
> in reconnection path.
>
> Fixes: 381f39ebb78a ("net/virtio: fix packed ring indirect descricptors setup")
> Cc: stable@dpdk.org
> Cc: yong.liu@intel.com
>
> Signed-off-by: Xuan Ding <xuan.ding@intel.com>
> Tested-by: Yinan Wang <yinan.wang@intel.com>
> ---
>
> v2:
> * Fix the position of some declarations.
> ---
> drivers/net/virtio/virtqueue.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
Applied to dpdk-next-virtio/main.
Thanks,
Maxime