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-...@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: 
(https://download.01.org/0day-ci/archive/20230623/202306230747.ws6fhv2o-...@intel.com/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 <l...@intel.com>
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202306230747.ws6fhv2o-...@intel.com/

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

Reply via email to