Message ID | 1603326903-27052-5-git-send-email-michael.christie@oracle.com |
---|---|
State | Superseded |
Headers | show |
Series | vhost: fix scsi cmd handling and cgroup support | expand |
Hi Mike, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on vhost/linux-next] [also build test WARNING on v5.9 next-20201021] [cannot apply to target/for-next] [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] url: https://github.com/0day-ci/linux/commits/Mike-Christie/vhost-fix-scsi-cmd-handling-and-cgroup-support/20201022-083844 base: https://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git linux-next config: x86_64-randconfig-a013-20201021 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project ee6abef5323d59b983129bf3514ef6775d1d6cd5) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # https://github.com/0day-ci/linux/commit/6e1629548d318c2c9af7490379a3c9d7e3cba0d5 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Mike-Christie/vhost-fix-scsi-cmd-handling-and-cgroup-support/20201022-083844 git checkout 6e1629548d318c2c9af7490379a3c9d7e3cba0d5 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/vhost/vsock.c:633:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] if (vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/vhost/vsock.c:648:9: note: uninitialized use occurs here return ret; ^~~ drivers/vhost/vsock.c:633:2: note: remove the 'if' if its condition is always false if (vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/vhost/vsock.c:609:9: note: initialize the variable 'ret' to silence this warning int ret; ^ = 0 1 warning generated. vim +633 drivers/vhost/vsock.c 604 605 static int vhost_vsock_dev_open(struct inode *inode, struct file *file) 606 { 607 struct vhost_virtqueue **vqs; 608 struct vhost_vsock *vsock; 609 int ret; 610 611 /* This struct is large and allocation could fail, fall back to vmalloc 612 * if there is no other way. 613 */ 614 vsock = kvmalloc(sizeof(*vsock), GFP_KERNEL | __GFP_RETRY_MAYFAIL); 615 if (!vsock) 616 return -ENOMEM; 617 618 vqs = kmalloc_array(ARRAY_SIZE(vsock->vqs), sizeof(*vqs), GFP_KERNEL); 619 if (!vqs) { 620 ret = -ENOMEM; 621 goto out; 622 } 623 624 vsock->guest_cid = 0; /* no CID assigned yet */ 625 626 atomic_set(&vsock->queued_replies, 0); 627 628 vqs[VSOCK_VQ_TX] = &vsock->vqs[VSOCK_VQ_TX]; 629 vqs[VSOCK_VQ_RX] = &vsock->vqs[VSOCK_VQ_RX]; 630 vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick; 631 vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick; 632 > 633 if (vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), 634 UIO_MAXIOV, VHOST_VSOCK_PKT_WEIGHT, 635 VHOST_VSOCK_WEIGHT, true, NULL)) 636 goto err_dev_init; 637 638 file->private_data = vsock; 639 spin_lock_init(&vsock->send_pkt_list_lock); 640 INIT_LIST_HEAD(&vsock->send_pkt_list); 641 vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work); 642 return 0; 643 644 err_dev_init: 645 kfree(vqs); 646 out: 647 vhost_vsock_free(vsock); 648 return ret; 649 } 650 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On 10/21/20 7:34 PM, Mike Christie wrote: > diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c > index 86617bb..63ba363 100644 > --- a/drivers/vhost/scsi.c > +++ b/drivers/vhost/scsi.c > @@ -1632,14 +1632,17 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) > vqs[i] = &vs->vqs[i].vq; > vs->vqs[i].vq.handle_kick = vhost_scsi_handle_kick; > } > - vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ, UIO_MAXIOV, > - VHOST_SCSI_WEIGHT, 0, true, NULL); > + if (vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ, UIO_MAXIOV, > + VHOST_SCSI_WEIGHT, 0, true, NULL)) > diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c > index f40205f..a1a35e1 100644 > --- a/drivers/vhost/vsock.c > +++ b/drivers/vhost/vsock.c > @@ -630,9 +630,10 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file) > vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick; > vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick; > > - vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), > - UIO_MAXIOV, VHOST_VSOCK_PKT_WEIGHT, > - VHOST_VSOCK_WEIGHT, true, NULL); > + if (vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), > + UIO_MAXIOV, VHOST_VSOCK_PKT_WEIGHT, > Just giving myself a review comment, so it doesn't happen like last time where multiple people waste their time and hit the same issue :) I will fix this one found by the kernel test robot and fix up a similar scsi.c case where the return value is not propagated above.
On 2020/10/22 上午8:34, Mike Christie wrote: > This is just a prep patch to get vhost_dev_init callers ready to handle > the next patch where the function can fail. In this patch vhost_dev_init > just returns 0, but I think it's easier to check for goto/error handling > errors separated from the next patch. > > Signed-off-by: Mike Christie<michael.christie@oracle.com> > --- > drivers/vhost/net.c | 11 +++++++---- > drivers/vhost/scsi.c | 7 +++++-- > drivers/vhost/test.c | 9 +++++++-- > drivers/vhost/vdpa.c | 7 +++++-- > drivers/vhost/vhost.c | 14 ++++++++------ > drivers/vhost/vhost.h | 10 +++++----- > drivers/vhost/vsock.c | 9 ++++++--- > 7 files changed, 43 insertions(+), 24 deletions(-) Acked-by: Jason Wang <jasowang@redhat.com>
Hi Mike, url: https://github.com/0day-ci/linux/commits/Mike-Christie/vhost-fix-scsi-cmd-handling-and-cgroup-support/20201022-083844 base: https://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git linux-next config: i386-randconfig-m021-20201101 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> smatch warnings: drivers/vhost/vsock.c:648 vhost_vsock_dev_open() error: uninitialized symbol 'ret'. vim +/ret +648 drivers/vhost/vsock.c 433fc58e6bf2c8b Asias He 2016-07-28 605 static int vhost_vsock_dev_open(struct inode *inode, struct file *file) 433fc58e6bf2c8b Asias He 2016-07-28 606 { 433fc58e6bf2c8b Asias He 2016-07-28 607 struct vhost_virtqueue **vqs; 433fc58e6bf2c8b Asias He 2016-07-28 608 struct vhost_vsock *vsock; 433fc58e6bf2c8b Asias He 2016-07-28 609 int ret; 433fc58e6bf2c8b Asias He 2016-07-28 610 433fc58e6bf2c8b Asias He 2016-07-28 611 /* This struct is large and allocation could fail, fall back to vmalloc 433fc58e6bf2c8b Asias He 2016-07-28 612 * if there is no other way. 433fc58e6bf2c8b Asias He 2016-07-28 613 */ dcda9b04713c3f6 Michal Hocko 2017-07-12 614 vsock = kvmalloc(sizeof(*vsock), GFP_KERNEL | __GFP_RETRY_MAYFAIL); 433fc58e6bf2c8b Asias He 2016-07-28 615 if (!vsock) 433fc58e6bf2c8b Asias He 2016-07-28 616 return -ENOMEM; 433fc58e6bf2c8b Asias He 2016-07-28 617 433fc58e6bf2c8b Asias He 2016-07-28 618 vqs = kmalloc_array(ARRAY_SIZE(vsock->vqs), sizeof(*vqs), GFP_KERNEL); 433fc58e6bf2c8b Asias He 2016-07-28 619 if (!vqs) { 433fc58e6bf2c8b Asias He 2016-07-28 620 ret = -ENOMEM; 433fc58e6bf2c8b Asias He 2016-07-28 621 goto out; 433fc58e6bf2c8b Asias He 2016-07-28 622 } 433fc58e6bf2c8b Asias He 2016-07-28 623 a72b69dc083a931 Stefan Hajnoczi 2017-11-09 624 vsock->guest_cid = 0; /* no CID assigned yet */ a72b69dc083a931 Stefan Hajnoczi 2017-11-09 625 433fc58e6bf2c8b Asias He 2016-07-28 626 atomic_set(&vsock->queued_replies, 0); 433fc58e6bf2c8b Asias He 2016-07-28 627 433fc58e6bf2c8b Asias He 2016-07-28 628 vqs[VSOCK_VQ_TX] = &vsock->vqs[VSOCK_VQ_TX]; 433fc58e6bf2c8b Asias He 2016-07-28 629 vqs[VSOCK_VQ_RX] = &vsock->vqs[VSOCK_VQ_RX]; 433fc58e6bf2c8b Asias He 2016-07-28 630 vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick; 433fc58e6bf2c8b Asias He 2016-07-28 631 vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick; 433fc58e6bf2c8b Asias He 2016-07-28 632 6e1629548d318c2 Mike Christie 2020-10-21 633 if (vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), e82b9b0727ff6d6 Jason Wang 2019-05-17 634 UIO_MAXIOV, VHOST_VSOCK_PKT_WEIGHT, 6e1629548d318c2 Mike Christie 2020-10-21 635 VHOST_VSOCK_WEIGHT, true, NULL)) 6e1629548d318c2 Mike Christie 2020-10-21 636 goto err_dev_init; ^^^^^^^^^^^^^^^^^ "ret" needs to be set here. 433fc58e6bf2c8b Asias He 2016-07-28 637 433fc58e6bf2c8b Asias He 2016-07-28 638 file->private_data = vsock; 433fc58e6bf2c8b Asias He 2016-07-28 639 spin_lock_init(&vsock->send_pkt_list_lock); 433fc58e6bf2c8b Asias He 2016-07-28 640 INIT_LIST_HEAD(&vsock->send_pkt_list); 433fc58e6bf2c8b Asias He 2016-07-28 641 vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work); 433fc58e6bf2c8b Asias He 2016-07-28 642 return 0; 433fc58e6bf2c8b Asias He 2016-07-28 643 6e1629548d318c2 Mike Christie 2020-10-21 644 err_dev_init: 6e1629548d318c2 Mike Christie 2020-10-21 645 kfree(vqs); 433fc58e6bf2c8b Asias He 2016-07-28 646 out: 433fc58e6bf2c8b Asias He 2016-07-28 647 vhost_vsock_free(vsock); 433fc58e6bf2c8b Asias He 2016-07-28 @648 return ret; 433fc58e6bf2c8b Asias He 2016-07-28 649 } --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 831d824..fd30b53 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -1316,10 +1316,11 @@ static int vhost_net_open(struct inode *inode, struct file *f) n->vqs[i].rx_ring = NULL; vhost_net_buf_init(&n->vqs[i].rxq); } - vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX, - UIO_MAXIOV + VHOST_NET_BATCH, - VHOST_NET_PKT_WEIGHT, VHOST_NET_WEIGHT, true, - NULL); + if (vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX, + UIO_MAXIOV + VHOST_NET_BATCH, + VHOST_NET_PKT_WEIGHT, VHOST_NET_WEIGHT, true, + NULL)) + goto err_dev_init; vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, EPOLLOUT, dev); vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, EPOLLIN, dev); @@ -1330,6 +1331,8 @@ static int vhost_net_open(struct inode *inode, struct file *f) return 0; +err_dev_init: + kfree(xdp); err_xdp: kfree(queue); err_queue: diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 86617bb..63ba363 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -1632,14 +1632,17 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) vqs[i] = &vs->vqs[i].vq; vs->vqs[i].vq.handle_kick = vhost_scsi_handle_kick; } - vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ, UIO_MAXIOV, - VHOST_SCSI_WEIGHT, 0, true, NULL); + if (vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ, UIO_MAXIOV, + VHOST_SCSI_WEIGHT, 0, true, NULL)) + goto err_dev_init; vhost_scsi_init_inflight(vs, NULL); f->private_data = vs; return 0; +err_dev_init: + kfree(vqs); err_vqs: kvfree(vs); err_vs: diff --git a/drivers/vhost/test.c b/drivers/vhost/test.c index a09dedc..c255ae5 100644 --- a/drivers/vhost/test.c +++ b/drivers/vhost/test.c @@ -119,12 +119,17 @@ static int vhost_test_open(struct inode *inode, struct file *f) dev = &n->dev; vqs[VHOST_TEST_VQ] = &n->vqs[VHOST_TEST_VQ]; n->vqs[VHOST_TEST_VQ].handle_kick = handle_vq_kick; - vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX, UIO_MAXIOV, - VHOST_TEST_PKT_WEIGHT, VHOST_TEST_WEIGHT, true, NULL); + if (vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX, UIO_MAXIOV, + VHOST_TEST_PKT_WEIGHT, VHOST_TEST_WEIGHT, true, NULL) + goto err_dev_init; f->private_data = n; return 0; + +err_dev_init: + kfree(vqs); + return -ENOMEM; } static void *vhost_test_stop_vq(struct vhost_test *n, diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index a2dbc85..9c8a686 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -810,8 +810,10 @@ static int vhost_vdpa_open(struct inode *inode, struct file *filep) vqs[i] = &v->vqs[i]; vqs[i]->handle_kick = handle_vq_kick; } - vhost_dev_init(dev, vqs, nvqs, 0, 0, 0, false, - vhost_vdpa_process_iotlb_msg); + r = vhost_dev_init(dev, vqs, nvqs, 0, 0, 0, false, + vhost_vdpa_process_iotlb_msg); + if (r) + goto err_dev_init; dev->iotlb = vhost_iotlb_alloc(0, 0); if (!dev->iotlb) { @@ -829,6 +831,7 @@ static int vhost_vdpa_open(struct inode *inode, struct file *filep) err_init_iotlb: vhost_dev_cleanup(&v->vdev); +err_dev_init: kfree(vqs); err: atomic_dec(&v->opened); diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index 6818f71..b35229e 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -458,12 +458,12 @@ static size_t vhost_get_desc_size(struct vhost_virtqueue *vq, return sizeof(*vq->desc) * num; } -void vhost_dev_init(struct vhost_dev *dev, - struct vhost_virtqueue **vqs, int nvqs, - int iov_limit, int weight, int byte_weight, - bool use_worker, - int (*msg_handler)(struct vhost_dev *dev, - struct vhost_iotlb_msg *msg)) +int vhost_dev_init(struct vhost_dev *dev, + struct vhost_virtqueue **vqs, int nvqs, + int iov_limit, int weight, int byte_weight, + bool use_worker, + int (*msg_handler)(struct vhost_dev *dev, + struct vhost_iotlb_msg *msg)) { struct vhost_virtqueue *vq; int i; @@ -500,6 +500,8 @@ void vhost_dev_init(struct vhost_dev *dev, vhost_poll_init(&vq->poll, vq->handle_kick, EPOLLIN, dev); } + + return 0; } EXPORT_SYMBOL_GPL(vhost_dev_init); diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h index 1365f33..9ad34b1 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h @@ -167,11 +167,11 @@ struct vhost_dev { }; bool vhost_exceeds_weight(struct vhost_virtqueue *vq, int pkts, int total_len); -void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, - int nvqs, int iov_limit, int weight, int byte_weight, - bool use_worker, - int (*msg_handler)(struct vhost_dev *dev, - struct vhost_iotlb_msg *msg)); +int vhost_dev_init(struct vhost_dev *dev, struct vhost_virtqueue **vqs, + int nvqs, int iov_limit, int weight, int byte_weight, + bool use_worker, + int (*msg_handler)(struct vhost_dev *dev, + struct vhost_iotlb_msg *msg)); long vhost_dev_set_owner(struct vhost_dev *dev); bool vhost_dev_has_owner(struct vhost_dev *dev); long vhost_dev_check_owner(struct vhost_dev *); diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index f40205f..a1a35e1 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -630,9 +630,10 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file) vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick; vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick; - vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), - UIO_MAXIOV, VHOST_VSOCK_PKT_WEIGHT, - VHOST_VSOCK_WEIGHT, true, NULL); + if (vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), + UIO_MAXIOV, VHOST_VSOCK_PKT_WEIGHT, + VHOST_VSOCK_WEIGHT, true, NULL)) + goto err_dev_init; file->private_data = vsock; spin_lock_init(&vsock->send_pkt_list_lock); @@ -640,6 +641,8 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file) vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work); return 0; +err_dev_init: + kfree(vqs); out: vhost_vsock_free(vsock); return ret;
This is just a prep patch to get vhost_dev_init callers ready to handle the next patch where the function can fail. In this patch vhost_dev_init just returns 0, but I think it's easier to check for goto/error handling errors separated from the next patch. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/vhost/net.c | 11 +++++++---- drivers/vhost/scsi.c | 7 +++++-- drivers/vhost/test.c | 9 +++++++-- drivers/vhost/vdpa.c | 7 +++++-- drivers/vhost/vhost.c | 14 ++++++++------ drivers/vhost/vhost.h | 10 +++++----- drivers/vhost/vsock.c | 9 ++++++--- 7 files changed, 43 insertions(+), 24 deletions(-)