On Tue, Dec 16, 2025 at 2:54 AM Wafer Xie <[email protected]> wrote: > > From: wafer Xie <[email protected]> > > This patch series adds support for VIRTIO split indirect descriptors. > The feature is VIRTIO_RING_F_INDIRECT_DESC. > > Eugenio hs submitted a patch: vhost: accept indirect descriptors in shadow > virtqueue > https://lists.nongnu.org/archive/html/qemu-devel/2025-12/msg00056.html > Therefore, this patch must be applied first. > > The current svq implementation can read the indirect descriptors provided by > the driver, > but it cannot use indirect descriptors when interacting with the backend > device. > However, if a backend device implements indirect descriptors and wants to use > QEMU > to validate its indirect descriptor support, > then QEMU needs to fully support indirect descriptors in this path. > This series is intended to provide that full support, > so that such backend devices can be properly tested and validated via QEMU. > > Multiple buffers are used to store indirect descriptors, and each buffer has > a size of ring.num * 4. > Each buffer has two states: FREED and FREEING. > > When adding elements to the virtio available ring, > descriptors can only be allocated from buffers in the FREED state. > If the current buffer does not have enough FREED descriptors, > its state is changed to FREEING, > and descriptors are then allocated from another buffer in the FREED state. > > When retrieving entries from the virtio used ring, > descriptors are returned to the buffer indicated > by the buffer index associated with the element. > If all descriptors in a buffer have been reclaimed, > the buffer’s state is changed back to FREED. > > > Performance (pps) was evaluated using testpmd, comparing three scenarios: > 1) fully indirect descriptors(apply this path series, indirect_desc=on) > guset<--------indirect desc-----SVQ-------indirect desc----->device > > > 2) hybrid mode with indirect plus chained descriptors(only apply > VIRTIO_RING_F_INDIRECT_DESC, indirect_desc=on) > guset<--------indirect desc-----SVQ-------chain desc----->device > > > 3) fully chained descriptor mode(don't apply any patch,indirect_desc=off). > guset<--------chain desc-----SVQ-------chain desc----->device > > > The results show that the fully indirect descriptor mode achieves > approximately 5%~10% higher performance than the indirect + chained > descriptor mode, > and approximately 12%~17% higher performance than the fully chained > descriptor mode. > >
Sounds very good! The series is aimed but I have a few comments on it, let me know what you think! > > The raw testpmd output is provided below. > > testpmd configuration: > 1) set txonly; set txpkts 2048,1024;set burst 8 > > fully indirect descriptors: > ######################## NIC statistics for port 0 ######################## > RX-packets: 256 RX-missed: 0 RX-bytes: 491520 > RX-errors: 0 > RX-nombuf: 0 > TX-packets: 74700761 TX-errors: 0 TX-bytes: 307543211008 > > Throughput (since last show) > Rx-pps: 0 Rx-bps: 0 > Tx-pps: 745609 Tx-bps: 18324096544 > ############################################################################ > > > hybrid mode with indirect plus chained descriptors > ######################## NIC statistics for port 0 ######################## > RX-packets: 256 RX-missed: 0 RX-bytes: 491520 > RX-errors: 0 > RX-nombuf: 0 > TX-packets: 44153053 TX-errors: 0 TX-bytes: 202580423680 > > Throughput (since last show) > Rx-pps: 0 Rx-bps: 0 > Tx-pps: 674954 Tx-bps: 16587671544 > ############################################################################ > > > > fully chained descriptor mode: > ######################## NIC statistics for port 0 ######################## > RX-packets: 256 RX-missed: 0 RX-bytes: 491520 > RX-errors: 0 > RX-nombuf: 0 > TX-packets: 48458913 TX-errors: 0 TX-bytes: 212695989248 > > Throughput (since last show) > Rx-pps: 0 Rx-bps: 0 > Tx-pps: 665493 Tx-bps: 16355164120 > ############################################################################ > > > 2) set txonly; set txpkts 2048,2048,1024;set burst 8 > > fully indirect descriptors: > ######################## NIC statistics for port 0 ######################## > RX-packets: 0 RX-missed: 0 RX-bytes: 0 > RX-errors: 0 > RX-nombuf: 0 > TX-packets: 18193774 TX-errors: 0 TX-bytes: 93152122880 > > Throughput (since last show) > Rx-pps: 0 Rx-bps: 0 > Tx-pps: 683537 Tx-bps: 27997687072 > ############################################################################ > > > > hybrid mode with indirect plus chained descriptors > ######################## NIC statistics for port 0 ######################## > RX-packets: 0 RX-missed: 0 RX-bytes: 0 > RX-errors: 0 > RX-nombuf: 0 > TX-packets: 18948021 TX-errors: 0 TX-bytes: 97013867520 > > Throughput (since last show) > Rx-pps: 0 Rx-bps: 0 > Tx-pps: 646147 Tx-bps: 26466218232 > ############################################################################ > > > > fully chained descriptor mode: > ######################## NIC statistics for port 0 ######################## > RX-packets: 0 RX-missed: 0 RX-bytes: 0 > RX-errors: 0 > RX-nombuf: 0 > TX-packets: 15944245 TX-errors: 0 TX-bytes: 81634534400 > > Throughput (since last show) > Rx-pps: 0 Rx-bps: 0 > Tx-pps: 583981 Tx-bps: 23919889848 > ############################################################################ > > ----- > Changes in v3: > -Fix code formatting issues > > Changes in v2: > -Use a static allocated buffer for the indirect descriptors > > > wafer Xie (4): > vhost: add data structure of virtio indirect descriptors in SVQ > vdpa: implement a statically allocated buffer for SVQ > vhost: SVQ get the indirect descriptors from used ring > vhost: SVQ add the indirect descriptors to available ring > > hw/virtio/vhost-shadow-virtqueue.c | 325 ++++++++++++++++++++++++++--- > hw/virtio/vhost-shadow-virtqueue.h | 46 ++++ > hw/virtio/vhost-vdpa.c | 163 ++++++++++++++- > 3 files changed, 507 insertions(+), 27 deletions(-) > > -- > 2.48.1 >
