CC: [email protected] CC: [email protected] TO: Martin Krastev <[email protected]> CC: Zack Rusin <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 1c52283265a462a100ae63ddf58b4e5884acde86 commit: 7a7a933edd6c3a6d5d64e08093f2d564104cefcd drm/vmwgfx: Introduce VMware mks-guest-stats date: 8 months ago :::::: branch date: 11 hours ago :::::: commit date: 8 months ago compiler: aarch64-linux-gcc (GCC) 11.2.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> cppcheck possible warnings: (new ones prefixed by >>, may not real problems) >> drivers/message/fusion/mptbase.c:2888:3: warning: Variable 'i' is modified >> but its new value is never used. [unreadVariable] i++; ^ >> drivers/gpu/drm/vmwgfx/vmwgfx_msg.c:1024:37: warning: Uninitialized >> variable: pdesc [uninitvar] struct page *pages_stat[ARRAY_SIZE(pdesc->statPPNs)]; ^ drivers/gpu/drm/vmwgfx/vmwgfx_msg.c:1025:37: warning: Uninitialized variable: pdesc [uninitvar] struct page *pages_info[ARRAY_SIZE(pdesc->infoPPNs)]; ^ drivers/gpu/drm/vmwgfx/vmwgfx_msg.c:1026:37: warning: Uninitialized variable: pdesc [uninitvar] struct page *pages_strs[ARRAY_SIZE(pdesc->strsPPNs)]; ^ drivers/gpu/drm/vmwgfx/vmwgfx_msg.c:1040:34: warning: Uninitialized variable: pdesc [uninitvar] if (num_pages_stat > ARRAY_SIZE(pdesc->statPPNs) || ^ vim +1024 drivers/gpu/drm/vmwgfx/vmwgfx_msg.c 7a7a933edd6c3a Martin Krastev 2021-06-09 993 7a7a933edd6c3a Martin Krastev 2021-06-09 994 /** 7a7a933edd6c3a Martin Krastev 2021-06-09 995 * vmw_mksstat_add_ioctl: Creates a single userspace-originating mksGuestStat 7a7a933edd6c3a Martin Krastev 2021-06-09 996 * instance descriptor and registers that with the hypervisor. 7a7a933edd6c3a Martin Krastev 2021-06-09 997 * 7a7a933edd6c3a Martin Krastev 2021-06-09 998 * Create a hypervisor PFN mapping, containing a single mksGuestStat instance 7a7a933edd6c3a Martin Krastev 2021-06-09 999 * descriptor and pin the corresponding userspace pages. 7a7a933edd6c3a Martin Krastev 2021-06-09 1000 * 7a7a933edd6c3a Martin Krastev 2021-06-09 1001 * @dev: Identifies the drm device. 7a7a933edd6c3a Martin Krastev 2021-06-09 1002 * @data: Pointer to the ioctl argument. 7a7a933edd6c3a Martin Krastev 2021-06-09 1003 * @file_priv: Identifies the caller; unused. 7a7a933edd6c3a Martin Krastev 2021-06-09 1004 * Return: Zero on success, negative error code on error. 7a7a933edd6c3a Martin Krastev 2021-06-09 1005 */ 7a7a933edd6c3a Martin Krastev 2021-06-09 1006 7a7a933edd6c3a Martin Krastev 2021-06-09 1007 int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data, 7a7a933edd6c3a Martin Krastev 2021-06-09 1008 struct drm_file *file_priv) 7a7a933edd6c3a Martin Krastev 2021-06-09 1009 { 7a7a933edd6c3a Martin Krastev 2021-06-09 1010 struct drm_vmw_mksstat_add_arg *arg = 7a7a933edd6c3a Martin Krastev 2021-06-09 1011 (struct drm_vmw_mksstat_add_arg *) data; 7a7a933edd6c3a Martin Krastev 2021-06-09 1012 7a7a933edd6c3a Martin Krastev 2021-06-09 1013 struct vmw_private *const dev_priv = vmw_priv(dev); 7a7a933edd6c3a Martin Krastev 2021-06-09 1014 7a7a933edd6c3a Martin Krastev 2021-06-09 1015 struct page *page; 7a7a933edd6c3a Martin Krastev 2021-06-09 1016 MKSGuestStatInstanceDescriptor *pdesc; 7a7a933edd6c3a Martin Krastev 2021-06-09 1017 const size_t num_pages_stat = vmw_num_pages(arg->stat_len); 7a7a933edd6c3a Martin Krastev 2021-06-09 1018 const size_t num_pages_info = vmw_num_pages(arg->info_len); 7a7a933edd6c3a Martin Krastev 2021-06-09 1019 const size_t num_pages_strs = vmw_num_pages(arg->strs_len); 7a7a933edd6c3a Martin Krastev 2021-06-09 1020 long desc_len; 7a7a933edd6c3a Martin Krastev 2021-06-09 1021 long nr_pinned_stat; 7a7a933edd6c3a Martin Krastev 2021-06-09 1022 long nr_pinned_info; 7a7a933edd6c3a Martin Krastev 2021-06-09 1023 long nr_pinned_strs; 7a7a933edd6c3a Martin Krastev 2021-06-09 @1024 struct page *pages_stat[ARRAY_SIZE(pdesc->statPPNs)]; 7a7a933edd6c3a Martin Krastev 2021-06-09 1025 struct page *pages_info[ARRAY_SIZE(pdesc->infoPPNs)]; 7a7a933edd6c3a Martin Krastev 2021-06-09 1026 struct page *pages_strs[ARRAY_SIZE(pdesc->strsPPNs)]; 7a7a933edd6c3a Martin Krastev 2021-06-09 1027 size_t i, slot; 7a7a933edd6c3a Martin Krastev 2021-06-09 1028 7a7a933edd6c3a Martin Krastev 2021-06-09 1029 arg->id = -1; 7a7a933edd6c3a Martin Krastev 2021-06-09 1030 7a7a933edd6c3a Martin Krastev 2021-06-09 1031 if (!arg->stat || !arg->info || !arg->strs) 7a7a933edd6c3a Martin Krastev 2021-06-09 1032 return -EINVAL; 7a7a933edd6c3a Martin Krastev 2021-06-09 1033 7a7a933edd6c3a Martin Krastev 2021-06-09 1034 if (!arg->stat_len || !arg->info_len || !arg->strs_len) 7a7a933edd6c3a Martin Krastev 2021-06-09 1035 return -EINVAL; 7a7a933edd6c3a Martin Krastev 2021-06-09 1036 7a7a933edd6c3a Martin Krastev 2021-06-09 1037 if (!arg->description) 7a7a933edd6c3a Martin Krastev 2021-06-09 1038 return -EINVAL; 7a7a933edd6c3a Martin Krastev 2021-06-09 1039 7a7a933edd6c3a Martin Krastev 2021-06-09 1040 if (num_pages_stat > ARRAY_SIZE(pdesc->statPPNs) || 7a7a933edd6c3a Martin Krastev 2021-06-09 1041 num_pages_info > ARRAY_SIZE(pdesc->infoPPNs) || 7a7a933edd6c3a Martin Krastev 2021-06-09 1042 num_pages_strs > ARRAY_SIZE(pdesc->strsPPNs)) 7a7a933edd6c3a Martin Krastev 2021-06-09 1043 return -EINVAL; 7a7a933edd6c3a Martin Krastev 2021-06-09 1044 7a7a933edd6c3a Martin Krastev 2021-06-09 1045 /* Find an available slot in the mksGuestStats user array and reserve it */ 7a7a933edd6c3a Martin Krastev 2021-06-09 1046 for (slot = 0; slot < ARRAY_SIZE(dev_priv->mksstat_user_pids); ++slot) 7a7a933edd6c3a Martin Krastev 2021-06-09 1047 if (!atomic_cmpxchg(&dev_priv->mksstat_user_pids[slot], 0, MKSSTAT_PID_RESERVED)) 7a7a933edd6c3a Martin Krastev 2021-06-09 1048 break; 7a7a933edd6c3a Martin Krastev 2021-06-09 1049 7a7a933edd6c3a Martin Krastev 2021-06-09 1050 if (slot == ARRAY_SIZE(dev_priv->mksstat_user_pids)) 7a7a933edd6c3a Martin Krastev 2021-06-09 1051 return -ENOSPC; 7a7a933edd6c3a Martin Krastev 2021-06-09 1052 7a7a933edd6c3a Martin Krastev 2021-06-09 1053 BUG_ON(dev_priv->mksstat_user_pages[slot]); 7a7a933edd6c3a Martin Krastev 2021-06-09 1054 7a7a933edd6c3a Martin Krastev 2021-06-09 1055 /* Allocate a page for the instance descriptor */ 7a7a933edd6c3a Martin Krastev 2021-06-09 1056 page = alloc_page(GFP_KERNEL | __GFP_ZERO); 7a7a933edd6c3a Martin Krastev 2021-06-09 1057 7a7a933edd6c3a Martin Krastev 2021-06-09 1058 if (!page) { 7a7a933edd6c3a Martin Krastev 2021-06-09 1059 atomic_set(&dev_priv->mksstat_user_pids[slot], 0); 7a7a933edd6c3a Martin Krastev 2021-06-09 1060 return -ENOMEM; 7a7a933edd6c3a Martin Krastev 2021-06-09 1061 } 7a7a933edd6c3a Martin Krastev 2021-06-09 1062 7a7a933edd6c3a Martin Krastev 2021-06-09 1063 /* Set up the instance descriptor */ 7a7a933edd6c3a Martin Krastev 2021-06-09 1064 pdesc = page_address(page); 7a7a933edd6c3a Martin Krastev 2021-06-09 1065 7a7a933edd6c3a Martin Krastev 2021-06-09 1066 pdesc->reservedMBZ = 0; 7a7a933edd6c3a Martin Krastev 2021-06-09 1067 pdesc->statStartVA = arg->stat; 7a7a933edd6c3a Martin Krastev 2021-06-09 1068 pdesc->strsStartVA = arg->strs; 7a7a933edd6c3a Martin Krastev 2021-06-09 1069 pdesc->statLength = arg->stat_len; 7a7a933edd6c3a Martin Krastev 2021-06-09 1070 pdesc->infoLength = arg->info_len; 7a7a933edd6c3a Martin Krastev 2021-06-09 1071 pdesc->strsLength = arg->strs_len; 7a7a933edd6c3a Martin Krastev 2021-06-09 1072 desc_len = strncpy_from_user(pdesc->description, u64_to_user_ptr(arg->description), 7a7a933edd6c3a Martin Krastev 2021-06-09 1073 ARRAY_SIZE(pdesc->description) - 1); 7a7a933edd6c3a Martin Krastev 2021-06-09 1074 7a7a933edd6c3a Martin Krastev 2021-06-09 1075 if (desc_len < 0) { 7a7a933edd6c3a Martin Krastev 2021-06-09 1076 atomic_set(&dev_priv->mksstat_user_pids[slot], 0); 7a7a933edd6c3a Martin Krastev 2021-06-09 1077 return -EFAULT; 7a7a933edd6c3a Martin Krastev 2021-06-09 1078 } 7a7a933edd6c3a Martin Krastev 2021-06-09 1079 7a7a933edd6c3a Martin Krastev 2021-06-09 1080 reset_ppn_array(pdesc->statPPNs, ARRAY_SIZE(pdesc->statPPNs)); 7a7a933edd6c3a Martin Krastev 2021-06-09 1081 reset_ppn_array(pdesc->infoPPNs, ARRAY_SIZE(pdesc->infoPPNs)); 7a7a933edd6c3a Martin Krastev 2021-06-09 1082 reset_ppn_array(pdesc->strsPPNs, ARRAY_SIZE(pdesc->strsPPNs)); 7a7a933edd6c3a Martin Krastev 2021-06-09 1083 7a7a933edd6c3a Martin Krastev 2021-06-09 1084 /* Pin mksGuestStat user pages and store those in the instance descriptor */ 7a7a933edd6c3a Martin Krastev 2021-06-09 1085 nr_pinned_stat = pin_user_pages(arg->stat, num_pages_stat, FOLL_LONGTERM, pages_stat, NULL); 7a7a933edd6c3a Martin Krastev 2021-06-09 1086 if (num_pages_stat != nr_pinned_stat) 7a7a933edd6c3a Martin Krastev 2021-06-09 1087 goto err_pin_stat; 7a7a933edd6c3a Martin Krastev 2021-06-09 1088 7a7a933edd6c3a Martin Krastev 2021-06-09 1089 for (i = 0; i < num_pages_stat; ++i) 7a7a933edd6c3a Martin Krastev 2021-06-09 1090 pdesc->statPPNs[i] = page_to_pfn(pages_stat[i]); 7a7a933edd6c3a Martin Krastev 2021-06-09 1091 7a7a933edd6c3a Martin Krastev 2021-06-09 1092 nr_pinned_info = pin_user_pages(arg->info, num_pages_info, FOLL_LONGTERM, pages_info, NULL); 7a7a933edd6c3a Martin Krastev 2021-06-09 1093 if (num_pages_info != nr_pinned_info) 7a7a933edd6c3a Martin Krastev 2021-06-09 1094 goto err_pin_info; 7a7a933edd6c3a Martin Krastev 2021-06-09 1095 7a7a933edd6c3a Martin Krastev 2021-06-09 1096 for (i = 0; i < num_pages_info; ++i) 7a7a933edd6c3a Martin Krastev 2021-06-09 1097 pdesc->infoPPNs[i] = page_to_pfn(pages_info[i]); 7a7a933edd6c3a Martin Krastev 2021-06-09 1098 7a7a933edd6c3a Martin Krastev 2021-06-09 1099 nr_pinned_strs = pin_user_pages(arg->strs, num_pages_strs, FOLL_LONGTERM, pages_strs, NULL); 7a7a933edd6c3a Martin Krastev 2021-06-09 1100 if (num_pages_strs != nr_pinned_strs) 7a7a933edd6c3a Martin Krastev 2021-06-09 1101 goto err_pin_strs; 7a7a933edd6c3a Martin Krastev 2021-06-09 1102 7a7a933edd6c3a Martin Krastev 2021-06-09 1103 for (i = 0; i < num_pages_strs; ++i) 7a7a933edd6c3a Martin Krastev 2021-06-09 1104 pdesc->strsPPNs[i] = page_to_pfn(pages_strs[i]); 7a7a933edd6c3a Martin Krastev 2021-06-09 1105 7a7a933edd6c3a Martin Krastev 2021-06-09 1106 /* Send the descriptor to the host via a hypervisor call. The mksGuestStat 7a7a933edd6c3a Martin Krastev 2021-06-09 1107 pages will remain in use until the user requests a matching remove stats 7a7a933edd6c3a Martin Krastev 2021-06-09 1108 or a stats reset occurs. */ 7a7a933edd6c3a Martin Krastev 2021-06-09 1109 hypervisor_ppn_add((PPN64)page_to_pfn(page)); 7a7a933edd6c3a Martin Krastev 2021-06-09 1110 7a7a933edd6c3a Martin Krastev 2021-06-09 1111 dev_priv->mksstat_user_pages[slot] = page; 7a7a933edd6c3a Martin Krastev 2021-06-09 1112 atomic_set(&dev_priv->mksstat_user_pids[slot], current->pid); 7a7a933edd6c3a Martin Krastev 2021-06-09 1113 7a7a933edd6c3a Martin Krastev 2021-06-09 1114 arg->id = slot; 7a7a933edd6c3a Martin Krastev 2021-06-09 1115 7a7a933edd6c3a Martin Krastev 2021-06-09 1116 DRM_DEV_INFO(dev->dev, "pid=%d arg.description='%.*s' id=%lu\n", current->pid, (int)desc_len, pdesc->description, slot); 7a7a933edd6c3a Martin Krastev 2021-06-09 1117 7a7a933edd6c3a Martin Krastev 2021-06-09 1118 return 0; 7a7a933edd6c3a Martin Krastev 2021-06-09 1119 7a7a933edd6c3a Martin Krastev 2021-06-09 1120 err_pin_strs: 7a7a933edd6c3a Martin Krastev 2021-06-09 1121 if (nr_pinned_strs > 0) 7a7a933edd6c3a Martin Krastev 2021-06-09 1122 unpin_user_pages(pages_strs, nr_pinned_strs); 7a7a933edd6c3a Martin Krastev 2021-06-09 1123 7a7a933edd6c3a Martin Krastev 2021-06-09 1124 err_pin_info: 7a7a933edd6c3a Martin Krastev 2021-06-09 1125 if (nr_pinned_info > 0) 7a7a933edd6c3a Martin Krastev 2021-06-09 1126 unpin_user_pages(pages_info, nr_pinned_info); 7a7a933edd6c3a Martin Krastev 2021-06-09 1127 7a7a933edd6c3a Martin Krastev 2021-06-09 1128 err_pin_stat: 7a7a933edd6c3a Martin Krastev 2021-06-09 1129 if (nr_pinned_stat > 0) 7a7a933edd6c3a Martin Krastev 2021-06-09 1130 unpin_user_pages(pages_stat, nr_pinned_stat); 7a7a933edd6c3a Martin Krastev 2021-06-09 1131 7a7a933edd6c3a Martin Krastev 2021-06-09 1132 atomic_set(&dev_priv->mksstat_user_pids[slot], 0); 7a7a933edd6c3a Martin Krastev 2021-06-09 1133 __free_page(page); 7a7a933edd6c3a Martin Krastev 2021-06-09 1134 return -ENOMEM; 7a7a933edd6c3a Martin Krastev 2021-06-09 1135 } 7a7a933edd6c3a Martin Krastev 2021-06-09 1136 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
