Hi Sebastian,

> @@ -1529,80 +1529,89 @@ static int eb_relocate_vma(struct i915_execbuffer 
> *eb, struct eb_vma *ev)
>       struct drm_i915_gem_relocation_entry __user *urelocs =
>               u64_to_user_ptr(entry->relocs_ptr);
>       unsigned long remain = entry->relocation_count;
> +     int ret = 0;
>  
> -     if (unlikely(remain > N_RELOC(INT_MAX)))
> -             return -EINVAL;
> +     if (unlikely(remain > N_RELOC(INT_MAX))) {
> +             ret = -EINVAL;
> +             goto out;
> +     }

Why? This doesn't look clearer to me.

>  
>       /*
>        * We must check that the entire relocation array is safe
>        * to read. However, if the array is not writable the user loses
>        * the updated relocation values.
>        */
> -     if (unlikely(!access_ok(urelocs, remain * sizeof(*urelocs))))
> -             return -EFAULT;
> +     if (unlikely(!access_ok(urelocs, remain * sizeof(*urelocs)))) {
> +             ret = -EFAULT;
> +             goto out;
> +     }

same.

> -     do {
> -             struct drm_i915_gem_relocation_entry *r = stack;
> +     while (remain > 0) {
>               unsigned int count =
>                       min_t(unsigned long, remain, ARRAY_SIZE(stack));
>               unsigned int copied;
> -
>               /*
>                * This is the fast path and we cannot handle a pagefault
> -              * whilst holding the struct mutex lest the user pass in the
> -              * relocations contained within a mmaped bo. For in such a case
> -              * we, the page fault handler would call i915_gem_fault() and
> -              * we would try to acquire the struct mutex again. Obviously
> -              * this is bad and so lockdep complains vehemently.
> +              * whilst holding the struct mutex lest the user pass in
> +              * the relocations contained within a mmaped bo. For in
> +              * such a case we, the page fault handler would call
> +              * i915_gem_fault() and we would try to acquire the
> +              * struct mutex again. Obviously this is bad and so
> +              * lockdep complains vehemently.
>                */

Why have you done this change?

>               pagefault_disable();
> -             copied = __copy_from_user_inatomic(r, urelocs, count * 
> sizeof(r[0]));
> +             copied = __copy_from_user_inatomic(stack, urelocs,
> +                                                count * sizeof(stack[0]));

No need, the maximum allowed by the documentation is 100
characters.

>               pagefault_enable();
> +
>               if (unlikely(copied)) {
> -                     remain = -EFAULT;
> +                     ret = -EFAULT;
>                       goto out;
>               }
>  
> -             remain -= count;
> -             do {
> +             for (unsigned int i = 0; i < count; ++i) {

Please don't declare variables inside the for loop.

> +                     struct drm_i915_gem_relocation_entry *r =
> +                             &stack[i];
>                       u64 offset = eb_relocate_entry(eb, ev, r);
>  
> -                     if (likely(offset == 0)) {
> -                     } else if ((s64)offset < 0) {
> -                             remain = (int)offset;
> +                     if (likely(offset == 0))
> +                             continue;

you can leave a blank line here.

> +                     if (unlikely((s64)offset < 0)) {
> +                             ret = (int)offset;
>                               goto out;

...

>  out:
>       reloc_cache_reset(&eb->reloc_cache, eb);
> -     return remain;
> +     return ret;

now, this function is also returning a different value, not the
remaining bytes anymore but 0 on success and -error on failure.
Is this something you wanted?

Overall the patch is not acceptable yet. You mixed several
cleanups while I would rather prefer one cleanup type per patch,
this make is easier to review and trace in the history.

Andi

>  }
>  
>  static int
> -- 
> 2.34.1
> 

Reply via email to