[Intel-gfx] [RFC PATCH 1/2] drm/i915: Add a function to mmap framebuffer obj

Das, Nirmoy nirmoy.das at linux.intel.com
Tue Mar 14 09:18:15 UTC 2023


Hi Andi,

On 3/13/2023 7:37 PM, Andi Shyti wrote:
> Hi Nirmoy,
>
> [...]
>
>> +int i915_gem_fb_mmap(struct drm_i915_gem_object *obj, struct vm_area_struct *vma)
>> +{
>> +	struct drm_i915_private *i915 = to_i915(obj->base.dev);
>> +	struct drm_device *dev = &i915->drm;
>> +	struct i915_mmap_offset *mmo = NULL;
>> +	enum i915_mmap_type mmap_type;
>> +	struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
>> +
>> +	if (drm_dev_is_unplugged(dev))
>> +		return -ENODEV;
>> +
>> +	mmap_type = i915_ggtt_has_aperture(ggtt) ? I915_MMAP_TYPE_GTT : I915_MMAP_TYPE_WC;
>> +	mmo = mmap_offset_attach(obj, mmap_type, NULL);
>> +	if (!mmo)
>> +		return -ENODEV;
>> +
>> +	obj = i915_gem_object_get(mmo->obj);
> Where do we decrease the refcount?


This actually needs some comment even for the existing code.


We install vm_ops for the mmap which comes with vm_ops_cpu.open() and 
vm_ops_cpu.close()

where we do i915_gem_object_get()  on open and i915_gem_object_put() on 
close.

static const struct vm_operations_struct vm_ops_cpu = {
         .fault = vm_fault_cpu,
         .access = vm_access,
         .open = vm_open,
         .close = vm_close,
};

But when we install the vm_ops we are too late for vm_ops_cpu.open() so 
to account for the missing we are doing a i915_gem_object_get()  in mmap 
call.


Regards,

Nirmoy

>
> Andi
>
>> +	return i915_gem_object_mmap(obj, mmo, vma);
>> +}
>> +


More information about the Intel-gfx mailing list