| @@ -394,6 +394,7 @@ static int vfio_ccw_mdev_get_irq_info(struct vfio_irq_info *info) · 393 unmodified lines |
| 394 | 394 | switch (info->index) { |
| 395 | 395 | case VFIO_CCW_IO_IRQ_INDEX: |
| 396 | 396 | case VFIO_CCW_CRW_IRQ_INDEX: |
| 397 | + case VFIO_CCW_REQ_IRQ_INDEX: |
| 397 | 398 | info->count = 1; |
| 398 | 399 | info->flags = VFIO_IRQ_INFO_EVENTFD; |
| 399 | 400 | break; |
| @@ -424,6 +425,9 @@ static int vfio_ccw_mdev_set_irqs(struct mdev_device *mdev, · 24 unmodified lines |
| 424 | 425 | case VFIO_CCW_CRW_IRQ_INDEX: |
| 425 | 426 | ctx = &private->crw_trigger; |
| 426 | 427 | break; |
| 428 | + case VFIO_CCW_REQ_IRQ_INDEX: |
| 429 | + ctx = &private->req_trigger; |
| 430 | + break; |
| 427 | 431 | default: |
| 428 | 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 | 635 | static const struct mdev_parent_ops vfio_ccw_mdev_ops = { |
| 611 | 636 | .owner = THIS_MODULE, |
| 612 | 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 | 642 | .read = vfio_ccw_mdev_read, |
| 618 | 643 | .write = vfio_ccw_mdev_write, |
| 619 | 644 | .ioctl = vfio_ccw_mdev_ioctl, |
| 645 | + .request = vfio_ccw_mdev_request, |
| 620 | 646 | }; |
| 621 | 647 | |
| 622 | 648 | int vfio_ccw_mdev_reg(struct subchannel *sch) |