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