[bug report] drm/amdkfd: Fix the warning of array-index-out-of-bounds

Ma, Jun majun at amd.com
Wed Nov 16 00:49:47 UTC 2022


Hi Dan,

Thanks for catching this. I'll check it and post a fix patch.

Regards,
Ma Jun

On 11/15/2022 9:00 PM, Dan Carpenter wrote:
> [ Ugh...  My email messed up and I have to Resend all my emails for the
>   past two weeks. -dan ]
> 
> Hello Ma Jun,
> 
> The patch c0cc999f3c32: "drm/amdkfd: Fix the warning of
> array-index-out-of-bounds" from Nov 2, 2022, leads to the following
> Smatch static checker warning:
> 
> 	drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:2008 kfd_topology_add_device()
> 	warn: inconsistent returns '&topology_lock'.
> 
> drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c
>     1808 int kfd_topology_add_device(struct kfd_dev *gpu)
>     1809 {
>     1810         uint32_t gpu_id;
>     1811         struct kfd_topology_device *dev;
>     1812         struct kfd_cu_info cu_info;
>     1813         int res = 0;
>     1814         struct list_head temp_topology_device_list;
>     1815         void *crat_image = NULL;
>     1816         size_t image_size = 0;
>     1817         int proximity_domain;
>     1818         int i;
>     1819         const char *asic_name = amdgpu_asic_name[gpu->adev->asic_type];
>     1820 
>     1821         INIT_LIST_HEAD(&temp_topology_device_list);
>     1822 
>     1823         gpu_id = kfd_generate_gpu_id(gpu);
>     1824         pr_debug("Adding new GPU (ID: 0x%x) to topology\n", gpu_id);
>     1825 
>     1826         /* Check to see if this gpu device exists in the topology_device_list.
>     1827          * If so, assign the gpu to that device,
>     1828          * else create a Virtual CRAT for this gpu device and then parse that
>     1829          * CRAT to create a new topology device. Once created assign the gpu to
>     1830          * that topology device
>     1831          */
>     1832         down_write(&topology_lock);
>                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
> Takes the lock.
> 
>     1833         dev = kfd_assign_gpu(gpu);
>     1834         if (!dev) {
>     1835                 proximity_domain = ++topology_crat_proximity_domain;
>     1836 
>     1837                 res = kfd_create_crat_image_virtual(&crat_image, &image_size,
>     1838                                                     COMPUTE_UNIT_GPU, gpu,
>     1839                                                     proximity_domain);
>     1840                 if (res) {
>     1841                         pr_err("Error creating VCRAT for GPU (ID: 0x%x)\n",
>     1842                                gpu_id);
>     1843                         topology_crat_proximity_domain--;
>     1844                         return res;
> 
> Does not drop the lock.
> 
>     1845                 }
>     1846 
>     1847                 res = kfd_parse_crat_table(crat_image,
>     1848                                            &temp_topology_device_list,
>     1849                                            proximity_domain);
>     1850                 if (res) {
>     1851                         pr_err("Error parsing VCRAT for GPU (ID: 0x%x)\n",
>     1852                                gpu_id);
>     1853                         topology_crat_proximity_domain--;
>     1854                         goto err;
> 
> Does not drop the lock.
> 
>     1855                 }
>     1856 
>     1857                 kfd_topology_update_device_list(&temp_topology_device_list,
>     1858                         &topology_device_list);
>     1859 
>     1860                 dev = kfd_assign_gpu(gpu);
>     1861                 if (WARN_ON(!dev)) {
>     1862                         res = -ENODEV;
>     1863                         goto err;
> 
> Does not drop the lock.
> 
>     1864                 }
>     1865 
>     1866                 /* Fill the cache affinity information here for the GPUs
>     1867                  * using VCRAT
>     1868                  */
>     1869                 kfd_fill_cache_non_crat_info(dev, gpu);
>     1870 
>     1871                 /* Update the SYSFS tree, since we added another topology
>     1872                  * device
>     1873                  */
>     1874                 res = kfd_topology_update_sysfs();
>     1875                 if (!res)
>     1876                         sys_props.generation_count++;
>     1877                 else
>     1878                         pr_err("Failed to update GPU (ID: 0x%x) to sysfs topology. res=%d\n",
>     1879                                                 gpu_id, res);
>     1880         }
>     1881         up_write(&topology_lock);
>                  ^^^^^^^^^^^^^^^^^^^^^^^^^
> Drops the lock.  The patch has some other locking changes which are
> not explained in the commit message and seem unrelated to the out of
> bounds issue.
> 
>     1882 
>     1883         dev->gpu_id = gpu_id;
>     1884         gpu->id = gpu_id;
> 
> regards,
> dan carpenter
> 


More information about the amd-gfx mailing list