Re: [PATCH v2 13/16] rpmsg: virtio: probe the rpmsg_ctl device

From: Dan Carpenter
Date: Mon Jan 04 2021 - 08:03:41 EST


Hi Arnaud,

url: https://github.com/0day-ci/linux/commits/Arnaud-Pouliquen/introduce-generic-IOCTL-interface-for-RPMsg-channels-management/20201222-190521
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 8653b778e454a7708847aeafe689bce07aeeb94e
config: x86_64-randconfig-m001-20201221 (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@xxxxxxxxx>
Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

smatch warnings:
drivers/rpmsg/virtio_rpmsg_bus.c:978 rpmsg_probe() error: uninitialized symbol 'vch'.
drivers/rpmsg/virtio_rpmsg_bus.c:979 rpmsg_probe() error: uninitialized symbol 'rpdev_ctrl'.

vim +/vch +978 drivers/rpmsg/virtio_rpmsg_bus.c

bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 846 static int rpmsg_probe(struct virtio_device *vdev)
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 847 {
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 848 vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
f7ad26ff952b3ca Stefan Hajnoczi 2015-12-17 849 static const char * const names[] = { "input", "output" };
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 850 struct virtqueue *vqs[2];
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 851 struct virtproc_info *vrp;
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 852 struct virtio_rpmsg_channel *vch;
^^^
532ff49403675dd Arnaud Pouliquen 2020-12-22 853 struct rpmsg_device *rpdev_ns, *rpdev_ctrl;
^^^^^^^^^^

bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 854 void *bufs_va;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 855 int err = 0, i;
b1b9891441fa33f Suman Anna 2014-09-16 856 size_t total_buf_space;
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 857 bool notify;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 858
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 859 vrp = kzalloc(sizeof(*vrp), GFP_KERNEL);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 860 if (!vrp)
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 861 return -ENOMEM;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 862
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 863 vrp->vdev = vdev;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 864
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 865 idr_init(&vrp->endpoints);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 866 mutex_init(&vrp->endpoints_lock);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 867 mutex_init(&vrp->tx_lock);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 868 init_waitqueue_head(&vrp->sendq);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 869
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 870 /* We expect two virtqueues, rx and tx (and in this order) */
9b2bbdb22758845 Michael S. Tsirkin 2017-03-06 871 err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 872 if (err)
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 873 goto free_vrp;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 874
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 875 vrp->rvq = vqs[0];
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 876 vrp->svq = vqs[1];
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 877
b1b9891441fa33f Suman Anna 2014-09-16 878 /* we expect symmetric tx/rx vrings */
b1b9891441fa33f Suman Anna 2014-09-16 879 WARN_ON(virtqueue_get_vring_size(vrp->rvq) !=
b1b9891441fa33f Suman Anna 2014-09-16 880 virtqueue_get_vring_size(vrp->svq));
b1b9891441fa33f Suman Anna 2014-09-16 881
b1b9891441fa33f Suman Anna 2014-09-16 882 /* we need less buffers if vrings are small */
b1b9891441fa33f Suman Anna 2014-09-16 883 if (virtqueue_get_vring_size(vrp->rvq) < MAX_RPMSG_NUM_BUFS / 2)
b1b9891441fa33f Suman Anna 2014-09-16 884 vrp->num_bufs = virtqueue_get_vring_size(vrp->rvq) * 2;
b1b9891441fa33f Suman Anna 2014-09-16 885 else
b1b9891441fa33f Suman Anna 2014-09-16 886 vrp->num_bufs = MAX_RPMSG_NUM_BUFS;
b1b9891441fa33f Suman Anna 2014-09-16 887
f93848f9eeb0f87 Loic Pallardy 2017-03-28 888 vrp->buf_size = MAX_RPMSG_BUF_SIZE;
f93848f9eeb0f87 Loic Pallardy 2017-03-28 889
f93848f9eeb0f87 Loic Pallardy 2017-03-28 890 total_buf_space = vrp->num_bufs * vrp->buf_size;
b1b9891441fa33f Suman Anna 2014-09-16 891
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 892 /* allocate coherent memory for the buffers */
d999b622fcfb392 Loic Pallardy 2019-01-10 893 bufs_va = dma_alloc_coherent(vdev->dev.parent,
b1b9891441fa33f Suman Anna 2014-09-16 894 total_buf_space, &vrp->bufs_dma,
b1b9891441fa33f Suman Anna 2014-09-16 895 GFP_KERNEL);
3119b487e03650b Wei Yongjun 2013-04-29 896 if (!bufs_va) {
3119b487e03650b Wei Yongjun 2013-04-29 897 err = -ENOMEM;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 898 goto vqs_del;
3119b487e03650b Wei Yongjun 2013-04-29 899 }
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 900
de4064af76537f1 Suman Anna 2018-10-23 901 dev_dbg(&vdev->dev, "buffers: va %pK, dma %pad\n",
8d95b322ba34b15 Anna, Suman 2016-08-12 902 bufs_va, &vrp->bufs_dma);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 903
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 904 /* half of the buffers is dedicated for RX */
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 905 vrp->rbufs = bufs_va;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 906
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 907 /* and half is dedicated for TX */
b1b9891441fa33f Suman Anna 2014-09-16 908 vrp->sbufs = bufs_va + total_buf_space / 2;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 909
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 910 /* set up the receive buffers */
b1b9891441fa33f Suman Anna 2014-09-16 911 for (i = 0; i < vrp->num_bufs / 2; i++) {
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 912 struct scatterlist sg;
f93848f9eeb0f87 Loic Pallardy 2017-03-28 913 void *cpu_addr = vrp->rbufs + i * vrp->buf_size;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 914
9dd87c2af651b09 Loic Pallardy 2017-03-28 915 rpmsg_sg_init(&sg, cpu_addr, vrp->buf_size);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 916
cee51d69a45b6ce Rusty Russell 2013-03-20 917 err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, cpu_addr,
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 918 GFP_KERNEL);
57e1a37347d31c6 Rusty Russell 2012-10-16 919 WARN_ON(err); /* sanity check; this can't really happen */
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 920 }
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 921
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 922 /* suppress "tx-complete" interrupts */
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 923 virtqueue_disable_cb(vrp->svq);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 924
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 925 vdev->priv = vrp;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 926
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 927 /* if supported by the remote processor, enable the name service */
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 928 if (virtio_has_feature(vdev, VIRTIO_RPMSG_F_NS)) {
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 929 vch = kzalloc(sizeof(*vch), GFP_KERNEL);

Not initialized if virtio_has_feature() is false.

950a7388f02bf77 Arnaud Pouliquen 2020-11-20 930 if (!vch) {
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 931 err = -ENOMEM;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 932 goto free_coherent;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 933 }
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 934
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 935 /* Link the channel to our vrp */
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 936 vch->vrp = vrp;
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 937
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 938 /* Assign public information to the rpmsg_device */
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 939 rpdev_ns = &vch->rpdev;
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 940 rpdev_ns->ops = &virtio_rpmsg_ops;
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 941 rpdev_ns->little_endian = virtio_is_little_endian(vrp->vdev);
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 942
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 943 rpdev_ns->dev.parent = &vrp->vdev->dev;
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 944 rpdev_ns->dev.release = virtio_rpmsg_release_device;
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 945
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 946 err = rpmsg_ns_register_device(rpdev_ns);
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 947 if (err)
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 948 goto free_coherent;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 949 }
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 950
532ff49403675dd Arnaud Pouliquen 2020-12-22 951 rpdev_ctrl = rpmsg_virtio_add_char_dev(vdev);
532ff49403675dd Arnaud Pouliquen 2020-12-22 952 if (IS_ERR(rpdev_ctrl)) {
532ff49403675dd Arnaud Pouliquen 2020-12-22 953 err = PTR_ERR(rpdev_ctrl);
532ff49403675dd Arnaud Pouliquen 2020-12-22 954 goto free_coherent;
532ff49403675dd Arnaud Pouliquen 2020-12-22 955 }
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 956 /*
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 957 * Prepare to kick but don't notify yet - we can't do this before
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 958 * device is ready.
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 959 */
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 960 notify = virtqueue_kick_prepare(vrp->rvq);
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 961
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 962 /* From this point on, we can notify and get callbacks. */
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 963 virtio_device_ready(vdev);
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 964
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 965 /* tell the remote processor it can start sending messages */
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 966 /*
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 967 * this might be concurrent with callbacks, but we are only
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 968 * doing notify, not a full kick here, so that's ok.
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 969 */
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 970 if (notify)
71e4b8bf0482fc7 Michael S. Tsirkin 2015-03-12 971 virtqueue_notify(vrp->rvq);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 972
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 973 dev_info(&vdev->dev, "rpmsg host is online\n");
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 974
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 975 return 0;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 976
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 977 free_coherent:
950a7388f02bf77 Arnaud Pouliquen 2020-11-20 @978 kfree(vch);
^^^^^^^^^^^

532ff49403675dd Arnaud Pouliquen 2020-12-22 @979 kfree(to_virtio_rpmsg_channel(rpdev_ctrl));
^^^^^^^^^^

d999b622fcfb392 Loic Pallardy 2019-01-10 980 dma_free_coherent(vdev->dev.parent, total_buf_space,
eeb0074f36d1ab0 Fernando Guzman Lugo 2012-08-29 981 bufs_va, vrp->bufs_dma);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 982 vqs_del:
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 983 vdev->config->del_vqs(vrp->vdev);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 984 free_vrp:
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 985 kfree(vrp);
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 986 return err;
bcabbccabffe732 Ohad Ben-Cohen 2011-10-20 987 }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip