[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <201709181210.INwGQoZY%fengguang.wu@intel.com>
Date: Mon, 18 Sep 2017 12:14:10 +0800
From: kbuild test robot <lkp@...el.com>
To: Jason Wang <jasowang@...hat.com>
Cc: kbuild-all@...org, Matthew Rosato <mjrosato@...ux.vnet.ibm.com>,
netdev@...r.kernel.org, davem@...emloft.net, mst@...hat.com
Subject: Re: [PATCH] vhost_net: conditionally enable tx polling
Hi Jason,
[auto build test WARNING on vhost/linux-next]
[also build test WARNING on v4.14-rc1 next-20170915]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Jason-Wang/vhost_net-conditionally-enable-tx-polling/20170918-112041
base: https://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git linux-next
config: x86_64-randconfig-x009-201738 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
drivers//vhost/net.c: In function 'handle_tx':
>> drivers//vhost/net.c:565:4: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if (err = -EAGAIN)
^~
vim +565 drivers//vhost/net.c
442
443 /* Expects to be always run from workqueue - which acts as
444 * read-size critical section for our kind of RCU. */
445 static void handle_tx(struct vhost_net *net)
446 {
447 struct vhost_net_virtqueue *nvq = &net->vqs[VHOST_NET_VQ_TX];
448 struct vhost_virtqueue *vq = &nvq->vq;
449 unsigned out, in;
450 int head;
451 struct msghdr msg = {
452 .msg_name = NULL,
453 .msg_namelen = 0,
454 .msg_control = NULL,
455 .msg_controllen = 0,
456 .msg_flags = MSG_DONTWAIT,
457 };
458 size_t len, total_len = 0;
459 int err;
460 size_t hdr_size;
461 struct socket *sock;
462 struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
463 bool zcopy, zcopy_used;
464
465 mutex_lock(&vq->mutex);
466 sock = vq->private_data;
467 if (!sock)
468 goto out;
469
470 if (!vq_iotlb_prefetch(vq))
471 goto out;
472
473 vhost_disable_notify(&net->dev, vq);
474 vhost_net_disable_vq(net, vq);
475
476 hdr_size = nvq->vhost_hlen;
477 zcopy = nvq->ubufs;
478
479 for (;;) {
480 /* Release DMAs done buffers first */
481 if (zcopy)
482 vhost_zerocopy_signal_used(net, vq);
483
484 /* If more outstanding DMAs, queue the work.
485 * Handle upend_idx wrap around
486 */
487 if (unlikely(vhost_exceeds_maxpend(net)))
488 break;
489
490 head = vhost_net_tx_get_vq_desc(net, vq, vq->iov,
491 ARRAY_SIZE(vq->iov),
492 &out, &in);
493 /* On error, stop handling until the next kick. */
494 if (unlikely(head < 0))
495 break;
496 /* Nothing new? Wait for eventfd to tell us they refilled. */
497 if (head == vq->num) {
498 if (unlikely(vhost_enable_notify(&net->dev, vq))) {
499 vhost_disable_notify(&net->dev, vq);
500 continue;
501 }
502 break;
503 }
504 if (in) {
505 vq_err(vq, "Unexpected descriptor format for TX: "
506 "out %d, int %d\n", out, in);
507 break;
508 }
509 /* Skip header. TODO: support TSO. */
510 len = iov_length(vq->iov, out);
511 iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len);
512 iov_iter_advance(&msg.msg_iter, hdr_size);
513 /* Sanity check */
514 if (!msg_data_left(&msg)) {
515 vq_err(vq, "Unexpected header len for TX: "
516 "%zd expected %zd\n",
517 len, hdr_size);
518 break;
519 }
520 len = msg_data_left(&msg);
521
522 zcopy_used = zcopy && len >= VHOST_GOODCOPY_LEN
523 && (nvq->upend_idx + 1) % UIO_MAXIOV !=
524 nvq->done_idx
525 && vhost_net_tx_select_zcopy(net);
526
527 /* use msg_control to pass vhost zerocopy ubuf info to skb */
528 if (zcopy_used) {
529 struct ubuf_info *ubuf;
530 ubuf = nvq->ubuf_info + nvq->upend_idx;
531
532 vq->heads[nvq->upend_idx].id = cpu_to_vhost32(vq, head);
533 vq->heads[nvq->upend_idx].len = VHOST_DMA_IN_PROGRESS;
534 ubuf->callback = vhost_zerocopy_callback;
535 ubuf->ctx = nvq->ubufs;
536 ubuf->desc = nvq->upend_idx;
537 msg.msg_control = ubuf;
538 msg.msg_controllen = sizeof(ubuf);
539 ubufs = nvq->ubufs;
540 atomic_inc(&ubufs->refcount);
541 nvq->upend_idx = (nvq->upend_idx + 1) % UIO_MAXIOV;
542 } else {
543 msg.msg_control = NULL;
544 ubufs = NULL;
545 }
546
547 total_len += len;
548 if (total_len < VHOST_NET_WEIGHT &&
549 !vhost_vq_avail_empty(&net->dev, vq) &&
550 likely(!vhost_exceeds_maxpend(net))) {
551 msg.msg_flags |= MSG_MORE;
552 } else {
553 msg.msg_flags &= ~MSG_MORE;
554 }
555
556 /* TODO: Check specific error and bomb out unless ENOBUFS? */
557 err = sock->ops->sendmsg(sock, &msg, len);
558 if (unlikely(err < 0)) {
559 if (zcopy_used) {
560 vhost_net_ubuf_put(ubufs);
561 nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
562 % UIO_MAXIOV;
563 }
564 vhost_discard_vq_desc(vq, 1);
> 565 if (err = -EAGAIN)
566 vhost_net_enable_vq(net, vq);
567 break;
568 }
569 if (err != len)
570 pr_debug("Truncated TX packet: "
571 " len %d != %zd\n", err, len);
572 if (!zcopy_used)
573 vhost_add_used_and_signal(&net->dev, vq, head, 0);
574 else
575 vhost_zerocopy_signal_used(net, vq);
576 vhost_net_tx_packet(net);
577 if (unlikely(total_len >= VHOST_NET_WEIGHT)) {
578 vhost_poll_queue(&vq->poll);
579 break;
580 }
581 }
582 out:
583 mutex_unlock(&vq->mutex);
584 }
585
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Download attachment ".config.gz" of type "application/gzip" (31832 bytes)
Powered by blists - more mailing lists