tree:
https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git for-usb-next
head: f89a1ee0dfb992f7eb65e09c5fc4e9e32d94f1a3
commit: f89a1ee0dfb992f7eb65e09c5fc4e9e32d94f1a3 [3/3] usb: xhci: Use temporary buffer to
consolidate SG
config: powerpc64-randconfig-r033-20201118 (attached as .config)
compiler: powerpc-linux-gcc (GCC) 9.3.0
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
#
https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/commit/?i...
git remote add xhci
https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git
git fetch --no-tags xhci for-usb-next
git checkout f89a1ee0dfb992f7eb65e09c5fc4e9e32d94f1a3
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=powerpc64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
drivers/usb/host/xhci.c: In function 'xhci_map_temp_buffer':
> drivers/usb/host/xhci.c:1269:19: warning: variable 'xhci'
set but not used [-Wunused-but-set-variable]
1269 | struct xhci_hcd *xhci;
| ^~~~
> drivers/usb/host/xhci.c:1266:15: warning: variable 'len'
set but not used [-Wunused-but-set-variable]
1266 | unsigned int len;
| ^~~
drivers/usb/host/xhci.c: In function 'xhci_urb_temp_buffer_required':
> drivers/usb/host/xhci.c:1305:15: warning: variable
'buf_len' set but not used [-Wunused-but-set-variable]
1305 | unsigned
int buf_len;
| ^~~~~~~
drivers/usb/host/xhci.c: In function 'xhci_unmap_temp_buf':
drivers/usb/host/xhci.c:1345:15: warning: variable 'len' set but not used
[-Wunused-but-set-variable]
1345 | unsigned int len;
| ^~~
> drivers/usb/host/xhci.c:1344:22: warning: variable 'sg'
set but not used [-Wunused-but-set-variable]
1344 | struct scatterlist *sg;
| ^~
vim +/xhci +1269 drivers/usb/host/xhci.c
1261
1262 static int xhci_map_temp_buffer(struct usb_hcd *hcd, struct urb *urb)
1263 {
1264 void *temp;
1265 int ret = 0;
1266 unsigned int len;
1267 unsigned int buf_len;
1268 enum dma_data_direction dir;
1269 struct xhci_hcd *xhci;
1270
1271 xhci = hcd_to_xhci(hcd);
1272 dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
1273 buf_len = urb->transfer_buffer_length;
1274
1275 temp = kzalloc_node(buf_len, GFP_ATOMIC,
1276 dev_to_node(hcd->self.sysdev));
1277
1278 if (usb_urb_dir_out(urb))
1279 len = sg_pcopy_to_buffer(urb->sg, urb->num_sgs,
1280 temp, buf_len, 0);
1281
1282 urb->transfer_buffer = temp;
1283 urb->transfer_dma = dma_map_single(hcd->self.sysdev,
1284 urb->transfer_buffer,
1285 urb->transfer_buffer_length,
1286 dir);
1287
1288 if (dma_mapping_error(hcd->self.sysdev,
1289 urb->transfer_dma)) {
1290 ret = -EAGAIN;
1291 kfree(temp);
1292 } else {
1293 urb->transfer_flags |= URB_DMA_MAP_SINGLE;
1294 }
1295
1296 return ret;
1297 }
1298
1299 static bool xhci_urb_temp_buffer_required(struct usb_hcd *hcd,
1300 struct urb *urb)
1301 {
1302 bool ret = false;
1303 unsigned int i;
1304 unsigned int len = 0;
1305 unsigned int buf_len;
1306 unsigned int trb_size;
1307 unsigned int max_pkt;
1308 struct scatterlist *sg;
1309 struct scatterlist *tail_sg;
1310
1311 sg = urb->sg;
1312 tail_sg = urb->sg;
1313 buf_len = urb->transfer_buffer_length;
1314 max_pkt = usb_endpoint_maxp(&urb->ep->desc);
1315
1316 if (!urb->num_sgs)
1317 return ret;
1318
1319 if (urb->dev->speed >= USB_SPEED_SUPER)
1320 trb_size = TRB_CACHE_SIZE_SS;
1321 else
1322 trb_size = TRB_CACHE_SIZE_HS;
1323
1324 if (urb->transfer_buffer_length != 0 &&
1325 !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) {
1326 for_each_sg(urb->sg, sg, urb->num_sgs, i) {
1327 len = len + sg->length;
1328 if (i > trb_size - 2) {
1329 len = len - tail_sg->length;
1330 if (len < max_pkt) {
1331 ret = true;
1332 break;
1333 }
1334
1335 tail_sg = sg_next(tail_sg);
1336 }
1337 }
1338 }
1339 return ret;
1340 }
1341
1342 static void xhci_unmap_temp_buf(struct usb_hcd *hcd, struct urb *urb)
1343 {
1344 struct scatterlist *sg;
1345 unsigned int len;
1346 unsigned int buf_len;
1347 enum dma_data_direction dir;
1348
1349 dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
1350
1351 sg = urb->sg;
1352 buf_len = urb->transfer_buffer_length;
1353
1354 if (IS_ENABLED(CONFIG_HAS_DMA) &&
1355 (urb->transfer_flags & URB_DMA_MAP_SINGLE))
1356 dma_unmap_single(hcd->self.sysdev,
1357 urb->transfer_dma,
1358 urb->transfer_buffer_length,
1359 dir);
1360
1361 if (usb_urb_dir_in(urb))
1362 len = sg_pcopy_from_buffer(urb->sg, urb->num_sgs,
1363 urb->transfer_buffer,
1364 buf_len,
1365 0);
1366
1367 urb->transfer_flags &= ~URB_DMA_MAP_SINGLE;
1368 kfree(urb->transfer_buffer);
1369 urb->transfer_buffer = NULL;
1370 }
1371
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org