On Thu, Sep 11, 2008 at 06:16:21PM -0700, Jesse Barnes wrote:
> Here's an updated set of GTT mapping patches against Eric's drm-gem-merge 
> branch from earlier today and DRM master for the libdrm bits.  I fixed up a 
> couple of bugs, but it looks like UXA/EXA still don't work against GEM even 
> w/o these changes applied.  I'm not quite sure about the zap_vma_ptes code, 
> that'll need review from one of the MM guys (Nick can you take a look at the 
> i915-gtt-mapping patch?).
> 
> Other than that, I think the code is looking fairly complete, so at this 
> point 
> we just need to stabilize GEM and play with using GTT mapping for the general 
> dri_bo_map case to see if we want to do it by default.


Well I had a quick look, and the zap_vma_ptes call seems fine. It will just
basically undo the effects of all the vm_insert_pfn calls on that vma, right?
Anything in particular you were worried about?


>       return 0;
>  }
>  
> +void i915_gem_vm_open(struct vm_area_struct *vma)
> +{
> +}
> +
> +void i915_gem_vm_close(struct vm_area_struct *vma)
> +{
> +}

Just a nitpick but can you just skip these if they are empty?


> +int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
> +{
> +     struct drm_gem_object *obj = vma->vm_private_data;
> +     struct drm_device *dev = obj->dev;
> +     struct drm_i915_gem_object *obj_priv = obj->driver_private;
> +     unsigned long page_offset;
> +     unsigned long pfn;
> +     int ret = 0;
> +
> +     page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
> +             PAGE_SHIFT;

vmf->pgoff?


> +
> +     DRM_ERROR("faulting in object %d offset 0x%08lx\n", obj->name,
> +               page_offset);
> +
> +     /* Now bind it into the GTT */
> +     if (i915_gem_object_bind_to_gtt(obj, obj_priv->gtt_alignment))
> +             return VM_FAULT_SIGBUS;
> +
> +     vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
> +     pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) +
> +             page_offset;
> +     /* Finally, remap it using the new GTT offset */
> +     ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
> +
> +     return ret == -EAGAIN ? VM_FAULT_OOM : VM_FAULT_NOPAGE;
> +}

Should better check return from vm_inesrt_pfn, maybe?

-ENOMEM should give VM_FAULT_OOM
-EFAULT would be a bug in the driver probably, but VM_FAULT_SIGBUS maybe
-EBUSY might be a bug (or maybe it can happen if multiple threads fault
 the same address, in which case VM_FAULT_NOPAGE is fine).


> +
> +int i915_gem_vm_mkwrite(struct vm_area_struct *vma, struct page *page)
> +{
> +     return 0;
> +}
> +
> +int i915_gem_vm_access(struct vm_area_struct *vma, unsigned long addr,
> +                    void *buf, int len, int write)
> +{
> +     return 0;
> +}

Same for these...


> @@ -940,6 +1029,10 @@ i915_gem_object_unbind(struct drm_gem_object *obj)
>  
>       BUG_ON(obj_priv->active);
>  
> +     /* blow away mappings if mapped through GTT */
> +     if (vma)
> +             zap_vma_ptes(vma, vma->vm_start, vma->vm_end - vma->vm_start);

Seems fine to me.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to