net/virtio: add Rx interrupt enable/disable functions
This patch implements interrupt enable/disable functions for each Rx queue. And we rely on flags of avail queue as the hint for virtio device to interrupt virtio driver or not. Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com> Tested-by: Lei Yao <lei.a.yao@intel.com> Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
This commit is contained in:
parent
c49526acec
commit
c056be239d
@ -717,6 +717,26 @@ virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
virtio_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
|
||||
{
|
||||
struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
|
||||
struct virtqueue *vq = rxvq->vq;
|
||||
|
||||
virtqueue_enable_intr(vq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
|
||||
{
|
||||
struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
|
||||
struct virtqueue *vq = rxvq->vq;
|
||||
|
||||
virtqueue_disable_intr(vq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* dev_ops for virtio, bare necessities for basic operation
|
||||
*/
|
||||
@ -738,6 +758,8 @@ static const struct eth_dev_ops virtio_eth_dev_ops = {
|
||||
.xstats_reset = virtio_dev_stats_reset,
|
||||
.link_update = virtio_dev_link_update,
|
||||
.rx_queue_setup = virtio_dev_rx_queue_setup,
|
||||
.rx_queue_intr_enable = virtio_dev_rx_queue_intr_enable,
|
||||
.rx_queue_intr_disable = virtio_dev_rx_queue_intr_disable,
|
||||
.rx_queue_release = virtio_dev_queue_release,
|
||||
.rx_descriptor_done = virtio_dev_rx_queue_done,
|
||||
.tx_queue_setup = virtio_dev_tx_queue_setup,
|
||||
|
@ -38,17 +38,6 @@
|
||||
#include "virtio_logs.h"
|
||||
#include "virtio_pci.h"
|
||||
|
||||
void
|
||||
virtqueue_disable_intr(struct virtqueue *vq)
|
||||
{
|
||||
/*
|
||||
* Set VRING_AVAIL_F_NO_INTERRUPT to hint host
|
||||
* not to interrupt when it consumes packets
|
||||
* Note: this is only considered a hint to the host
|
||||
*/
|
||||
vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Two types of mbuf to be cleaned:
|
||||
* 1) mbuf that has been consumed by backend but not used by virtio.
|
||||
|
@ -274,7 +274,21 @@ vring_desc_init(struct vring_desc *dp, uint16_t n)
|
||||
/**
|
||||
* Tell the backend not to interrupt us.
|
||||
*/
|
||||
void virtqueue_disable_intr(struct virtqueue *vq);
|
||||
static inline void
|
||||
virtqueue_disable_intr(struct virtqueue *vq)
|
||||
{
|
||||
vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tell the backend to interrupt us.
|
||||
*/
|
||||
static inline void
|
||||
virtqueue_enable_intr(struct virtqueue *vq)
|
||||
{
|
||||
vq->vq_ring.avail->flags &= (~VRING_AVAIL_F_NO_INTERRUPT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump virtqueue internal structures, for debug purpose only.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user