]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdgpu: decouple sysfs creating of bad page node
authorGuchun Chen <guchun.chen@amd.com>
Fri, 31 Jul 2020 07:06:32 +0000 (15:06 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 4 Aug 2020 21:27:16 +0000 (17:27 -0400)
Bad page information should not be exposed by sysfs when
bad page retirement is disabled, so decouple it from ras
sysfs group creating, and add one guard before creating.

Signed-off-by: Guchun Chen <guchun.chen@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c

index 08869e4a5374c6f238a52d41d13b30d3bbe6ddc1..3949470edbb018585823e38d2f04e97824cfe3ca 100644 (file)
@@ -1027,6 +1027,33 @@ static ssize_t amdgpu_ras_sysfs_features_read(struct device *dev,
        return scnprintf(buf, PAGE_SIZE, "feature mask: 0x%x\n", con->features);
 }
 
+static void amdgpu_ras_sysfs_add_bad_page_node(struct amdgpu_device *adev)
+{
+       struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
+       struct attribute_group group;
+       struct bin_attribute *bin_attrs[] = {
+               &con->badpages_attr,
+               NULL,
+       };
+
+       con->badpages_attr = (struct bin_attribute) {
+               .attr = {
+                       .name = "gpu_vram_bad_pages",
+                       .mode = S_IRUGO,
+               },
+               .size = 0,
+               .private = NULL,
+               .read = amdgpu_ras_sysfs_badpages_read,
+       };
+
+       group.name = RAS_FS_NAME;
+       group.bin_attrs = bin_attrs;
+
+       sysfs_bin_attr_init(bin_attrs[0]);
+
+       sysfs_update_group(&adev->dev->kobj, &group);
+}
+
 static int amdgpu_ras_sysfs_create_feature_node(struct amdgpu_device *adev)
 {
        struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
@@ -1034,14 +1061,9 @@ static int amdgpu_ras_sysfs_create_feature_node(struct amdgpu_device *adev)
                &con->features_attr.attr,
                NULL
        };
-       struct bin_attribute *bin_attrs[] = {
-               &con->badpages_attr,
-               NULL
-       };
        struct attribute_group group = {
                .name = RAS_FS_NAME,
                .attrs = attrs,
-               .bin_attrs = bin_attrs,
        };
 
        con->features_attr = (struct device_attribute) {
@@ -1052,22 +1074,20 @@ static int amdgpu_ras_sysfs_create_feature_node(struct amdgpu_device *adev)
                        .show = amdgpu_ras_sysfs_features_read,
        };
 
-       con->badpages_attr = (struct bin_attribute) {
-               .attr = {
-                       .name = "gpu_vram_bad_pages",
-                       .mode = S_IRUGO,
-               },
-               .size = 0,
-               .private = NULL,
-               .read = amdgpu_ras_sysfs_badpages_read,
-       };
-
        sysfs_attr_init(attrs[0]);
-       sysfs_bin_attr_init(bin_attrs[0]);
 
        return sysfs_create_group(&adev->dev->kobj, &group);
 }
 
+static void amdgpu_ras_sysfs_remove_bad_page_node(struct amdgpu_device *adev)
+{
+       struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
+
+       sysfs_remove_file_from_group(&adev->dev->kobj,
+                               &con->badpages_attr.attr,
+                               RAS_FS_NAME);
+}
+
 static int amdgpu_ras_sysfs_remove_feature_node(struct amdgpu_device *adev)
 {
        struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
@@ -1075,14 +1095,9 @@ static int amdgpu_ras_sysfs_remove_feature_node(struct amdgpu_device *adev)
                &con->features_attr.attr,
                NULL
        };
-       struct bin_attribute *bin_attrs[] = {
-               &con->badpages_attr,
-               NULL
-       };
        struct attribute_group group = {
                .name = RAS_FS_NAME,
                .attrs = attrs,
-               .bin_attrs = bin_attrs,
        };
 
        sysfs_remove_group(&adev->dev->kobj, &group);
@@ -1151,6 +1166,9 @@ static int amdgpu_ras_sysfs_remove_all(struct amdgpu_device *adev)
                amdgpu_ras_sysfs_remove(adev, &obj->head);
        }
 
+       if (amdgpu_bad_page_threshold != 0)
+               amdgpu_ras_sysfs_remove_bad_page_node(adev);
+
        amdgpu_ras_sysfs_remove_feature_node(adev);
 
        return 0;
@@ -1278,6 +1296,9 @@ static int amdgpu_ras_fs_init(struct amdgpu_device *adev)
 {
        amdgpu_ras_sysfs_create_feature_node(adev);
 
+       if (amdgpu_bad_page_threshold != 0)
+               amdgpu_ras_sysfs_add_bad_page_node(adev);
+
        return 0;
 }