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