tree: git://anongit.freedesktop.org/drm/drm-misc for-linux-next-fixes head: 4481913607e58196c48a4fef5e6f45350684ec3c commit: 4481913607e58196c48a4fef5e6f45350684ec3c [1/1] drm/ttm: fix bulk_move corruption when adding a entry config: x86_64-defconfig (https://download.01.org/0day-ci/archive/20230623/202306230747.Ws6Fhv2o-lkp@xxxxxxxxx/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce: (https://download.01.org/0day-ci/archive/20230623/202306230747.Ws6Fhv2o-lkp@xxxxxxxxx/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@xxxxxxxxx> | Closes: https://lore.kernel.org/oe-kbuild-all/202306230747.Ws6Fhv2o-lkp@xxxxxxxxx/ All warnings (new ones prefixed by >>): In file included from include/linux/build_bug.h:5, from include/linux/init.h:5, from include/linux/io.h:10, from include/linux/iosys-map.h:10, from drivers/gpu/drm/ttm/ttm_resource.c:25: drivers/gpu/drm/ttm/ttm_resource.c: In function 'ttm_lru_bulk_move_del': >> drivers/gpu/drm/ttm/ttm_resource.c:117:40: warning: suggest parentheses around '&&' within '||' [-Wparentheses] 117 | pos->first == res && pos->last == res)) { | ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:77:45: note: in definition of macro 'unlikely' 77 | # define unlikely(x) __builtin_expect(!!(x), 0) | ^ vim +117 drivers/gpu/drm/ttm/ttm_resource.c > 25 #include <linux/iosys-map.h> 26 #include <linux/io-mapping.h> 27 #include <linux/scatterlist.h> 28 29 #include <drm/ttm/ttm_bo.h> 30 #include <drm/ttm/ttm_placement.h> 31 #include <drm/ttm/ttm_resource.h> 32 33 /** 34 * ttm_lru_bulk_move_init - initialize a bulk move structure 35 * @bulk: the structure to init 36 * 37 * For now just memset the structure to zero. 38 */ 39 void ttm_lru_bulk_move_init(struct ttm_lru_bulk_move *bulk) 40 { 41 memset(bulk, 0, sizeof(*bulk)); 42 } 43 EXPORT_SYMBOL(ttm_lru_bulk_move_init); 44 45 /** 46 * ttm_lru_bulk_move_tail - bulk move range of resources to the LRU tail. 47 * 48 * @bulk: bulk move structure 49 * 50 * Bulk move BOs to the LRU tail, only valid to use when driver makes sure that 51 * resource order never changes. Should be called with &ttm_device.lru_lock held. 52 */ 53 void ttm_lru_bulk_move_tail(struct ttm_lru_bulk_move *bulk) 54 { 55 unsigned i, j; 56 57 for (i = 0; i < TTM_NUM_MEM_TYPES; ++i) { 58 for (j = 0; j < TTM_MAX_BO_PRIORITY; ++j) { 59 struct ttm_lru_bulk_move_pos *pos = &bulk->pos[i][j]; 60 struct ttm_resource_manager *man; 61 62 if (!pos->first) 63 continue; 64 65 lockdep_assert_held(&pos->first->bo->bdev->lru_lock); 66 dma_resv_assert_held(pos->first->bo->base.resv); 67 dma_resv_assert_held(pos->last->bo->base.resv); 68 69 man = ttm_manager_type(pos->first->bo->bdev, i); 70 list_bulk_move_tail(&man->lru[j], &pos->first->lru, 71 &pos->last->lru); 72 } 73 } 74 } 75 EXPORT_SYMBOL(ttm_lru_bulk_move_tail); 76 77 /* Return the bulk move pos object for this resource */ 78 static struct ttm_lru_bulk_move_pos * 79 ttm_lru_bulk_move_pos(struct ttm_lru_bulk_move *bulk, struct ttm_resource *res) 80 { 81 return &bulk->pos[res->mem_type][res->bo->priority]; 82 } 83 84 /* Move the resource to the tail of the bulk move range */ 85 static void ttm_lru_bulk_move_pos_tail(struct ttm_lru_bulk_move_pos *pos, 86 struct ttm_resource *res) 87 { 88 if (pos->last != res) { 89 if (pos->first == res) 90 pos->first = list_next_entry(res, lru); 91 list_move(&res->lru, &pos->last->lru); 92 pos->last = res; 93 } 94 } 95 96 /* Add the resource to a bulk_move cursor */ 97 static void ttm_lru_bulk_move_add(struct ttm_lru_bulk_move *bulk, 98 struct ttm_resource *res) 99 { 100 struct ttm_lru_bulk_move_pos *pos = ttm_lru_bulk_move_pos(bulk, res); 101 102 if (!pos->first) { 103 pos->first = res; 104 pos->last = res; 105 } else { 106 ttm_lru_bulk_move_pos_tail(pos, res); 107 } 108 } 109 110 /* Remove the resource from a bulk_move range */ 111 static void ttm_lru_bulk_move_del(struct ttm_lru_bulk_move *bulk, 112 struct ttm_resource *res) 113 { 114 struct ttm_lru_bulk_move_pos *pos = ttm_lru_bulk_move_pos(bulk, res); 115 116 if (unlikely(WARN_ON(!pos->first || !pos->last) || > 117 pos->first == res && pos->last == res)) { 118 pos->first = NULL; 119 pos->last = NULL; 120 } else if (pos->first == res) { 121 pos->first = list_next_entry(res, lru); 122 } else if (pos->last == res) { 123 pos->last = list_prev_entry(res, lru); 124 } else { 125 list_move(&res->lru, &pos->last->lru); 126 } 127 } 128 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki