tree: git://people.freedesktop.org/~agd5f/linux.git amd-staging-drm-next
head: c9115f8904eef0f880d3b4f8306f553b1bb1c532
commit: ef3da5cab664c16ca25a8d479fac95a7f04080e3 [377/447] drm/amdgpu: add
amdgpu_ras.c to support ras
smatch warnings:
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c:1007 amdgpu_ras_add_bad_pages() warn:
variable dereferenced before check 'con' (see line 1003)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c:1039 amdgpu_ras_reserve_bad_pages()
warn: variable dereferenced before check 'con' (see line 1034)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c:1066 amdgpu_ras_release_bad_pages()
warn: variable dereferenced before check 'con' (see line 1062)
git remote add radeon-alex git://people.freedesktop.org/~agd5f/linux.git
git remote update radeon-alex
git checkout ef3da5cab664c16ca25a8d479fac95a7f04080e3
vim +/con +1007 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
ef3da5ca xinhui pan 2018-10-31 997
ef3da5ca xinhui pan 2018-10-31 998 /* it deal with vram only. */
ef3da5ca xinhui pan 2018-10-31 999 int amdgpu_ras_add_bad_pages(struct
amdgpu_device *adev,
ef3da5ca xinhui pan 2018-10-31 1000 unsigned long *bps, int pages)
ef3da5ca xinhui pan 2018-10-31 1001 {
ef3da5ca xinhui pan 2018-10-31 1002 struct amdgpu_ras *con =
amdgpu_ras_get_context(adev);
ef3da5ca xinhui pan 2018-10-31 @1003 struct ras_err_handler_data *data =
con->eh_data;
^^^^^^^^^^^^
ef3da5ca xinhui pan 2018-10-31 1004 int i = pages;
ef3da5ca xinhui pan 2018-10-31 1005 int ret = 0;
ef3da5ca xinhui pan 2018-10-31 1006
ef3da5ca xinhui pan 2018-10-31 @1007 if (!con || !data || !bps || pages <= 0)
^^^
ef3da5ca xinhui pan 2018-10-31 1008 return 0;
ef3da5ca xinhui pan 2018-10-31 1009
ef3da5ca xinhui pan 2018-10-31 1010 mutex_lock(&con->recovery_lock);
ef3da5ca xinhui pan 2018-10-31 1011 if (!data)
ef3da5ca xinhui pan 2018-10-31 1012 goto out;
ef3da5ca xinhui pan 2018-10-31 1013
ef3da5ca xinhui pan 2018-10-31 1014 if (data->space_left <= pages)
ef3da5ca xinhui pan 2018-10-31 1015 if
(amdgpu_ras_realloc_eh_data_space(adev, data, pages)) {
ef3da5ca xinhui pan 2018-10-31 1016 ret = -ENOMEM;
ef3da5ca xinhui pan 2018-10-31 1017 goto out;
ef3da5ca xinhui pan 2018-10-31 1018 }
ef3da5ca xinhui pan 2018-10-31 1019
ef3da5ca xinhui pan 2018-10-31 1020 while (i--)
ef3da5ca xinhui pan 2018-10-31 1021 data->bps[data->count++].bp =
bps[i];
ef3da5ca xinhui pan 2018-10-31 1022
ef3da5ca xinhui pan 2018-10-31 1023 data->space_left -= pages;
ef3da5ca xinhui pan 2018-10-31 1024 out:
ef3da5ca xinhui pan 2018-10-31 1025 mutex_unlock(&con->recovery_lock);
ef3da5ca xinhui pan 2018-10-31 1026
ef3da5ca xinhui pan 2018-10-31 1027 return ret;
ef3da5ca xinhui pan 2018-10-31 1028 }
ef3da5ca xinhui pan 2018-10-31 1029
ef3da5ca xinhui pan 2018-10-31 1030 /* called in gpu recovery/init */
ef3da5ca xinhui pan 2018-10-31 1031 int amdgpu_ras_reserve_bad_pages(struct
amdgpu_device *adev)
ef3da5ca xinhui pan 2018-10-31 1032 {
ef3da5ca xinhui pan 2018-10-31 1033 struct amdgpu_ras *con =
amdgpu_ras_get_context(adev);
ef3da5ca xinhui pan 2018-10-31 @1034 struct ras_err_handler_data *data =
con->eh_data;
ef3da5ca xinhui pan 2018-10-31 1035 uint64_t bp;
ef3da5ca xinhui pan 2018-10-31 1036 struct amdgpu_bo *bo;
ef3da5ca xinhui pan 2018-10-31 1037 int i;
ef3da5ca xinhui pan 2018-10-31 1038
ef3da5ca xinhui pan 2018-10-31 @1039 if (!con || !data)
ef3da5ca xinhui pan 2018-10-31 1040 return 0;
ef3da5ca xinhui pan 2018-10-31 1041
ef3da5ca xinhui pan 2018-10-31 1042 mutex_lock(&con->recovery_lock);
ef3da5ca xinhui pan 2018-10-31 1043 /* reserve vram at driver post stage. */
ef3da5ca xinhui pan 2018-10-31 1044 for (i = data->last_reserved; i <
data->count; i++) {
ef3da5ca xinhui pan 2018-10-31 1045 bp = data->bps[i].bp;
ef3da5ca xinhui pan 2018-10-31 1046
ef3da5ca xinhui pan 2018-10-31 1047 if
(amdgpu_ras_reserve_vram(adev, bp << PAGE_SHIFT,
ef3da5ca xinhui pan 2018-10-31 1048
PAGE_SIZE, &bo))
ef3da5ca xinhui pan 2018-10-31 1049 DRM_ERROR("RAS ERROR:
reserve vram %llx fail\n", bp);
ef3da5ca xinhui pan 2018-10-31 1050
ef3da5ca xinhui pan 2018-10-31 1051 data->bps[i].bo = bo;
ef3da5ca xinhui pan 2018-10-31 1052 data->last_reserved = i + 1;
ef3da5ca xinhui pan 2018-10-31 1053 }
ef3da5ca xinhui pan 2018-10-31 1054 mutex_unlock(&con->recovery_lock);
ef3da5ca xinhui pan 2018-10-31 1055 return 0;
ef3da5ca xinhui pan 2018-10-31 1056 }
ef3da5ca xinhui pan 2018-10-31 1057
ef3da5ca xinhui pan 2018-10-31 1058 /* called when driver unload */
ef3da5ca xinhui pan 2018-10-31 1059 static int
amdgpu_ras_release_bad_pages(struct amdgpu_device *adev)
ef3da5ca xinhui pan 2018-10-31 1060 {
ef3da5ca xinhui pan 2018-10-31 1061 struct amdgpu_ras *con =
amdgpu_ras_get_context(adev);
ef3da5ca xinhui pan 2018-10-31 @1062 struct ras_err_handler_data *data =
con->eh_data;
ef3da5ca xinhui pan 2018-10-31 1063 struct amdgpu_bo *bo;
ef3da5ca xinhui pan 2018-10-31 1064 int i;
ef3da5ca xinhui pan 2018-10-31 1065
ef3da5ca xinhui pan 2018-10-31 @1066 if (!con || !data)
ef3da5ca xinhui pan 2018-10-31 1067 return 0;
ef3da5ca xinhui pan 2018-10-31 1068
ef3da5ca xinhui pan 2018-10-31 1069 mutex_lock(&con->recovery_lock);
ef3da5ca xinhui pan 2018-10-31 1070 for (i = data->last_reserved - 1; i >=
0; i--) {
ef3da5ca xinhui pan 2018-10-31 1071 bo = data->bps[i].bo;
ef3da5ca xinhui pan 2018-10-31 1072
ef3da5ca xinhui pan 2018-10-31 1073 amdgpu_ras_release_vram(adev,
&bo);
ef3da5ca xinhui pan 2018-10-31 1074
ef3da5ca xinhui pan 2018-10-31 1075 data->bps[i].bo = bo;
ef3da5ca xinhui pan 2018-10-31 1076 data->last_reserved = i;
ef3da5ca xinhui pan 2018-10-31 1077 }
ef3da5ca xinhui pan 2018-10-31 1078 mutex_unlock(&con->recovery_lock);
ef3da5ca xinhui pan 2018-10-31 1079 return 0;
ef3da5ca xinhui pan 2018-10-31 1080 }
ef3da5ca xinhui pan 2018-10-31 1081
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel