Message ID | 20240306211445.1856768-8-alex.williamson@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: Interrupt eventfd hardening | expand |
Hi Alex,
kernel test robot noticed the following build warnings:
[auto build test WARNING on awilliam-vfio/next]
[also build test WARNING on linus/master v6.8-rc7 next-20240307]
[cannot apply to awilliam-vfio/for-linus]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Alex-Williamson/vfio-pci-Disable-auto-enable-of-exclusive-INTx-IRQ/20240307-051931
base: https://github.com/awilliam/linux-vfio.git next
patch link: https://lore.kernel.org/r/20240306211445.1856768-8-alex.williamson%40redhat.com
patch subject: [PATCH 7/7] vfio/fsl-mc: Block calling interrupt handler without trigger
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20240307/202403072356.jlxR3E5Q-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240307/202403072356.jlxR3E5Q-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202403072356.jlxR3E5Q-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c:111:11: warning: variable 'hwirq' set but not used [-Wunused-but-set-variable]
111 | int ret, hwirq;
| ^
1 warning generated.
vim +/hwirq +111 drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
cc0ee20bd96971 Diana Craciun 2020-10-05 104
2e0d29561f593a Diana Craciun 2020-10-05 105 static int vfio_fsl_mc_set_irq_trigger(struct vfio_fsl_mc_device *vdev,
2e0d29561f593a Diana Craciun 2020-10-05 106 unsigned int index, unsigned int start,
2e0d29561f593a Diana Craciun 2020-10-05 107 unsigned int count, u32 flags,
2e0d29561f593a Diana Craciun 2020-10-05 108 void *data)
2e0d29561f593a Diana Craciun 2020-10-05 109 {
cc0ee20bd96971 Diana Craciun 2020-10-05 110 struct fsl_mc_device *mc_dev = vdev->mc_dev;
cc0ee20bd96971 Diana Craciun 2020-10-05 @111 int ret, hwirq;
cc0ee20bd96971 Diana Craciun 2020-10-05 112 struct vfio_fsl_mc_irq *irq;
cc0ee20bd96971 Diana Craciun 2020-10-05 113 struct device *cont_dev = fsl_mc_cont_dev(&mc_dev->dev);
cc0ee20bd96971 Diana Craciun 2020-10-05 114 struct fsl_mc_device *mc_cont = to_fsl_mc_device(cont_dev);
cc0ee20bd96971 Diana Craciun 2020-10-05 115
159246378d8483 Diana Craciun 2020-10-15 116 if (!count && (flags & VFIO_IRQ_SET_DATA_NONE))
159246378d8483 Diana Craciun 2020-10-15 117 return vfio_set_trigger(vdev, index, -1);
159246378d8483 Diana Craciun 2020-10-15 118
cc0ee20bd96971 Diana Craciun 2020-10-05 119 if (start != 0 || count != 1)
2e0d29561f593a Diana Craciun 2020-10-05 120 return -EINVAL;
cc0ee20bd96971 Diana Craciun 2020-10-05 121
da119f387e9464 Jason Gunthorpe 2021-08-05 122 mutex_lock(&vdev->vdev.dev_set->lock);
cc0ee20bd96971 Diana Craciun 2020-10-05 123 ret = fsl_mc_populate_irq_pool(mc_cont,
cc0ee20bd96971 Diana Craciun 2020-10-05 124 FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS);
cc0ee20bd96971 Diana Craciun 2020-10-05 125 if (ret)
cc0ee20bd96971 Diana Craciun 2020-10-05 126 goto unlock;
cc0ee20bd96971 Diana Craciun 2020-10-05 127
cc0ee20bd96971 Diana Craciun 2020-10-05 128 ret = vfio_fsl_mc_irqs_allocate(vdev);
cc0ee20bd96971 Diana Craciun 2020-10-05 129 if (ret)
cc0ee20bd96971 Diana Craciun 2020-10-05 130 goto unlock;
da119f387e9464 Jason Gunthorpe 2021-08-05 131 mutex_unlock(&vdev->vdev.dev_set->lock);
cc0ee20bd96971 Diana Craciun 2020-10-05 132
cc0ee20bd96971 Diana Craciun 2020-10-05 133 if (flags & VFIO_IRQ_SET_DATA_EVENTFD) {
cc0ee20bd96971 Diana Craciun 2020-10-05 134 s32 fd = *(s32 *)data;
cc0ee20bd96971 Diana Craciun 2020-10-05 135
cc0ee20bd96971 Diana Craciun 2020-10-05 136 return vfio_set_trigger(vdev, index, fd);
cc0ee20bd96971 Diana Craciun 2020-10-05 137 }
cc0ee20bd96971 Diana Craciun 2020-10-05 138
d86a6d47bcc6b4 Thomas Gleixner 2021-12-10 139 hwirq = vdev->mc_dev->irqs[index]->virq;
cc0ee20bd96971 Diana Craciun 2020-10-05 140
cc0ee20bd96971 Diana Craciun 2020-10-05 141 irq = &vdev->mc_irqs[index];
cc0ee20bd96971 Diana Craciun 2020-10-05 142
cc0ee20bd96971 Diana Craciun 2020-10-05 143 if (flags & VFIO_IRQ_SET_DATA_NONE) {
dce72fdf5c6be9 Alex Williamson 2024-03-06 144 if (irq->trigger)
dce72fdf5c6be9 Alex Williamson 2024-03-06 145 eventfd_signal(irq->trigger);
cc0ee20bd96971 Diana Craciun 2020-10-05 146
cc0ee20bd96971 Diana Craciun 2020-10-05 147 } else if (flags & VFIO_IRQ_SET_DATA_BOOL) {
cc0ee20bd96971 Diana Craciun 2020-10-05 148 u8 trigger = *(u8 *)data;
cc0ee20bd96971 Diana Craciun 2020-10-05 149
dce72fdf5c6be9 Alex Williamson 2024-03-06 150 if (trigger && irq->trigger)
dce72fdf5c6be9 Alex Williamson 2024-03-06 151 eventfd_signal(irq->trigger);
cc0ee20bd96971 Diana Craciun 2020-10-05 152 }
cc0ee20bd96971 Diana Craciun 2020-10-05 153
cc0ee20bd96971 Diana Craciun 2020-10-05 154 return 0;
cc0ee20bd96971 Diana Craciun 2020-10-05 155
cc0ee20bd96971 Diana Craciun 2020-10-05 156 unlock:
da119f387e9464 Jason Gunthorpe 2021-08-05 157 mutex_unlock(&vdev->vdev.dev_set->lock);
cc0ee20bd96971 Diana Craciun 2020-10-05 158 return ret;
cc0ee20bd96971 Diana Craciun 2020-10-05 159
diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c index d62fbfff20b8..82b2afa9b7e3 100644 --- a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c @@ -141,13 +141,14 @@ static int vfio_fsl_mc_set_irq_trigger(struct vfio_fsl_mc_device *vdev, irq = &vdev->mc_irqs[index]; if (flags & VFIO_IRQ_SET_DATA_NONE) { - vfio_fsl_mc_irq_handler(hwirq, irq); + if (irq->trigger) + eventfd_signal(irq->trigger); } else if (flags & VFIO_IRQ_SET_DATA_BOOL) { u8 trigger = *(u8 *)data; - if (trigger) - vfio_fsl_mc_irq_handler(hwirq, irq); + if (trigger && irq->trigger) + eventfd_signal(irq->trigger); } return 0;
The eventfd_ctx trigger pointer of the vfio_fsl_mc_irq object is initially NULL and may become NULL if the user sets the trigger eventfd to -1. The interrupt handler itself is guaranteed that trigger is always valid between request_irq() and free_irq(), but the loopback testing mechanisms to invoke the handler function need to test the trigger. The triggering and setting ioctl paths both make use of igate and are therefore mutually exclusive. The vfio-fsl-mc driver does not make use of irqfds, nor does it support any sort of masking operations, therefore unlike vfio-pci and vfio-platform, the flow can remain essentially unchanged. Cc: Diana Craciun <diana.craciun@oss.nxp.com> Fixes: cc0ee20bd969 ("vfio/fsl-mc: trigger an interrupt via eventfd") Signed-off-by: Alex Williamson <alex.williamson@redhat.com> --- drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)