Message ID | 20200618153956.29558-5-m.szyprowski@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | DRM: fix struct sg_table nents vs. orig_nents misuse | expand |
Hi Marek, I love your patch! Perhaps something to improve: [auto build test WARNING on next-20200618] [also build test WARNING on v5.8-rc1] [cannot apply to linuxtv-media/master staging/staging-testing drm-exynos/exynos-drm-next drm-intel/for-linux-next linus/master v5.8-rc1 v5.7 v5.7-rc7] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Marek-Szyprowski/DRM-fix-struct-sg_table-nents-vs-orig_nents-misuse/20200619-000417 base: ce2cc8efd7a40cbd17841add878cb691d0ce0bba config: alpha-allyesconfig (attached as .config) compiler: alpha-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 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>, old ones prefixed by <<): In file included from include/linux/dma-mapping.h:11, from drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:25: drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c: In function 'amdgpu_vram_mgr_alloc_sgt': include/linux/scatterlist.h:158:17: error: '*sgt' is a pointer; did you mean to use '->'? 158 | for_each_sg(sgt->sgl, sg, sgt->orig_nents, i) | ^~ include/linux/scatterlist.h:152:22: note: in definition of macro 'for_each_sg' 152 | for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) | ^~~~~~ >> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:480:2: note: in expansion of macro 'for_each_sgtable_sg' 480 | for_each_sgtable_sg(*sgt, sg, i) | ^~~~~~~~~~~~~~~~~~~ include/linux/scatterlist.h:158:31: error: '*sgt' is a pointer; did you mean to use '->'? 158 | for_each_sg(sgt->sgl, sg, sgt->orig_nents, i) | ^~ include/linux/scatterlist.h:152:38: note: in definition of macro 'for_each_sg' 152 | for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) | ^~ >> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:480:2: note: in expansion of macro 'for_each_sgtable_sg' 480 | for_each_sgtable_sg(*sgt, sg, i) | ^~~~~~~~~~~~~~~~~~~ include/linux/scatterlist.h:158:17: error: '*sgt' is a pointer; did you mean to use '->'? 158 | for_each_sg(sgt->sgl, sg, sgt->orig_nents, i) | ^~ include/linux/scatterlist.h:152:22: note: in definition of macro 'for_each_sg' 152 | for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) | ^~~~~~ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:484:2: note: in expansion of macro 'for_each_sgtable_sg' 484 | for_each_sgtable_sg(*sgt, sg, i) { | ^~~~~~~~~~~~~~~~~~~ include/linux/scatterlist.h:158:31: error: '*sgt' is a pointer; did you mean to use '->'? 158 | for_each_sg(sgt->sgl, sg, sgt->orig_nents, i) | ^~ include/linux/scatterlist.h:152:38: note: in definition of macro 'for_each_sg' 152 | for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) | ^~ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:484:2: note: in expansion of macro 'for_each_sgtable_sg' 484 | for_each_sgtable_sg(*sgt, sg, i) { | ^~~~~~~~~~~~~~~~~~~ include/linux/scatterlist.h:158:17: error: '*sgt' is a pointer; did you mean to use '->'? 158 | for_each_sg(sgt->sgl, sg, sgt->orig_nents, i) | ^~ include/linux/scatterlist.h:152:22: note: in definition of macro 'for_each_sg' 152 | for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) | ^~~~~~ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:504:2: note: in expansion of macro 'for_each_sgtable_sg' 504 | for_each_sgtable_sg(*sgt, sg, i) { | ^~~~~~~~~~~~~~~~~~~ include/linux/scatterlist.h:158:31: error: '*sgt' is a pointer; did you mean to use '->'? 158 | for_each_sg(sgt->sgl, sg, sgt->orig_nents, i) | ^~ include/linux/scatterlist.h:152:38: note: in definition of macro 'for_each_sg' 152 | for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) | ^~ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:504:2: note: in expansion of macro 'for_each_sgtable_sg' 504 | for_each_sgtable_sg(*sgt, sg, i) { | ^~~~~~~~~~~~~~~~~~~ In file included from drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:26: At top level: drivers/gpu/drm/amd/amdgpu/amdgpu.h:190:18: warning: 'sched_policy' defined but not used [-Wunused-const-variable=] 190 | static const int sched_policy = KFD_SCHED_POLICY_HWS; | ^~~~~~~~~~~~ In file included from drivers/gpu/drm/amd/amdgpu/../display/dc/dc_types.h:33, from drivers/gpu/drm/amd/amdgpu/../display/dc/dm_services_types.h:30, from drivers/gpu/drm/amd/amdgpu/../include/dm_pp_interface.h:26, from drivers/gpu/drm/amd/amdgpu/amdgpu.h:65, from drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:26: drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:76:32: warning: 'dc_fixpt_ln2_div_2' defined but not used [-Wunused-const-variable=] 76 | static const struct fixed31_32 dc_fixpt_ln2_div_2 = { 1488522236LL }; | ^~~~~~~~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:75:32: warning: 'dc_fixpt_ln2' defined but not used [-Wunused-const-variable=] 75 | static const struct fixed31_32 dc_fixpt_ln2 = { 2977044471LL }; | ^~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:74:32: warning: 'dc_fixpt_e' defined but not used [-Wunused-const-variable=] 74 | static const struct fixed31_32 dc_fixpt_e = { 11674931555LL }; | ^~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:73:32: warning: 'dc_fixpt_two_pi' defined but not used [-Wunused-const-variable=] 73 | static const struct fixed31_32 dc_fixpt_two_pi = { 26986075409LL }; | ^~~~~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:72:32: warning: 'dc_fixpt_pi' defined but not used [-Wunused-const-variable=] 72 | static const struct fixed31_32 dc_fixpt_pi = { 13493037705LL }; | ^~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:67:32: warning: 'dc_fixpt_zero' defined but not used [-Wunused-const-variable=] 67 | static const struct fixed31_32 dc_fixpt_zero = { 0 }; | ^~~~~~~~~~~~~ vim +/for_each_sgtable_sg +480 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c 444 445 /** 446 * amdgpu_vram_mgr_alloc_sgt - allocate and fill a sg table 447 * 448 * @adev: amdgpu device pointer 449 * @mem: TTM memory object 450 * @dev: the other device 451 * @dir: dma direction 452 * @sgt: resulting sg table 453 * 454 * Allocate and fill a sg table from a VRAM allocation. 455 */ 456 int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, 457 struct ttm_mem_reg *mem, 458 struct device *dev, 459 enum dma_data_direction dir, 460 struct sg_table **sgt) 461 { 462 struct drm_mm_node *node; 463 struct scatterlist *sg; 464 int num_entries = 0; 465 unsigned int pages; 466 int i, r; 467 468 *sgt = kmalloc(sizeof(*sg), GFP_KERNEL); 469 if (!*sgt) 470 return -ENOMEM; 471 472 for (pages = mem->num_pages, node = mem->mm_node; 473 pages; pages -= node->size, ++node) 474 ++num_entries; 475 476 r = sg_alloc_table(*sgt, num_entries, GFP_KERNEL); 477 if (r) 478 goto error_free; 479 > 480 for_each_sgtable_sg(*sgt, sg, i) 481 sg->length = 0; 482 483 node = mem->mm_node; 484 for_each_sgtable_sg(*sgt, sg, i) { 485 phys_addr_t phys = (node->start << PAGE_SHIFT) + 486 adev->gmc.aper_base; 487 size_t size = node->size << PAGE_SHIFT; 488 dma_addr_t addr; 489 490 ++node; 491 addr = dma_map_resource(dev, phys, size, dir, 492 DMA_ATTR_SKIP_CPU_SYNC); 493 r = dma_mapping_error(dev, addr); 494 if (r) 495 goto error_unmap; 496 497 sg_set_page(sg, NULL, size, 0); 498 sg_dma_address(sg) = addr; 499 sg_dma_len(sg) = size; 500 } 501 return 0; 502 503 error_unmap: 504 for_each_sgtable_sg(*sgt, sg, i) { 505 if (!sg->length) 506 continue; 507 508 dma_unmap_resource(dev, sg->dma_address, 509 sg->length, dir, 510 DMA_ATTR_SKIP_CPU_SYNC); 511 } 512 sg_free_table(*sgt); 513 514 error_free: 515 kfree(*sgt); 516 return r; 517 } 518 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index 43d8ed7dbd00..519ce4427fce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -307,8 +307,8 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach, if (IS_ERR(sgt)) return sgt; - if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir, - DMA_ATTR_SKIP_CPU_SYNC)) + if (dma_map_sgtable(attach->dev, sgt, dir, + DMA_ATTR_SKIP_CPU_SYNC)) goto error_free; break; @@ -349,7 +349,7 @@ static void amdgpu_dma_buf_unmap(struct dma_buf_attachment *attach, struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); if (sgt->sgl->page_link) { - dma_unmap_sg(attach->dev, sgt->sgl, sgt->nents, dir); + dma_unmap_sgtable(attach->dev, sgt, dir, 0); sg_free_table(sgt); kfree(sgt); } else { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 5129a996e941..97fb73e5a6ae 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1025,7 +1025,6 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm) { struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); struct amdgpu_ttm_tt *gtt = (void *)ttm; - unsigned nents; int r; int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY); @@ -1040,9 +1039,8 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm) goto release_sg; /* Map SG to device */ - r = -ENOMEM; - nents = dma_map_sg(adev->dev, ttm->sg->sgl, ttm->sg->nents, direction); - if (nents == 0) + r = dma_map_sgtable(adev->dev, ttm->sg, direction, 0); + if (r) goto release_sg; /* convert SG to linear array of pages and dma addresses */ @@ -1073,8 +1071,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) return; /* unmap the pages mapped to the device */ - dma_unmap_sg(adev->dev, ttm->sg->sgl, ttm->sg->nents, direction); - + dma_unmap_sgtable(adev->dev, ttm->sg, direction, 0); sg_free_table(ttm->sg); #if IS_ENABLED(CONFIG_DRM_AMDGPU_USERPTR) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index d399e5893170..75495a7898b9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -477,11 +477,11 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, if (r) goto error_free; - for_each_sg((*sgt)->sgl, sg, num_entries, i) + for_each_sgtable_sg(*sgt, sg, i) sg->length = 0; node = mem->mm_node; - for_each_sg((*sgt)->sgl, sg, num_entries, i) { + for_each_sgtable_sg(*sgt, sg, i) { phys_addr_t phys = (node->start << PAGE_SHIFT) + adev->gmc.aper_base; size_t size = node->size << PAGE_SHIFT; @@ -501,7 +501,7 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, return 0; error_unmap: - for_each_sg((*sgt)->sgl, sg, num_entries, i) { + for_each_sgtable_sg(*sgt, sg, i) { if (!sg->length) continue; @@ -532,7 +532,7 @@ void amdgpu_vram_mgr_free_sgt(struct amdgpu_device *adev, struct scatterlist *sg; int i; - for_each_sg(sgt->sgl, sg, sgt->nents, i) + for_each_sgtable_sg(sgt, sg, i) dma_unmap_resource(dev, sg->dma_address, sg->length, dir, DMA_ATTR_SKIP_CPU_SYNC);