[RFC 1/2] drm/i915: Expose local memory information via sysfs
Krzysztof Karas
krzysztof.karas at intel.com
Tue May 20 14:25:51 UTC 2025
Hi Krzysztof,
[...]
> +static ssize_t
> +vram_total_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
> +{
> + struct device *dev = kobj_to_dev(kobj->parent);
> + struct intel_memory_region *mr;
> +
> + mr = intel_memory_region_by_type(kdev_minor_to_i915(dev), INTEL_MEMORY_LOCAL);
intel_memory_region_by_type() may return a NULL, which would
cause NULLPTR dereference on emit here and in other places
where you call this function.
> +
> + return sysfs_emit(buf, "%llu\n", mr->total);
> +}
> +
> +static const struct kobj_attribute vram_total_attr =
> +__ATTR(vram_total, 0444, vram_total_show, NULL);
> +
> +static ssize_t
> +vram_avail_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
> +{
> + struct device *dev = kobj_to_dev(kobj->parent);
> + struct intel_memory_region *mr;
> + u64 unallocated_size;
> + u64 dummy;
> +
> + mr = intel_memory_region_by_type(kdev_minor_to_i915(dev), INTEL_MEMORY_LOCAL);
> + intel_memory_region_avail(mr, &unallocated_size, &dummy);
> +
> + return sysfs_emit(buf, "%llu\n", unallocated_size);
> +}
> +
> +static const struct kobj_attribute vram_avail_attr =
> +__ATTR(vram_available, 0444, vram_avail_show, NULL);
> +
> +
> +static ssize_t
> +vram_total_visible_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
> +{
> + struct device *dev = kobj_to_dev(kobj->parent);
> + struct intel_memory_region *mr;
> +
> + mr = intel_memory_region_by_type(kdev_minor_to_i915(dev), INTEL_MEMORY_LOCAL);
> +
> + return sysfs_emit(buf, "%llu\n", resource_size(&mr->io));
> +}
> +
> +static const struct kobj_attribute vram_total_visible_attr =
> +__ATTR(vram_total_cpu_visible, 0444, vram_total_visible_show, NULL);
> +
> +static ssize_t
> +vram_avail_visible_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
> +{
> + struct device *dev = kobj_to_dev(kobj->parent);
> + struct intel_memory_region *mr;
> + u64 unallocated_cpu_visible_size;
> + u64 dummy;
> +
> + mr = intel_memory_region_by_type(kdev_minor_to_i915(dev), INTEL_MEMORY_LOCAL);
> + intel_memory_region_avail(mr, &dummy, &unallocated_cpu_visible_size);
> +
> + return sysfs_emit(buf, "%llu\n", unallocated_cpu_visible_size);
> +}
> +
> +static const struct kobj_attribute vram_avail_visible_attr =
> +__ATTR(vram_available_cpu_visible, 0444, vram_avail_visible_show, NULL);
> +
> +int intel_memory_region_setup_sysfs(struct drm_i915_private *i915)
> +{
> + static const struct attribute *const files[] = {
> + &vram_total_attr.attr,
> + &vram_avail_attr.attr,
> + &vram_total_visible_attr.attr,
> + &vram_avail_visible_attr.attr,
> + NULL
> + };
> + struct device *kdev = i915->drm.primary->kdev;
> + int err;
> +
> + /* Skip this function completely if the system does not support lmem */
> + if(!intel_memory_region_by_type(i915, INTEL_MEMORY_LOCAL))
> + return 0;
> +
> + memory_info_dir = kobject_create_and_add("memory_info", &kdev->kobj);
> + if (!memory_info_dir) {
> + drm_warn(&i915->drm, "Failed to create memory_info sysfs directory\n");
> + return -EAGAIN;
Maybe ENOMEM would be better? EAGAIN suggests that we have some
confidence that retrying this call will yield a different result.
[...]
Best Regards,
Krzysztof
More information about the Intel-gfx
mailing list