virtio设备中断分析

本文深入探讨了virtio设备的中断处理,包括change中断和vq中断的处理方式,如共用中断irq、使用msix中断的不同策略,并详细解析了如何分配和设置中断处理函数。
摘要由CSDN通过智能技术生成

1.中断两任务:
1).当设备的配置信息发生改变(config changed),会产生一个中断(称为change中断),中断处理程序需要调用相应的处理函数(需要驱动定义)。
2).当设备向队列中写入信息时,会产生一个中断(称为vq中断),中断处理函数需要调用相应的队列的回调函数(需要驱动定义)。

2.三种中断处理方式:
1).不用msix中断,则change中断和所有vq中断共用一个中断irq。
 中断处理函数:vp_interrupt。
 vp_interrupt函数中包含了对change中断和vq中断的处理。

2).使用msix中断,但只有2个vector,一个用来对应change中断,一个对应所有队列的vq中断。
 change中断处理函数:vp_config_changed
 vq中断处理函数:vp_vring_interrupt
3).使用msix中断,有n+1个vector,一个用来对应change中断,n个分别对应n个队列的vq中断。每个vq一个vector。
 change中断处理函数:vp_config_changed
 vq中断处理函数:vring_interrupt

static int vp_try_to_find_vqs(struct virtio_device *vdev, unsigned nvqs,
         struct virtqueue *vqs[],
         vq_callback_t *callbacks[],
         const char *names[],
         bool use_msix,
         bool per_vq_vectors)
{
 struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 u16 msix_vec;
 int i, err, nvectors, allocated_vectors;

 if (!use_msix) { /* 不用msix,所有vq共用一个irq */
  /* Old style: one normal interrupt for change and all vqs. */
  err = vp_request_intx(vdev);
  if (err)
   goto error_request;
 } else {
  if (per_vq_v

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值