On to, 2016-08-25 at 10:08 +0100, Chris Wilson wrote: > +++ b/drivers/gpu/drm/i915/i915_sw_fence.c > @@ -0,0 +1,329 @@ > +/* > + * (C) Copyright 2016 Intel Corporation > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License > + * as published by the Free Software Foundation; version 2 > + * of the License. > + */ Copyright notice is rather brief, copy from i915_gem_execbuffer.c > +static int __i915_sw_fence_notify(struct i915_sw_fence *fence) > +{ > + i915_sw_fence_notify_t fn; > + > + fn = (i915_sw_fence_notify_t)(fence->flags & I915_SW_FENCE_MASK); I'd define an accessor functions in scatterlist.h fashion. Although I'm not convinced of packing the flags with the function pointer. How many fences do we expect to be allocated simultaneously on a real usage scenario? > +static void __i915_sw_fence_wake_up_all(struct i915_sw_fence *fence, > + struct list_head *continuation) > +{ > + wait_queue_head_t *x = &fence->wait; > + unsigned long flags; > + > + atomic_dec(&fence->pending); > + > + /* > + * To prevent unbounded recursion as we traverse the graph of i915_sw_fences, Long line due to s/kfence/.../ > + * we move the task_list from this the next ready fence to the tail of > + * the original fence's task_list (and so added to the list to be > + * woken). > + */ > + smp_mb__before_spinlock(); > + if (!list_empty_careful(&x->task_list)) { if (list_empty_careful() return; > +static bool __i915_sw_fence_check_if_after(struct i915_sw_fence *fence, > + const struct i915_sw_fence * const signaler) > +{ > + wait_queue_t *wq; > + > + if (__test_and_set_bit(I915_SW_FENCE_CHECKED_BIT, &fence->flags)) > + return false; > + > + if (fence == signaler) > + return true; Not sure if I would expect _if_after to return true on an equal object... > +int i915_sw_fence_await_reservation(struct i915_sw_fence *fence, > + struct reservation_object *resv, > + const struct fence_ops *exclude, > + bool write, > + gfp_t gfp) > +{ > + struct fence *excl, **shared; > + unsigned int count, i; > + int ret; > + > + ret = reservation_object_get_fences_rcu(resv, &excl, &count, &shared); > + if (ret) > + return ret; > + > + if (write) { > + for (i = 0; i < count; i++) { > + if (shared[i]->ops == exclude) > + continue; > + > + ret |= i915_sw_fence_await_dma_fence(fence, shared[i], gfp); Do we really want to bitwise here? > + if (ret < 0) > + goto out; > + } > + } > + > + if (excl && excl->ops != exclude) > + ret |= i915_sw_fence_await_dma_fence(fence, excl, gfp); Ditto. > + > +out: > + fence_put(excl); > + for (i = 0; i < count; i++) > + fence_put(shared[i]); > + kfree(shared); > + > + return ret; > +} <SNIP> > +struct i915_sw_fence { > + wait_queue_head_t wait; > + unsigned long flags; Name is rather deceiving to contain a callback function. > +#define __i915_sw_fence_call __aligned(4) Not packing would get rid of this too... > + > +void i915_sw_fence_init(struct i915_sw_fence *fence, i915_sw_fence_notify_t fn); > +void i915_sw_fence_commit(struct i915_sw_fence *fence); Not _signal? > +static inline bool i915_sw_fence_done(const struct i915_sw_fence *fence) _is_done() or _is_completed() Regards, Joonas -- Joonas Lahtinen Open Source Technology Center Intel Corporation _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx