Skip to content

Commit

Permalink
net/virtio: remove address width limit for modern devices
Browse files Browse the repository at this point in the history
[ upstream commit 8b76b3a0d327f6bedc1343149e03619337ab0408 ]

Modern devices don't have the same limitation as legacy devices, because
vring addresses are not configured using a 32-bit register.

Fixes: 6ba1f63 ("virtio: support specification 1.0")

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Andy Pei <andy.pei@intel.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
  • Loading branch information
david-marchand authored and kevintraynor committed Mar 21, 2023
1 parent 1585556 commit f5922d3
Showing 1 changed file with 8 additions and 20 deletions.
28 changes: 8 additions & 20 deletions drivers/net/virtio/virtio_pci.c
Expand Up @@ -33,22 +33,6 @@

struct virtio_pci_internal virtio_pci_internal[RTE_MAX_ETHPORTS];

static inline int
check_vq_phys_addr_ok(struct virtqueue *vq)
{
/* Virtio PCI device VIRTIO_PCI_QUEUE_PF register is 32bit,
* and only accepts 32 bit page frame number.
* Check if the allocated physical memory exceeds 16TB.
*/
if ((vq->vq_ring_mem + vq->vq_ring_size - 1) >>
(VIRTIO_PCI_QUEUE_ADDR_SHIFT + 32)) {
PMD_INIT_LOG(ERR, "vring address shouldn't be above 16TB!");
return 0;
}

return 1;
}

#define PCI_MSIX_ENABLE 0x8000

static enum virtio_msix_status
Expand Down Expand Up @@ -273,8 +257,15 @@ legacy_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)
{
uint32_t src;

if (!check_vq_phys_addr_ok(vq))
/* Virtio PCI device VIRTIO_PCI_QUEUE_PFN register is 32bit,
* and only accepts 32 bit page frame number.
* Check if the allocated physical memory exceeds 16TB.
*/
if ((vq->vq_ring_mem + vq->vq_ring_size - 1) >>
(VIRTIO_PCI_QUEUE_ADDR_SHIFT + 32)) {
PMD_INIT_LOG(ERR, "vring address shouldn't be above 16TB!");
return -1;
}

rte_pci_ioport_write(VTPCI_IO(hw), &vq->vq_queue_index, 2,
VIRTIO_PCI_QUEUE_SEL);
Expand Down Expand Up @@ -476,9 +467,6 @@ modern_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)
uint64_t desc_addr, avail_addr, used_addr;
uint16_t notify_off;

if (!check_vq_phys_addr_ok(vq))
return -1;

desc_addr = vq->vq_ring_mem;
avail_addr = desc_addr + vq->vq_nentries * sizeof(struct vring_desc);
used_addr = RTE_ALIGN_CEIL(avail_addr + offsetof(struct vring_avail,
Expand Down

0 comments on commit f5922d3

Please sign in to comment.