Re: [bug report] vhost_net: basic polling support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dan:

On Wed, Aug 11, 2021 at 8:14 PM Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote:
>
> Hello Jason Wang,
>
> The patch 030881372460: "vhost_net: basic polling support" from Mar
> 4, 2016, leads to the following
> Smatch static checker warning:
>
>         drivers/vhost/vhost.c:2565 vhost_new_msg()
>         warn: sleeping in atomic context
>
> vers/vhost/net.c
>    509  static void vhost_net_busy_poll(struct vhost_net *net,
>    510                                  struct vhost_virtqueue *rvq,
>    511                                  struct vhost_virtqueue *tvq,
>    512                                  bool *busyloop_intr,
>    513                                  bool poll_rx)
>    514  {
>    515          unsigned long busyloop_timeout;
>    516          unsigned long endtime;
>    517          struct socket *sock;
>    518          struct vhost_virtqueue *vq = poll_rx ? tvq : rvq;
>    519
>    520          /* Try to hold the vq mutex of the paired virtqueue. We can't
>    521           * use mutex_lock() here since we could not guarantee a
>    522           * consistenet lock ordering.
>    523           */
>    524          if (!mutex_trylock(&vq->mutex))
>    525                  return;
>    526
>    527          vhost_disable_notify(&net->dev, vq);
>    528          sock = vhost_vq_get_backend(rvq);
>    529
>    530          busyloop_timeout = poll_rx ? rvq->busyloop_timeout:
>    531                                       tvq->busyloop_timeout;
>    532
>    533          preempt_disable();
>                 ^^^^^^^^^^^^^^^^^
> This bumps the preemp_count.
>
> I guess this is to disable page faults?

No, it's intended since we will use busy_clock() which uses the per
cpu variable.

>
>    534          endtime = busy_clock() + busyloop_timeout;
>    535
>    536          while (vhost_can_busy_poll(endtime)) {
>    537                  if (vhost_has_work(&net->dev)) {
>    538                          *busyloop_intr = true;
>    539                          break;
>    540                  }
>    541
>    542                  if ((sock_has_rx_data(sock) &&
>    543                       !vhost_vq_avail_empty(&net->dev, rvq)) ||
>
> The call tree from here to the GFP_KERNEL is very long...
>
> vhost_vq_avail_empty()
> -> vhost_get_avail_idx()
>    -> __vhost_get_user()
>       -> __vhost_get_user_slow()
>          -> translate_desc()
>             -> vhost_iotlb_miss vhost_new_msg()  <-- GFP_KERNEL

This won't happen in reality since:

We will make sure the IOTLB contains the translation for avail idx.
See vq_meta_prefetch() that will be called at the begining of
handle_tx() and handle_rx().

So it looks like a false positive to me.

Thanks

>
>    544                      !vhost_vq_avail_empty(&net->dev, tvq))
>    545                          break;
>    546
>    547                  cpu_relax();
>    548          }
>    549
>    550          preempt_enable();
>    551
>    552          if (poll_rx || sock_has_rx_data(sock))
>    553                  vhost_net_busy_poll_try_queue(net, vq);
>
> regards,
> dan carpenter
>

_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/virtualization



[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux