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

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

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值