This patch removes the simplification in Virtio descriptors handling, where their buffer addresses are IOVAs for Virtio PCI devices, and VA-only for Virtio-user devices, which added a requirement on Virtio-user that it only supported IOVA as VA. This change introduced a regression for applications using Virtio-user and other physical PMDs that require IOVA as PA because they don't use an IOMMU. This patch reverts to the old behaviour, but needed to be reworked because of the refactoring that happened in v21.02. Fixes: 17043a2909bb ("net/virtio: force IOVA as VA mode for virtio-user") Cc: stable@dpdk.org Reported-by: Olivier Matz <olivier.matz@6wind.com> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> Tested-by: Olivier Matz <olivier.matz@6wind.com> Reviewed-by: David Marchand <david.marchand@redhat.com>
58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2016 Intel Corporation
|
|
*/
|
|
|
|
#ifndef _VIRTIO_RXTX_SIMPLE_H_
|
|
#define _VIRTIO_RXTX_SIMPLE_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "virtio_logs.h"
|
|
#include "virtio_ethdev.h"
|
|
#include "virtqueue.h"
|
|
#include "virtio_rxtx.h"
|
|
|
|
#define RTE_VIRTIO_VPMD_RX_BURST 32
|
|
#define RTE_VIRTIO_VPMD_RX_REARM_THRESH RTE_VIRTIO_VPMD_RX_BURST
|
|
|
|
static inline void
|
|
virtio_rxq_rearm_vec(struct virtnet_rx *rxvq)
|
|
{
|
|
int i;
|
|
uint16_t desc_idx;
|
|
struct rte_mbuf **sw_ring;
|
|
struct vring_desc *start_dp;
|
|
int ret;
|
|
struct virtqueue *vq = virtnet_rxq_to_vq(rxvq);
|
|
|
|
desc_idx = vq->vq_avail_idx & (vq->vq_nentries - 1);
|
|
sw_ring = &vq->sw_ring[desc_idx];
|
|
start_dp = &vq->vq_split.ring.desc[desc_idx];
|
|
|
|
ret = rte_mempool_get_bulk(rxvq->mpool, (void **)sw_ring,
|
|
RTE_VIRTIO_VPMD_RX_REARM_THRESH);
|
|
if (unlikely(ret)) {
|
|
rte_eth_devices[rxvq->port_id].data->rx_mbuf_alloc_failed +=
|
|
RTE_VIRTIO_VPMD_RX_REARM_THRESH;
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < RTE_VIRTIO_VPMD_RX_REARM_THRESH; i++) {
|
|
uintptr_t p;
|
|
|
|
p = (uintptr_t)&sw_ring[i]->rearm_data;
|
|
*(uint64_t *)p = rxvq->mbuf_initializer;
|
|
|
|
start_dp[i].addr = VIRTIO_MBUF_ADDR(sw_ring[i], vq) +
|
|
RTE_PKTMBUF_HEADROOM - vq->hw->vtnet_hdr_size;
|
|
start_dp[i].len = sw_ring[i]->buf_len -
|
|
RTE_PKTMBUF_HEADROOM + vq->hw->vtnet_hdr_size;
|
|
}
|
|
|
|
vq->vq_avail_idx += RTE_VIRTIO_VPMD_RX_REARM_THRESH;
|
|
vq->vq_free_cnt -= RTE_VIRTIO_VPMD_RX_REARM_THRESH;
|
|
vq_update_avail_idx(vq);
|
|
}
|
|
|
|
#endif /* _VIRTIO_RXTX_SIMPLE_H_ */
|