Hi Arnd,
I love your patch! Perhaps something to improve:
[auto build test WARNING on staging/staging-testing]
url:
https://github.com/0day-ci/linux/commits/Arnd-Bergmann/staging-vchiq-rewo...
base:
https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
8436f932d84b1d53d2f4a2fa88c7aacdb0313265
config: arm64-randconfig-s032-20200921 (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
reproduce:
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.2-201-g24bdaac6-dirty
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1
CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=arm64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
sparse warnings: (new ones prefixed by >>)
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1062:62: sparse: sparse:
incorrect type in argument 1 (different address spaces) @@ expected void [noderef]
__user *uptr @@ got struct vchiq_header *[noderef] __user header @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1062:62: sparse:
expected void [noderef] __user *uptr
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1062:62: sparse: got
struct vchiq_header *[noderef] __user header
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1063:62: sparse:
sparse: incorrect type in argument 1 (different address spaces) @@ expected void
[noderef] __user *uptr @@ got void *[noderef] __user service_userdata @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1063:62: sparse:
expected void [noderef] __user *uptr
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1063:62: sparse: got
void *[noderef] __user service_userdata
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1064:62: sparse:
sparse: incorrect type in argument 1 (different address spaces) @@ expected void
[noderef] __user *uptr @@ got void *[noderef] __user bulk_userdata @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1064:62: sparse:
expected void [noderef] __user *uptr
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1064:62: sparse: got
void *[noderef] __user bulk_userdata
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1161:58: sparse:
sparse: incorrect type in argument 2 (different address spaces) @@ expected void
[noderef] __user *ubuf @@ got void *** @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1161:58: sparse:
expected void [noderef] __user *ubuf
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1161:58: sparse: got
void ***
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1189:46: sparse: sparse:
incorrect type in argument 1 (different address spaces) @@ expected struct
vchiq_completion_data [noderef] __user *buf @@ got struct vchiq_completion_data *buf
@@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1189:46: sparse:
expected struct vchiq_completion_data [noderef] __user *buf
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1189:46: sparse:
got struct vchiq_completion_data *buf
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1576:50: sparse: sparse:
incorrect type in initializer (different address spaces) @@ expected int enum
vchiq_status ( *callback )( ... ) @@ got void [noderef] __user * @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1576:50: sparse:
expected int enum vchiq_status ( *callback )( ... )
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1576:50: sparse: got
void [noderef] __user *
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1577:50: sparse: sparse:
incorrect type in initializer (different address spaces) @@ expected void *userdata @@
got void [noderef] __user * @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1577:50: sparse:
expected void *userdata
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1577:50: sparse: got
void [noderef] __user *
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1692:39: sparse: sparse:
incorrect type in initializer (different address spaces) @@ expected void *data @@
got void [noderef] __user * @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1692:39: sparse:
expected void *data
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1692:39: sparse: got
void [noderef] __user *
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1694:39: sparse: sparse:
incorrect type in initializer (different address spaces) @@ expected void *userdata @@
got void [noderef] __user * @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1694:39: sparse:
expected void *userdata
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1694:39: sparse: got
void [noderef] __user *
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1721:37: sparse: sparse:
incorrect type in argument 2 (different address spaces) @@ expected void const
[noderef] __user *from @@ got struct vchiq_await_completion32 *argp @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1721:37: sparse:
expected void const [noderef] __user *from
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1721:37: sparse:
got struct vchiq_await_completion32 *argp
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1726:45: sparse:
sparse: incorrect type in initializer (different address spaces) @@ expected struct
vchiq_completion_data *buf @@ got void [noderef] __user * @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1726:45: sparse:
expected struct vchiq_completion_data *buf
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1726:45: sparse: got
void [noderef] __user *
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1729:45: sparse: sparse:
incorrect type in initializer (different address spaces) @@ expected void **msgbufs @@
got void [noderef] __user * @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1729:45: sparse:
expected void **msgbufs
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1729:45: sparse: got
void [noderef] __user *
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1733:44: sparse: sparse:
incorrect type in argument 3 (different address spaces) @@ expected int [noderef]
__user *msgbufcountp @@ got unsigned int * @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1733:44: sparse:
expected int [noderef] __user *msgbufcountp
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1733:44: sparse: got
unsigned int *
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1761:45: sparse: sparse:
incorrect type in initializer (different address spaces) @@ expected void *buf @@
got void [noderef] __user * @@
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1761:45: sparse:
expected void *buf
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1761:45: sparse: got
void [noderef] __user *
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1810:71: sparse: sparse:
incorrect type in argument 3 (different address spaces) @@ expected struct
vchiq_await_completion32 *argp @@ got void [noderef] __user *argp @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1810:71: sparse:
expected struct vchiq_await_completion32 *argp
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1810:71: sparse:
got void [noderef] __user *argp
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1061:45: sparse:
sparse: dereference of noderef expression
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1062:59: sparse: sparse:
dereference of noderef expression
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1062:59: sparse: sparse:
dereference of noderef expression
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1063:59: sparse: sparse:
dereference of noderef expression
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1063:59: sparse: sparse:
dereference of noderef expression
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1064:59: sparse: sparse:
dereference of noderef expression
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1064:59: sparse: sparse:
dereference of noderef expression
>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1041:23: sparse: sparse:
incorrect type in assignment (different address spaces) @@ expected void [noderef]
__user **buf @@ got void [noderef] __user * @@
> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1041:23: sparse:
expected void [noderef] __user **buf
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:1041:23: sparse: got
void [noderef] __user *
#
https://github.com/0day-ci/linux/commit/48ebebc07ae630cd52c464744a288cea1...
git remote add linux-review
https://github.com/0day-ci/linux
git fetch --no-tags linux-review
Arnd-Bergmann/staging-vchiq-rework-compat-handling/20200918-185438
git checkout 48ebebc07ae630cd52c464744a288cea110d8bcb
vim +1062 drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
1029
1030 static inline int vchiq_get_user_ptr(void __user **buf, void __user *ubuf, int
index)
1031 {
1032 compat_uptr_t ptr32;
1033 int ret;
1034
1035 if (in_compat_syscall()) {
1036 compat_uptr_t __user *uptr = ubuf;
1037 ret = get_user(ptr32, &uptr[index]);
1038 *buf = compat_ptr(ptr32);
1039 } else {
1040 void __user *__user *uptr = ubuf;
1041 ret = get_user(buf, &uptr[index]);
1042 }
1043 return ret;
1044 }
1045
1046 struct vchiq_completion_data32 {
1047 enum vchiq_reason reason;
1048 compat_uptr_t header;
1049 compat_uptr_t service_userdata;
1050 compat_uptr_t bulk_userdata;
1051 };
1052
1053 static int vchiq_put_completion(struct vchiq_completion_data __user *buf,
1054 struct vchiq_completion_data *completion,
1055 int index)
1056 {
1057 struct vchiq_completion_data32 __user *buf32 = (void __user *)buf;
1058
1059 if (in_compat_syscall()) {
1060 struct vchiq_completion_data32 tmp = {
1061 .reason = buf->reason,
1062 .header = ptr_to_compat(buf->header),
1063 .service_userdata = ptr_to_compat(buf->service_userdata),
1064 .bulk_userdata = ptr_to_compat(buf->bulk_userdata),
1065 };
1066 if (copy_to_user(&buf32[index], &tmp, sizeof(tmp)))
1067 return -EFAULT;
1068 } else {
1069 if (copy_to_user(&buf[index], completion, sizeof(*completion)))
1070 return -EFAULT;
1071 }
1072
1073 return 0;
1074 }
1075
1076 static int vchiq_ioc_await_completion(struct vchiq_instance *instance,
1077 struct vchiq_await_completion *args,
1078 int __user *msgbufcountp)
1079 {
1080 int msgbufcount;
1081 int remove;
1082 int ret;
1083
1084 DEBUG_INITIALISE(g_state.local)
1085
1086 DEBUG_TRACE(AWAIT_COMPLETION_LINE);
1087 if (!instance->connected) {
1088 return -ENOTCONN;
1089 }
1090
1091 mutex_lock(&instance->completion_mutex);
1092
1093 DEBUG_TRACE(AWAIT_COMPLETION_LINE);
1094 while ((instance->completion_remove ==
1095 instance->completion_insert)
1096 && !instance->closing) {
1097 int rc;
1098
1099 DEBUG_TRACE(AWAIT_COMPLETION_LINE);
1100 mutex_unlock(&instance->completion_mutex);
1101 rc = wait_for_completion_interruptible(
1102 &instance->insert_event);
1103 mutex_lock(&instance->completion_mutex);
1104 if (rc) {
1105 DEBUG_TRACE(AWAIT_COMPLETION_LINE);
1106 vchiq_log_info(vchiq_arm_log_level,
1107 "AWAIT_COMPLETION interrupted");
1108 ret = -EINTR;
1109 goto out;
1110 }
1111 }
1112 DEBUG_TRACE(AWAIT_COMPLETION_LINE);
1113
1114 msgbufcount = args->msgbufcount;
1115 remove = instance->completion_remove;
1116
1117 for (ret = 0; ret < args->count; ret++) {
1118 struct vchiq_completion_data *completion;
1119 struct vchiq_service *service;
1120 struct user_service *user_service;
1121 struct vchiq_header *header;
1122
1123 if (remove == instance->completion_insert)
1124 break;
1125
1126 completion = &instance->completions[
1127 remove & (MAX_COMPLETIONS - 1)];
1128
1129 /*
1130 * A read memory barrier is needed to stop
1131 * prefetch of a stale completion record
1132 */
1133 rmb();
1134
1135 service = completion->service_userdata;
1136 user_service = service->base.userdata;
1137 completion->service_userdata = user_service->userdata;
1138
1139 header = completion->header;
1140 if (header) {
1141 void __user *msgbuf;
1142 int msglen;
1143
1144 msglen = header->size + sizeof(struct vchiq_header);
1145 /* This must be a VCHIQ-style service */
1146 if (args->msgbufsize < msglen) {
1147 vchiq_log_error(vchiq_arm_log_level,
1148 "header %pK: msgbufsize %x < msglen %x",
1149 header, args->msgbufsize, msglen);
1150 WARN(1, "invalid message size\n");
1151 if (ret == 0)
1152 ret = -EMSGSIZE;
1153 break;
1154 }
1155 if (msgbufcount <= 0)
1156 /* Stall here for lack of a
1157 ** buffer for the message. */
1158 break;
1159 /* Get the pointer from user space */
1160 msgbufcount--;
1161 if (vchiq_get_user_ptr(&msgbuf, &args->msgbufs,
1162 msgbufcount)) {
1163 if (ret == 0)
1164 ret = -EFAULT;
1165 break;
1166 }
1167
1168 /* Copy the message to user space */
1169 if (copy_to_user(msgbuf, header, msglen)) {
1170 if (ret == 0)
1171 ret = -EFAULT;
1172 break;
1173 }
1174
1175 /* Now it has been copied, the message
1176 ** can be released. */
1177 vchiq_release_message(service->handle, header);
1178
1179 /* The completion must point to the
1180 ** msgbuf. */
1181 completion->header =
1182 (struct vchiq_header __force *)msgbuf;
1183 }
1184
1185 if ((completion->reason == VCHIQ_SERVICE_CLOSED) &&
1186 !instance->use_close_delivered)
1187 unlock_service(service);
1188
1189 if (vchiq_put_completion(args->buf, completion, ret)) {
1190 if (ret == 0)
1191 ret = -EFAULT;
1192 break;
1193 }
1194
1195 /*
1196 * Ensure that the above copy has completed
1197 * before advancing the remove pointer.
1198 */
1199 mb();
1200 remove++;
1201 instance->completion_remove = remove;
1202 }
1203
1204 if (msgbufcount != args->msgbufcount) {
1205 if (put_user(msgbufcount, msgbufcountp))
1206 ret = -EFAULT;
1207 }
1208 out:
1209 if (ret)
1210 complete(&instance->remove_event);
1211 mutex_unlock(&instance->completion_mutex);
1212 DEBUG_TRACE(AWAIT_COMPLETION_LINE);
1213
1214 return ret;
1215 }
1216
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org