【Linux4.1.12源码分析】virtio_net之NAPI机制

原创 2016年11月24日 23:06:45

在虚拟化场景,中断的开销更大,所以要尽可能的少用中断,我们从中断处理函数开始看。

skb_recv_done函数

static void skb_recv_done(struct virtqueue *rvq)
{
	struct virtnet_info *vi = rvq->vdev->priv;
	struct receive_queue *rq = &vi->rq[vq2rxq(rvq)];

	/* Schedule NAPI, Suppress further interrupts if successful. */
	if (napi_schedule_prep(&rq->napi)) {
		virtqueue_disable_cb(rvq);	//关闭中断,vhost不会通知前端
		__napi_schedule(&rq->napi);	//注册napi,触发软中断
	}
}
触发软中断前,关闭vhost中断通知,此时通过poll机制收包。 收包软中断最终会调用napi定义的poll函数,virtio_net定义的是virtnet_poll函数。

virtnet_poll函数

static int virtnet_poll(struct napi_struct *napi, int budget)
{
	struct receive_queue *rq =
		container_of(napi, struct receive_queue, napi);
	unsigned int r, received;

	received = virtnet_receive(rq, budget);		//接收报文,并上送协议栈

	/* Out of packets? */
	if (received < budget) {				//接收报文小于budget,说明报文已经全部接收完成
		r = virtqueue_enable_cb_prepare(rq->vq);	//启动vhost触发中断,后端把报文发送到共享环后触发中断
		napi_complete(napi);				//napi处理完成
		if (unlikely(virtqueue_poll(rq->vq, r)) &&	//判断是否有报文,如果此时有报文则要准备注册napi
		    napi_schedule_prep(napi)) {
			virtqueue_disable_cb(rq->vq);		//关闭vhost触发中断
			__napi_schedule(napi);			//注册napi,并触发软中断,后续可以继续收包
		}
	}

	return received;	//如果接收报文数超过budget,则主动退出,等到下一次软中处理时再收包
}
如果报文接收完成,会重新开启中断;否则处理完budget数量的报文后,让出CPU,等待下次处理软中断时再次接收报文。


关闭和开启中断的函数是通过设置共享环中的flag实现的:

virtqueue_disable_cb函数

void virtqueue_disable_cb(struct virtqueue *_vq)
{
	struct vring_virtqueue *vq = to_vvq(_vq);

	vq->vring.avail->flags |= cpu_to_virtio16(_vq->vdev, VRING_AVAIL_F_NO_INTERRUPT);   //关闭中断
}

virtqueue_enable_cb_prepare函数

unsigned virtqueue_enable_cb_prepare(struct virtqueue *_vq)
{
	struct vring_virtqueue *vq = to_vvq(_vq);
	u16 last_used_idx;

	START_USE(vq);

	/* We optimistically turn back on interrupts, then check if there was
	 * more to do. */
	/* Depending on the VIRTIO_RING_F_EVENT_IDX feature, we need to
	 * either clear the flags bit or point the event index at the next
	 * entry. Always do both to keep code simple. */
	vq->vring.avail->flags &= cpu_to_virtio16(_vq->vdev, ~VRING_AVAIL_F_NO_INTERRUPT);	//该标记位置0,开启中断
	vring_used_event(&vq->vring) = cpu_to_virtio16(_vq->vdev, last_used_idx = vq->last_used_idx);
	END_USE(vq);
	return last_used_idx;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Linux4.1.12源码分析】二层报文发送之net_tx_action

net_tx_action函数报文发送软中断处理函数,本篇不分析软中断注册过程,只分析该函数的处理过程。 产生发包软中断最常见的场景是:1)报文发送PPS很高;2)网络qos限制。 1、net_tx...
  • one_clouder
  • one_clouder
  • 2016年10月15日 10:20
  • 821

谈谈NAPI机制

引入问题 内核收包主要有两种手段:轮询和中断。 通过轮询,内核可以不断持续的检查设备时候有包收上来,例如设置一个定时器,定期检查设备上的某个定时器。这种方法会轻易浪费掉很多系统资源。 如果采用中断收包...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2015年03月04日 22:11
  • 1759

【Linux4.1.12源码分析】收包软中断和NAPI

不讲概念,直接上收包软中断处理代码。  net_rx_action函数 static void net_rx_action(struct softirq_action *h) { struc...
  • one_clouder
  • one_clouder
  • 2016年11月19日 07:28
  • 1077

NAPI机制分析

NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 8...
  • shanshanpt
  • shanshanpt
  • 2014年03月05日 19:42
  • 1684

NAPI机制分析

NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 8...
  • csdidi
  • csdidi
  • 2016年10月19日 10:11
  • 121

NAPI机制分析

NAPI机制分析 NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 ...
  • anhuidelinger
  • anhuidelinger
  • 2013年08月29日 19:12
  • 442

NAPI机制分析

NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 8...
  • vc66vcc
  • vc66vcc
  • 2017年03月09日 18:20
  • 112

NAPI之(二)——机制分析

NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 8...
  • hejin_some
  • hejin_some
  • 2017年05月25日 10:03
  • 108

NAPI机制分析

NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 8...
  • ljxkey
  • ljxkey
  • 2013年03月28日 00:54
  • 295

NAPI机制分析

http://hi.baidu.com/eli_li/item/6d698232847da4fedf2221ee NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中...
  • chengfangang
  • chengfangang
  • 2013年04月23日 17:29
  • 727
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Linux4.1.12源码分析】virtio_net之NAPI机制
举报原因:
原因补充:

(最多只允许输入30个字)