CC: [email protected] TO: [email protected] TO: Guenter Roeck <[email protected]>
tree: https://chromium.googlesource.com/chromiumos/third_party/kernel chromeos-5.10 head: b835807fdef9926d771cd85d0b5ef3a5efeb14f7 commit: 300b775fa1ab25e08a75ae54a2ddbfb6190cb1e2 [77/82] CHROMIUM: virtio-wl: Use vmalloc for larger messages in virtwl_vfd_send(). :::::: branch date: 2 days ago :::::: commit date: 3 days ago config: ia64-randconfig-c004-20210709 (attached as .config) compiler: ia64-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Julia Lawall <[email protected]> cocci warnings: (new ones prefixed by >>) >> drivers/virtio/virtio_wl.c:965:17-18: WARNING kmalloc is used to allocate >> this memory at line 889 >> drivers/virtio/virtio_wl.c:965:17-18: WARNING vmalloc is used to allocate >> this memory at line 892 vim +965 drivers/virtio/virtio_wl.c e3c760a99cdc2d Zach Reizner 2017-08-14 788 e3c760a99cdc2d Zach Reizner 2017-08-14 789 static int virtwl_vfd_send(struct file *filp, const char __user *buffer, e3c760a99cdc2d Zach Reizner 2017-08-14 790 u32 len, int *vfd_fds) e3c760a99cdc2d Zach Reizner 2017-08-14 791 { e3c760a99cdc2d Zach Reizner 2017-08-14 792 struct virtwl_vfd *vfd = filp->private_data; e3c760a99cdc2d Zach Reizner 2017-08-14 793 struct virtwl_info *vi = vfd->vi; e3c760a99cdc2d Zach Reizner 2017-08-14 794 struct fd vfd_files[VIRTWL_SEND_MAX_ALLOCS] = { { 0 } }; e3c760a99cdc2d Zach Reizner 2017-08-14 795 struct virtwl_vfd *vfds[VIRTWL_SEND_MAX_ALLOCS] = { 0 }; e3c760a99cdc2d Zach Reizner 2017-08-14 796 #ifdef SEND_VIRTGPU_RESOURCES e3c760a99cdc2d Zach Reizner 2017-08-14 797 struct dma_buf *virtgpu_dma_bufs[VIRTWL_SEND_MAX_ALLOCS] = { 0 }; 4250dbcb9e0e98 David Stevens 2020-04-22 798 struct dma_fence *virtgpu_dma_fence[VIRTWL_SEND_MAX_ALLOCS] = { 0 }; e3c760a99cdc2d Zach Reizner 2017-08-14 799 bool foreign_id = false; e3c760a99cdc2d Zach Reizner 2017-08-14 800 #endif e3c760a99cdc2d Zach Reizner 2017-08-14 801 size_t vfd_count = 0; e3c760a99cdc2d Zach Reizner 2017-08-14 802 size_t vfd_ids_size; e3c760a99cdc2d Zach Reizner 2017-08-14 803 size_t ctrl_send_size; e3c760a99cdc2d Zach Reizner 2017-08-14 804 struct virtio_wl_ctrl_vfd_send *ctrl_send; e3c760a99cdc2d Zach Reizner 2017-08-14 805 u8 *vfd_ids; e3c760a99cdc2d Zach Reizner 2017-08-14 806 u8 *out_buffer; e3c760a99cdc2d Zach Reizner 2017-08-14 807 struct completion finish_completion; e3c760a99cdc2d Zach Reizner 2017-08-14 808 struct scatterlist out_sg; e3c760a99cdc2d Zach Reizner 2017-08-14 809 struct scatterlist in_sg; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 810 struct sg_table sgt; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 811 struct vm_struct *area; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 812 bool vmalloced; e3c760a99cdc2d Zach Reizner 2017-08-14 813 int ret; e3c760a99cdc2d Zach Reizner 2017-08-14 814 int i; e3c760a99cdc2d Zach Reizner 2017-08-14 815 e3c760a99cdc2d Zach Reizner 2017-08-14 816 if (vfd_fds) { e3c760a99cdc2d Zach Reizner 2017-08-14 817 for (i = 0; i < VIRTWL_SEND_MAX_ALLOCS; i++) { e3c760a99cdc2d Zach Reizner 2017-08-14 818 struct fd vfd_file; e3c760a99cdc2d Zach Reizner 2017-08-14 819 int fd = vfd_fds[i]; e3c760a99cdc2d Zach Reizner 2017-08-14 820 e3c760a99cdc2d Zach Reizner 2017-08-14 821 if (fd < 0) e3c760a99cdc2d Zach Reizner 2017-08-14 822 break; e3c760a99cdc2d Zach Reizner 2017-08-14 823 e3c760a99cdc2d Zach Reizner 2017-08-14 824 vfd_file = fdget(vfd_fds[i]); e3c760a99cdc2d Zach Reizner 2017-08-14 825 if (!vfd_file.file) { e3c760a99cdc2d Zach Reizner 2017-08-14 826 ret = -EBADFD; e3c760a99cdc2d Zach Reizner 2017-08-14 827 goto put_files; e3c760a99cdc2d Zach Reizner 2017-08-14 828 } e3c760a99cdc2d Zach Reizner 2017-08-14 829 e3c760a99cdc2d Zach Reizner 2017-08-14 830 if (vfd_file.file->f_op == &virtwl_vfd_fops) { e3c760a99cdc2d Zach Reizner 2017-08-14 831 vfd_files[i] = vfd_file; e3c760a99cdc2d Zach Reizner 2017-08-14 832 e3c760a99cdc2d Zach Reizner 2017-08-14 833 vfds[i] = vfd_file.file->private_data; e3c760a99cdc2d Zach Reizner 2017-08-14 834 if (vfds[i] && vfds[i]->id) { e3c760a99cdc2d Zach Reizner 2017-08-14 835 vfd_count++; e3c760a99cdc2d Zach Reizner 2017-08-14 836 continue; e3c760a99cdc2d Zach Reizner 2017-08-14 837 } e3c760a99cdc2d Zach Reizner 2017-08-14 838 e3c760a99cdc2d Zach Reizner 2017-08-14 839 ret = -EINVAL; e3c760a99cdc2d Zach Reizner 2017-08-14 840 goto put_files; e3c760a99cdc2d Zach Reizner 2017-08-14 841 } else { e3c760a99cdc2d Zach Reizner 2017-08-14 842 struct dma_buf *dma_buf = ERR_PTR(-EINVAL); 4250dbcb9e0e98 David Stevens 2020-04-22 843 struct dma_fence *dma_fence = ERR_PTR(-EINVAL); 4250dbcb9e0e98 David Stevens 2020-04-22 844 bool handled = false; 4250dbcb9e0e98 David Stevens 2020-04-22 845 e3c760a99cdc2d Zach Reizner 2017-08-14 846 #ifdef SEND_VIRTGPU_RESOURCES e3c760a99cdc2d Zach Reizner 2017-08-14 847 dma_buf = dma_buf_get(vfd_fds[i]); 4250dbcb9e0e98 David Stevens 2020-04-22 848 dma_fence = vi->use_send_vfd_v2 4250dbcb9e0e98 David Stevens 2020-04-22 849 ? sync_file_get_fence(vfd_fds[i]) 4250dbcb9e0e98 David Stevens 2020-04-22 850 : ERR_PTR(-EINVAL); 4250dbcb9e0e98 David Stevens 2020-04-22 851 handled = !IS_ERR(dma_buf) || 4250dbcb9e0e98 David Stevens 2020-04-22 852 !IS_ERR(dma_fence); 4250dbcb9e0e98 David Stevens 2020-04-22 853 e3c760a99cdc2d Zach Reizner 2017-08-14 854 if (!IS_ERR(dma_buf)) { e3c760a99cdc2d Zach Reizner 2017-08-14 855 virtgpu_dma_bufs[i] = dma_buf; 4250dbcb9e0e98 David Stevens 2020-04-22 856 } else { 4250dbcb9e0e98 David Stevens 2020-04-22 857 virtgpu_dma_fence[i] = dma_fence; 4250dbcb9e0e98 David Stevens 2020-04-22 858 } 4250dbcb9e0e98 David Stevens 2020-04-22 859 e3c760a99cdc2d Zach Reizner 2017-08-14 860 foreign_id = true; e3c760a99cdc2d Zach Reizner 2017-08-14 861 vfd_count++; e3c760a99cdc2d Zach Reizner 2017-08-14 862 #endif e3c760a99cdc2d Zach Reizner 2017-08-14 863 fdput(vfd_file); 4250dbcb9e0e98 David Stevens 2020-04-22 864 if (!handled) { 4250dbcb9e0e98 David Stevens 2020-04-22 865 ret = IS_ERR(dma_buf) ? 4250dbcb9e0e98 David Stevens 2020-04-22 866 PTR_ERR(dma_buf) : 4250dbcb9e0e98 David Stevens 2020-04-22 867 PTR_ERR(dma_fence); e3c760a99cdc2d Zach Reizner 2017-08-14 868 goto put_files; e3c760a99cdc2d Zach Reizner 2017-08-14 869 } e3c760a99cdc2d Zach Reizner 2017-08-14 870 } e3c760a99cdc2d Zach Reizner 2017-08-14 871 } 4250dbcb9e0e98 David Stevens 2020-04-22 872 } e3c760a99cdc2d Zach Reizner 2017-08-14 873 e3c760a99cdc2d Zach Reizner 2017-08-14 874 /* Empty writes always succeed. */ e3c760a99cdc2d Zach Reizner 2017-08-14 875 if (len == 0 && vfd_count == 0) e3c760a99cdc2d Zach Reizner 2017-08-14 876 return 0; e3c760a99cdc2d Zach Reizner 2017-08-14 877 e3c760a99cdc2d Zach Reizner 2017-08-14 878 vfd_ids_size = vfd_count * sizeof(__le32); e3c760a99cdc2d Zach Reizner 2017-08-14 879 #ifdef SEND_VIRTGPU_RESOURCES e3c760a99cdc2d Zach Reizner 2017-08-14 880 if (foreign_id) { 4250dbcb9e0e98 David Stevens 2020-04-22 881 vfd_ids_size = vfd_count * (vi->use_send_vfd_v2 4250dbcb9e0e98 David Stevens 2020-04-22 882 ? sizeof(struct virtio_wl_ctrl_vfd_send_vfd_v2) 4250dbcb9e0e98 David Stevens 2020-04-22 883 : sizeof(struct virtio_wl_ctrl_vfd_send_vfd)); e3c760a99cdc2d Zach Reizner 2017-08-14 884 } e3c760a99cdc2d Zach Reizner 2017-08-14 885 #endif e3c760a99cdc2d Zach Reizner 2017-08-14 886 ctrl_send_size = sizeof(*ctrl_send) + vfd_ids_size + len; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 887 vmalloced = false; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 888 if (ctrl_send_size < PAGE_SIZE) e3c760a99cdc2d Zach Reizner 2017-08-14 @889 ctrl_send = kzalloc(ctrl_send_size, GFP_KERNEL); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 890 else { 300b775fa1ab25 Suleiman Souhlal 2021-06-08 891 vmalloced = true; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 @892 ctrl_send = vzalloc(ctrl_send_size); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 893 } e3c760a99cdc2d Zach Reizner 2017-08-14 894 if (!ctrl_send) { e3c760a99cdc2d Zach Reizner 2017-08-14 895 ret = -ENOMEM; e3c760a99cdc2d Zach Reizner 2017-08-14 896 goto put_files; e3c760a99cdc2d Zach Reizner 2017-08-14 897 } e3c760a99cdc2d Zach Reizner 2017-08-14 898 e3c760a99cdc2d Zach Reizner 2017-08-14 899 vfd_ids = (u8 *)ctrl_send + sizeof(*ctrl_send); e3c760a99cdc2d Zach Reizner 2017-08-14 900 out_buffer = (u8 *)ctrl_send + ctrl_send_size - len; e3c760a99cdc2d Zach Reizner 2017-08-14 901 e3c760a99cdc2d Zach Reizner 2017-08-14 902 ctrl_send->hdr.type = VIRTIO_WL_CMD_VFD_SEND; e3c760a99cdc2d Zach Reizner 2017-08-14 903 #ifdef SEND_VIRTGPU_RESOURCES e3c760a99cdc2d Zach Reizner 2017-08-14 904 if (foreign_id) { 4250dbcb9e0e98 David Stevens 2020-04-22 905 struct virtio_wl_ctrl_vfd_send_vfd *v1 = NULL; 4250dbcb9e0e98 David Stevens 2020-04-22 906 struct virtio_wl_ctrl_vfd_send_vfd_v2 *v2 = NULL; 4250dbcb9e0e98 David Stevens 2020-04-22 907 4250dbcb9e0e98 David Stevens 2020-04-22 908 if (vi->use_send_vfd_v2) 4250dbcb9e0e98 David Stevens 2020-04-22 909 v2 = (struct virtio_wl_ctrl_vfd_send_vfd_v2 *) vfd_ids; 4250dbcb9e0e98 David Stevens 2020-04-22 910 else 4250dbcb9e0e98 David Stevens 2020-04-22 911 v1 = (struct virtio_wl_ctrl_vfd_send_vfd *) vfd_ids; 4250dbcb9e0e98 David Stevens 2020-04-22 912 e3c760a99cdc2d Zach Reizner 2017-08-14 913 ctrl_send->hdr.type = VIRTIO_WL_CMD_VFD_SEND_FOREIGN_ID; 4250dbcb9e0e98 David Stevens 2020-04-22 914 ret = encode_vfd_ids_foreign(vfds, 4250dbcb9e0e98 David Stevens 2020-04-22 915 virtgpu_dma_bufs, virtgpu_dma_fence, vfd_count, 4250dbcb9e0e98 David Stevens 2020-04-22 916 v1, v2); e3c760a99cdc2d Zach Reizner 2017-08-14 917 } else { e3c760a99cdc2d Zach Reizner 2017-08-14 918 ret = encode_vfd_ids(vfds, vfd_count, (__le32 *)vfd_ids); e3c760a99cdc2d Zach Reizner 2017-08-14 919 } e3c760a99cdc2d Zach Reizner 2017-08-14 920 #else e3c760a99cdc2d Zach Reizner 2017-08-14 921 ret = encode_vfd_ids(vfds, vfd_count, (__le32 *)vfd_ids); e3c760a99cdc2d Zach Reizner 2017-08-14 922 #endif e3c760a99cdc2d Zach Reizner 2017-08-14 923 if (ret) e3c760a99cdc2d Zach Reizner 2017-08-14 924 goto free_ctrl_send; e3c760a99cdc2d Zach Reizner 2017-08-14 925 ctrl_send->vfd_id = vfd->id; e3c760a99cdc2d Zach Reizner 2017-08-14 926 ctrl_send->vfd_count = vfd_count; e3c760a99cdc2d Zach Reizner 2017-08-14 927 e3c760a99cdc2d Zach Reizner 2017-08-14 928 if (copy_from_user(out_buffer, buffer, len)) { e3c760a99cdc2d Zach Reizner 2017-08-14 929 ret = -EFAULT; e3c760a99cdc2d Zach Reizner 2017-08-14 930 goto free_ctrl_send; e3c760a99cdc2d Zach Reizner 2017-08-14 931 } e3c760a99cdc2d Zach Reizner 2017-08-14 932 e3c760a99cdc2d Zach Reizner 2017-08-14 933 init_completion(&finish_completion); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 934 if (!vmalloced) { e3c760a99cdc2d Zach Reizner 2017-08-14 935 sg_init_one(&out_sg, ctrl_send, ctrl_send_size); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 936 sg_init_one(&in_sg, ctrl_send, 300b775fa1ab25 Suleiman Souhlal 2021-06-08 937 sizeof(struct virtio_wl_ctrl_hdr)); e3c760a99cdc2d Zach Reizner 2017-08-14 938 ret = vq_queue_out(vi, &out_sg, &in_sg, &finish_completion, e3c760a99cdc2d Zach Reizner 2017-08-14 939 filp->f_flags & O_NONBLOCK); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 940 } else { 300b775fa1ab25 Suleiman Souhlal 2021-06-08 941 area = find_vm_area(ctrl_send); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 942 ret = sg_alloc_table_from_pages(&sgt, area->pages, 300b775fa1ab25 Suleiman Souhlal 2021-06-08 943 area->nr_pages, 0, ctrl_send_size, GFP_KERNEL); e3c760a99cdc2d Zach Reizner 2017-08-14 944 if (ret) e3c760a99cdc2d Zach Reizner 2017-08-14 945 goto free_ctrl_send; e3c760a99cdc2d Zach Reizner 2017-08-14 946 300b775fa1ab25 Suleiman Souhlal 2021-06-08 947 sg_init_table(&in_sg, 1); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 948 sg_set_page(&in_sg, area->pages[0], 300b775fa1ab25 Suleiman Souhlal 2021-06-08 949 sizeof(struct virtio_wl_ctrl_hdr), 0); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 950 300b775fa1ab25 Suleiman Souhlal 2021-06-08 951 ret = vq_queue_out(vi, sgt.sgl, &in_sg, &finish_completion, 300b775fa1ab25 Suleiman Souhlal 2021-06-08 952 filp->f_flags & O_NONBLOCK); 300b775fa1ab25 Suleiman Souhlal 2021-06-08 953 } 300b775fa1ab25 Suleiman Souhlal 2021-06-08 954 if (ret) 300b775fa1ab25 Suleiman Souhlal 2021-06-08 955 goto free_sgt; 300b775fa1ab25 Suleiman Souhlal 2021-06-08 956 e3c760a99cdc2d Zach Reizner 2017-08-14 957 wait_for_completion(&finish_completion); e3c760a99cdc2d Zach Reizner 2017-08-14 958 e3c760a99cdc2d Zach Reizner 2017-08-14 959 ret = virtwl_resp_err(ctrl_send->hdr.type); e3c760a99cdc2d Zach Reizner 2017-08-14 960 300b775fa1ab25 Suleiman Souhlal 2021-06-08 961 free_sgt: 300b775fa1ab25 Suleiman Souhlal 2021-06-08 962 if (vmalloced) 300b775fa1ab25 Suleiman Souhlal 2021-06-08 963 sg_free_table(&sgt); e3c760a99cdc2d Zach Reizner 2017-08-14 964 free_ctrl_send: 300b775fa1ab25 Suleiman Souhlal 2021-06-08 @965 kvfree(ctrl_send); e3c760a99cdc2d Zach Reizner 2017-08-14 966 put_files: e3c760a99cdc2d Zach Reizner 2017-08-14 967 for (i = 0; i < VIRTWL_SEND_MAX_ALLOCS; i++) { e3c760a99cdc2d Zach Reizner 2017-08-14 968 if (vfd_files[i].file) e3c760a99cdc2d Zach Reizner 2017-08-14 969 fdput(vfd_files[i]); e3c760a99cdc2d Zach Reizner 2017-08-14 970 #ifdef SEND_VIRTGPU_RESOURCES e3c760a99cdc2d Zach Reizner 2017-08-14 971 if (virtgpu_dma_bufs[i]) e3c760a99cdc2d Zach Reizner 2017-08-14 972 dma_buf_put(virtgpu_dma_bufs[i]); 4250dbcb9e0e98 David Stevens 2020-04-22 973 if (virtgpu_dma_fence[i]) 4250dbcb9e0e98 David Stevens 2020-04-22 974 dma_fence_put(virtgpu_dma_fence[i]); e3c760a99cdc2d Zach Reizner 2017-08-14 975 #endif e3c760a99cdc2d Zach Reizner 2017-08-14 976 } e3c760a99cdc2d Zach Reizner 2017-08-14 977 return ret; e3c760a99cdc2d Zach Reizner 2017-08-14 978 } e3c760a99cdc2d Zach Reizner 2017-08-14 979 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
