Message ID | 8b9b42cf2b18feb41c4b64a174ccc154847c59f9.1617789236.git.bnemeth@redhat.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Maxime Coquelin |
Headers | show |
Series | [v3] vhost: read last used index once | expand |
Context | Check | Description |
---|---|---|
ci/iol-testing | success | Testing PASS |
ci/iol-abi-testing | success | Testing PASS |
ci/intel-Testing | success | Testing PASS |
ci/iol-mellanox-Performance | success | Performance Testing PASS |
ci/iol-intel-Performance | success | Performance Testing PASS |
ci/github-robot | success | github build: passed |
ci/travis-robot | success | travis build: passed |
ci/Intel-compilation | success | Compilation OK |
ci/checkpatch | success | coding style OK |
On 4/7/21 11:55 AM, Balazs Nemeth wrote: > Instead of calculating the address of a packed descriptor based on the > vq->desc_packed and vq->last_used_idx every time, store that base > address in desc_base. On arm, this saves 176 bytes in code size of > function in which vhost_flush_enqueue_batch_packed gets inlined. > > Signed-off-by: Balazs Nemeth <bnemeth@redhat.com> > --- > lib/librte_vhost/virtio_net.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c > index 179c57b46..f091384a6 100644 > --- a/lib/librte_vhost/virtio_net.c > +++ b/lib/librte_vhost/virtio_net.c > @@ -217,6 +217,8 @@ vhost_flush_enqueue_batch_packed(struct virtio_net *dev, > { > uint16_t i; > uint16_t flags; > + uint16_t last_used_idx = vq->last_used_idx; > + struct vring_packed_desc *desc_base = &vq->desc_packed[last_used_idx]; > > if (vq->shadow_used_idx) { > do_data_copy_enqueue(dev, vq); > @@ -226,16 +228,17 @@ vhost_flush_enqueue_batch_packed(struct virtio_net *dev, > flags = PACKED_DESC_ENQUEUE_USED_FLAG(vq->used_wrap_counter); > > vhost_for_each_try_unroll(i, 0, PACKED_BATCH_SIZE) { > - vq->desc_packed[vq->last_used_idx + i].id = ids[i]; > - vq->desc_packed[vq->last_used_idx + i].len = lens[i]; > + desc_base[i].id = ids[i]; > + desc_base[i].len = lens[i]; > } > > rte_atomic_thread_fence(__ATOMIC_RELEASE); > > - vhost_for_each_try_unroll(i, 0, PACKED_BATCH_SIZE) > - vq->desc_packed[vq->last_used_idx + i].flags = flags; > + vhost_for_each_try_unroll(i, 0, PACKED_BATCH_SIZE) { > + desc_base[i].flags = flags; > + } > > - vhost_log_cache_used_vring(dev, vq, vq->last_used_idx * > + vhost_log_cache_used_vring(dev, vq, last_used_idx * > sizeof(struct vring_packed_desc), > sizeof(struct vring_packed_desc) * > PACKED_BATCH_SIZE); > Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Thanks, Maxime
diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c index 179c57b46..f091384a6 100644 --- a/lib/librte_vhost/virtio_net.c +++ b/lib/librte_vhost/virtio_net.c @@ -217,6 +217,8 @@ vhost_flush_enqueue_batch_packed(struct virtio_net *dev, { uint16_t i; uint16_t flags; + uint16_t last_used_idx = vq->last_used_idx; + struct vring_packed_desc *desc_base = &vq->desc_packed[last_used_idx]; if (vq->shadow_used_idx) { do_data_copy_enqueue(dev, vq); @@ -226,16 +228,17 @@ vhost_flush_enqueue_batch_packed(struct virtio_net *dev, flags = PACKED_DESC_ENQUEUE_USED_FLAG(vq->used_wrap_counter); vhost_for_each_try_unroll(i, 0, PACKED_BATCH_SIZE) { - vq->desc_packed[vq->last_used_idx + i].id = ids[i]; - vq->desc_packed[vq->last_used_idx + i].len = lens[i]; + desc_base[i].id = ids[i]; + desc_base[i].len = lens[i]; } rte_atomic_thread_fence(__ATOMIC_RELEASE); - vhost_for_each_try_unroll(i, 0, PACKED_BATCH_SIZE) - vq->desc_packed[vq->last_used_idx + i].flags = flags; + vhost_for_each_try_unroll(i, 0, PACKED_BATCH_SIZE) { + desc_base[i].flags = flags; + } - vhost_log_cache_used_vring(dev, vq, vq->last_used_idx * + vhost_log_cache_used_vring(dev, vq, last_used_idx * sizeof(struct vring_packed_desc), sizeof(struct vring_packed_desc) * PACKED_BATCH_SIZE);
Instead of calculating the address of a packed descriptor based on the vq->desc_packed and vq->last_used_idx every time, store that base address in desc_base. On arm, this saves 176 bytes in code size of function in which vhost_flush_enqueue_batch_packed gets inlined. Signed-off-by: Balazs Nemeth <bnemeth@redhat.com> --- lib/librte_vhost/virtio_net.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)