> -----Original Message-----
> From: Maxime Coquelin <maxime.coque...@redhat.com>
> Sent: Friday, March 31, 2023 11:43 PM
> To: dev@dpdk.org; david.march...@redhat.com; Xia, Chenbo
> <chenbo....@intel.com>; m...@redhat.com; f...@redhat.com;
> jasow...@redhat.com; Liang, Cunming <cunming.li...@intel.com>; Xie, Yongji
> <xieyon...@bytedance.com>; echau...@redhat.com; epere...@redhat.com;
> amore...@redhat.com
> Cc: Maxime Coquelin <maxime.coque...@redhat.com>; sta...@dpdk.org
> Subject: [RFC 02/27] vhost: fix invalid call FD handling
> 
> This patch fixes cases where IRQ injection is tried while
> the call FD is not valid, which should not happen.
> 
> Fixes: b1cce26af1dc ("vhost: add notification for packed ring")
> Fixes: e37ff954405a ("vhost: support virtqueue interrupt/notification
> suppression")
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
> ---
>  lib/vhost/vhost.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h
> index 8554ab4002..40863f7bfd 100644
> --- a/lib/vhost/vhost.h
> +++ b/lib/vhost/vhost.h
> @@ -902,9 +902,9 @@ vhost_vring_call_split(struct virtio_net *dev, struct
> vhost_virtqueue *vq)
>                       "%s: used_event_idx=%d, old=%d, new=%d\n",
>                       __func__, vhost_used_event(vq), old, new);
> 
> -             if ((vhost_need_event(vhost_used_event(vq), new, old) &&
> -                                     (vq->callfd >= 0)) ||
> -                             unlikely(!signalled_used_valid)) {
> +             if ((vhost_need_event(vhost_used_event(vq), new, old) ||
> +                                     unlikely(!signalled_used_valid)) &&
> +                             vq->callfd >= 0) {
>                       eventfd_write(vq->callfd, (eventfd_t) 1);
>                       if (dev->flags & VIRTIO_DEV_STATS_ENABLED)
>                               vq->stats.guest_notifications++;
> @@ -971,7 +971,7 @@ vhost_vring_call_packed(struct virtio_net *dev, struct
> vhost_virtqueue *vq)
>       if (vhost_need_event(off, new, old))
>               kick = true;
>  kick:
> -     if (kick) {
> +     if (kick && vq->callfd >= 0) {
>               eventfd_write(vq->callfd, (eventfd_t)1);
>               if (dev->flags & VIRTIO_DEV_STATS_ENABLED)
>                       vq->stats.guest_notifications++;
> --
> 2.39.2

Reviewed-by: Chenbo Xia <chenbo....@intel.com>

Reply via email to