| @@ -394,6 +394,7 @@ static int vfio_ccw_mdev_get_irq_info(struct vfio_irq_info *info) · 393 unmodified lines |
| 394 | switch (info->index) { | 394 | switch (info->index) { |
| 395 | case VFIO_CCW_IO_IRQ_INDEX: | 395 | case VFIO_CCW_IO_IRQ_INDEX: |
| 396 | case VFIO_CCW_CRW_IRQ_INDEX: | 396 | case VFIO_CCW_CRW_IRQ_INDEX: |
| | 397 | case VFIO_CCW_REQ_IRQ_INDEX: |
| 397 | info->count = 1; | 398 | info->count = 1; |
| 398 | info->flags = VFIO_IRQ_INFO_EVENTFD; | 399 | info->flags = VFIO_IRQ_INFO_EVENTFD; |
| 399 | break; | 400 | break; |
| @@ -424,6 +425,9 @@ static int vfio_ccw_mdev_set_irqs(struct mdev_device *mdev, · 24 unmodified lines |
| 424 | case VFIO_CCW_CRW_IRQ_INDEX: | 425 | case VFIO_CCW_CRW_IRQ_INDEX: |
| 425 | ctx = &private->crw_trigger; | 426 | ctx = &private->crw_trigger; |
| 426 | break; | 427 | break; |
| | 428 | case VFIO_CCW_REQ_IRQ_INDEX: |
| | 429 | ctx = &private->req_trigger; |
| | 430 | break; |
| 427 | default: | 431 | default: |
| 428 | return -EINVAL; | 432 | return -EINVAL; |
| 429 | } | 433 | } |
| @@ -607,6 +611,27 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, · 177 unmodified lines |
| 607 | } | 611 | } |
| 608 | } | 612 | } |
| 609 | | 613 | |
| | 614 | /* Request removal of the device*/ |
| | 615 | static void vfio_ccw_mdev_request(struct mdev_device *mdev, unsigned int count) |
| | 616 | { |
| | 617 | struct vfio_ccw_private *private = dev_get_drvdata(mdev_parent_dev(mdev)); |
| | 618 | |
| | 619 | if (!private) |
| | 620 | return; |
| | 621 | |
| | 622 | if (private->req_trigger) { |
| | 623 | if (!(count % 10)) |
| | 624 | dev_notice_ratelimited(mdev_dev(private->mdev), |
| | 625 | "Relaying device request to user (#%u)\n", |
| | 626 | count); |
| | 627 | |
| | 628 | eventfd_signal(private->req_trigger, 1); |
| | 629 | } else if (count == 0) { |
| | 630 | dev_notice(mdev_dev(private->mdev), |
| | 631 | "No device request channel registered, blocked until released by user\n"); |
| | 632 | } |
| | 633 | } |
| | 634 | |
| 610 | static const struct mdev_parent_ops vfio_ccw_mdev_ops = { | 635 | static const struct mdev_parent_ops vfio_ccw_mdev_ops = { |
| 611 | .owner = THIS_MODULE, | 636 | .owner = THIS_MODULE, |
| 612 | .supported_type_groups = mdev_type_groups, | 637 | .supported_type_groups = mdev_type_groups, |
| @@ -617,6 +642,7 @@ static const struct mdev_parent_ops vfio_ccw_mdev_ops = { · 4 unmodified lines |
| 617 | .read = vfio_ccw_mdev_read, | 642 | .read = vfio_ccw_mdev_read, |
| 618 | .write = vfio_ccw_mdev_write, | 643 | .write = vfio_ccw_mdev_write, |
| 619 | .ioctl = vfio_ccw_mdev_ioctl, | 644 | .ioctl = vfio_ccw_mdev_ioctl, |
| | 645 | .request = vfio_ccw_mdev_request, |
| 620 | }; | 646 | }; |
| 621 | | 647 | |
| 622 | int vfio_ccw_mdev_reg(struct subchannel *sch) | 648 | int vfio_ccw_mdev_reg(struct subchannel *sch) |