Hello Ce Sun, Commit 8ba904f54148 ("drm/amdgpu: Multi-GPU DPC recovery support") from Mar 21, 2025 (linux-next), leads to the following Smatch static checker warning:
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c:6820 amdgpu_pci_slot_reset() warn: iterator used outside loop: 'tmp_adev' drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 6753 pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev) 6754 { 6755 struct drm_device *dev = pci_get_drvdata(pdev); 6756 struct amdgpu_device *adev = drm_to_adev(dev); 6757 struct amdgpu_reset_context reset_context; 6758 struct amdgpu_device *tmp_adev = NULL; 6759 struct amdgpu_hive_info *hive = NULL; 6760 struct list_head device_list; 6761 int r = 0, i; 6762 u32 memsize; 6763 6764 /* PCI error slot reset should be skipped During RAS recovery */ 6765 if ((amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) || 6766 amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4)) && 6767 amdgpu_ras_in_recovery(adev)) 6768 return PCI_ERS_RESULT_RECOVERED; 6769 6770 dev_info(adev->dev, "PCI error: slot reset callback!!\n"); 6771 6772 memset(&reset_context, 0, sizeof(reset_context)); 6773 6774 /* wait for asic to come out of reset */ 6775 msleep(700); 6776 6777 /* Restore PCI confspace */ 6778 amdgpu_device_load_pci_state(pdev); 6779 6780 /* confirm ASIC came out of reset */ 6781 for (i = 0; i < adev->usec_timeout; i++) { 6782 memsize = amdgpu_asic_get_config_memsize(adev); 6783 6784 if (memsize != 0xffffffff) 6785 break; 6786 udelay(1); 6787 } 6788 if (memsize == 0xffffffff) { 6789 r = -ETIME; 6790 goto out; 6791 } 6792 6793 reset_context.method = AMD_RESET_METHOD_NONE; 6794 reset_context.reset_req_dev = adev; 6795 set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags); 6796 set_bit(AMDGPU_SKIP_COREDUMP, &reset_context.flags); 6797 INIT_LIST_HEAD(&device_list); 6798 6799 hive = amdgpu_get_xgmi_hive(adev); 6800 if (hive) { 6801 mutex_lock(&hive->hive_lock); 6802 reset_context.hive = hive; 6803 list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) { 6804 tmp_adev->pcie_reset_ctx.in_link_reset = true; 6805 list_add_tail(&tmp_adev->reset_list, &device_list); 6806 } tmp_adev is an invalid non-NULL pointer. 6807 } else { 6808 set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags); 6809 list_add_tail(&adev->reset_list, &device_list); 6810 } 6811 6812 r = amdgpu_device_asic_reset(adev, &device_list, &reset_context); 6813 out: 6814 if (!r) { 6815 if (amdgpu_device_cache_pci_state(adev->pdev)) 6816 pci_restore_state(adev->pdev); 6817 dev_info(adev->dev, "PCIe error recovery succeeded\n"); 6818 } else { 6819 dev_err(adev->dev, "PCIe error recovery failed, err:%d\n", r); --> 6820 if (tmp_adev) { This looks like it might have been intentional but it would be more readable to check if (hive) { 6821 list_for_each_entry(tmp_adev, &device_list, reset_list) 6822 amdgpu_device_unset_mp1_state(tmp_adev); 6823 amdgpu_device_unlock_reset_domain(adev->reset_domain); 6824 } 6825 } 6826 6827 if (hive) { 6828 mutex_unlock(&hive->hive_lock); 6829 amdgpu_put_xgmi_hive(hive); 6830 } 6831 6832 return r ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED; 6833 } regards, dan carpenter