Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-20 Thread Daniel Vetter
On Fri, Jun 20, 2014 at 12:39 AM, H. Peter Anvin h...@zytor.com wrote:
 Aside: This is a pet peeve of mine and recently I've switched to
 rejecting all patch that have a BUG_ON, period.

 Please do, I have been for a few years now as well for the same reasons
 you cite.


 I'm actually concerned about this trend.  Downgrading things to WARN_ON
 can allow a security bug in the kernel to continue to exist, for
 example, or make the error message disappear.

 I am wondering if the right thing here isn't to have a user (command
 line?) settable policy as to how to proceed on an assert violation,
 instead of hardcoding it at compile time.

I should clarify: If it smells like the issue is a failure of our
ioctl/syscall validation code to catch crap, BUG_ON is the right
choice. And fundamentally I've had this rule since 1-2 years now, the
only recent change I've done is switch my scripts from warning by
default if there's a new BUG_ON to rejecting by default. Mostly
because I'm lazy and let too many BUG_ONs pass through by default.

Also if you add a new interface to i915 I'll make damn sure you supply
a full set of nasty testcases to abuse the ioctl hard. In the end it's
a tradeoff and overall I don't think I'm compromising security with my
current set of rules.

Also, people don't (yet) terribly care about data integrity as soon as
their data has passed once through a gpu.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-20 Thread Daniel Vetter
On Fri, Jun 20, 2014 at 1:42 AM, Greg KH gre...@linuxfoundation.org wrote:
 I'm actually concerned about this trend.  Downgrading things to WARN_ON
 can allow a security bug in the kernel to continue to exist, for
 example, or make the error message disappear.

 A BUG_ON makes any error message disappear pretty quickly :)

 I'm talking about foolish ASSERT-like BUG_ON that driver authors like
 to add to their code when writing it to catch things they are messing
 up.  After the code is working, they should be removed, like this one.

Well except for cases where it's super performance critical I like to
retain these WARN_ON asserts (not BUG_ON). Is the logic sufficient
locked down with WARN_ONs? is actually one of the main review
criteria I have for i915 patches, especially on the modeset side.
They're a bit an annoyance for distro's since they result in a
constant (but ever shifting) stream of backtraces, but for me they
serve as an excellent early warning sign when our driver has yet again
lost its marbles (or at least some) way before something user-visibly
bad happens.

And for those screaming that these checks should be hidden behind a
config option and only enabled for validation: Nope, there's too many
combinations of display hardware out there and I simply need our
entire user base to serve as guinea pigs. There's really no other way
to validate this mess called drm/i915.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Rob Clark
On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org wrote:
 On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 +#define CREATE_TRACE_POINTS
 +#include trace/events/fence.h
 +
 +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
 +EXPORT_TRACEPOINT_SYMBOL(fence_emit);

 Are you really willing to live with these as tracepoints for forever?
 What is the use of them in debugging?  Was it just for debugging the
 fence code, or for something else?

 +/**
 + * fence_context_alloc - allocate an array of fence contexts
 + * @num: [in]amount of contexts to allocate
 + *
 + * This function will return the first index of the number of fences 
 allocated.
 + * The fence context is used for setting fence-context to a unique number.
 + */
 +unsigned fence_context_alloc(unsigned num)
 +{
 + BUG_ON(!num);
 + return atomic_add_return(num, fence_context_counter) - num;
 +}
 +EXPORT_SYMBOL(fence_context_alloc);

 EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
 Traditionally all of the driver core exports have been with this
 marking, any objection to making that change here as well?

tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
life.  We already went through this debate once with dma-buf.  We
aren't going to change $evil_vendor's mind about non-gpl modules.  The
only result will be a more flugly convoluted solution (ie. use syncpt
EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
workaround, with the result that no-one benefits.

 +int __fence_signal(struct fence *fence)
 +{
 + struct fence_cb *cur, *tmp;
 + int ret = 0;
 +
 + if (WARN_ON(!fence))
 + return -EINVAL;
 +
 + if (!ktime_to_ns(fence-timestamp)) {
 + fence-timestamp = ktime_get();
 + smp_mb__before_atomic();
 + }
 +
 + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags)) {
 + ret = -EINVAL;
 +
 + /*
 +  * we might have raced with the unlocked fence_signal,
 +  * still run through all callbacks
 +  */
 + } else
 + trace_fence_signaled(fence);
 +
 + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
 + list_del_init(cur-node);
 + cur-func(fence, cur);
 + }
 + return ret;
 +}
 +EXPORT_SYMBOL(__fence_signal);

 Don't export a function with __ in front of it, you are saying that an
 internal function is somehow valid for everyone else to call?  Why?
 You aren't even documenting the function, so who knows how to use it?

fwiw, the __ versions appear to mainly be concessions for android
syncpt.  That is the only user outside of fence.c, and it should stay
that way.

 +/**
 + * fence_signal - signal completion of a fence
 + * @fence: the fence to signal
 + *
 + * Signal completion for software callbacks on a fence, this will unblock
 + * fence_wait() calls and run all the callbacks added with
 + * fence_add_callback(). Can be called multiple times, but since a fence
 + * can only go from unsignaled to signaled state, it will only be effective
 + * the first time.
 + */
 +int fence_signal(struct fence *fence)
 +{
 + unsigned long flags;
 +
 + if (!fence)
 + return -EINVAL;
 +
 + if (!ktime_to_ns(fence-timestamp)) {
 + fence-timestamp = ktime_get();
 + smp_mb__before_atomic();
 + }
 +
 + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags))
 + return -EINVAL;
 +
 + trace_fence_signaled(fence);
 +
 + if (test_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, fence-flags)) {
 + struct fence_cb *cur, *tmp;
 +
 + spin_lock_irqsave(fence-lock, flags);
 + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
 + list_del_init(cur-node);
 + cur-func(fence, cur);
 + }
 + spin_unlock_irqrestore(fence-lock, flags);
 + }
 + return 0;
 +}
 +EXPORT_SYMBOL(fence_signal);

 So, why should I use this over __fence_signal?  What is the difference?
 Am I missing some documentation somewhere?

 +void release_fence(struct kref *kref)
 +{
 + struct fence *fence =
 + container_of(kref, struct fence, refcount);
 +
 + trace_fence_destroy(fence);
 +
 + BUG_ON(!list_empty(fence-cb_list));
 +
 + if (fence-ops-release)
 + fence-ops-release(fence);
 + else
 + kfree(fence);
 +}
 +EXPORT_SYMBOL(release_fence);

 fence_release() makes it more unified with the other functions in this
 file, right?

 +/**
 + * fence_default_wait - default sleep until the fence gets signaled
 + * or until timeout elapses
 + * @fence:   [in]the fence to wait on
 + * @intr:[in]if true, do an interruptible wait
 + * @timeout: [in]timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
 + *
 + * Returns -ERESTARTSYS if interrupted, 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Greg KH
On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
 On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
  +#define CREATE_TRACE_POINTS
  +#include trace/events/fence.h
  +
  +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
  +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
 
  Are you really willing to live with these as tracepoints for forever?
  What is the use of them in debugging?  Was it just for debugging the
  fence code, or for something else?
 
  +/**
  + * fence_context_alloc - allocate an array of fence contexts
  + * @num: [in]amount of contexts to allocate
  + *
  + * This function will return the first index of the number of fences 
  allocated.
  + * The fence context is used for setting fence-context to a unique 
  number.
  + */
  +unsigned fence_context_alloc(unsigned num)
  +{
  + BUG_ON(!num);
  + return atomic_add_return(num, fence_context_counter) - num;
  +}
  +EXPORT_SYMBOL(fence_context_alloc);
 
  EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
  Traditionally all of the driver core exports have been with this
  marking, any objection to making that change here as well?
 
 tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
 wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
 life.  We already went through this debate once with dma-buf.  We
 aren't going to change $evil_vendor's mind about non-gpl modules.  The
 only result will be a more flugly convoluted solution (ie. use syncpt
 EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
 workaround, with the result that no-one benefits.

It has been proven that using _GPL() exports have caused companies to
release their code properly over the years, so as these really are
Linux-only apis, please change them to be marked this way, it helps
everyone out in the end.

  +int __fence_signal(struct fence *fence)
  +{
  + struct fence_cb *cur, *tmp;
  + int ret = 0;
  +
  + if (WARN_ON(!fence))
  + return -EINVAL;
  +
  + if (!ktime_to_ns(fence-timestamp)) {
  + fence-timestamp = ktime_get();
  + smp_mb__before_atomic();
  + }
  +
  + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags)) {
  + ret = -EINVAL;
  +
  + /*
  +  * we might have raced with the unlocked fence_signal,
  +  * still run through all callbacks
  +  */
  + } else
  + trace_fence_signaled(fence);
  +
  + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
  + list_del_init(cur-node);
  + cur-func(fence, cur);
  + }
  + return ret;
  +}
  +EXPORT_SYMBOL(__fence_signal);
 
  Don't export a function with __ in front of it, you are saying that an
  internal function is somehow valid for everyone else to call?  Why?
  You aren't even documenting the function, so who knows how to use it?
 
 fwiw, the __ versions appear to mainly be concessions for android
 syncpt.  That is the only user outside of fence.c, and it should stay
 that way.

How are you going to ensure this?  And where did you document it?
Please fix this up, it's a horrid way to create a new api.

If the android code needs to be fixed to fit into this model, then fix
it.

  +void
  +__fence_init(struct fence *fence, const struct fence_ops *ops,
  +  spinlock_t *lock, unsigned context, unsigned seqno)
  +{
  + BUG_ON(!lock);
  + BUG_ON(!ops || !ops-wait || !ops-enable_signaling ||
  +!ops-get_driver_name || !ops-get_timeline_name);
  +
  + kref_init(fence-refcount);
  + fence-ops = ops;
  + INIT_LIST_HEAD(fence-cb_list);
  + fence-lock = lock;
  + fence-context = context;
  + fence-seqno = seqno;
  + fence-flags = 0UL;
  +
  + trace_fence_init(fence);
  +}
  +EXPORT_SYMBOL(__fence_init);
 
  Again with the __ exported function...
 
  I don't even see a fence_init() function anywhere, why the __ ?
 
 
 think of it as a 'protected' constructor.. only the derived fence
 subclass should call.

Where do you say this?  Again, not a good reason, fix up the api please.

  + kref_get(fence-refcount);
  +}
 
  Why is this inline?
 
 performance can be critical.. especially if the driver is using this
 fence mechanism for internal buffers as well as shared buffers (which
 is what I'd like to do to avoid having to deal with two different
 fencing mechanisms for shared vs non-shared buffers), since you could
 easily have 100's or perhaps 1000's of buffers involved in a submit.

can be.  Did you actually measure it?  Please do so.

 The fence stuff does try to inline as much stuff as possible,
 especially critical-path stuff, for this reason.

Inlining code doesn't always mean faster, in fact, on lots of
processors and with large inline functions, the opposite is true.  So
only do so if you can measure it.

  +/**
  + 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Rob Clark
On Thu, Jun 19, 2014 at 1:00 PM, Greg KH gre...@linuxfoundation.org wrote:
 On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
 On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
  +#define CREATE_TRACE_POINTS
  +#include trace/events/fence.h
  +
  +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
  +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
 
  Are you really willing to live with these as tracepoints for forever?
  What is the use of them in debugging?  Was it just for debugging the
  fence code, or for something else?
 
  +/**
  + * fence_context_alloc - allocate an array of fence contexts
  + * @num: [in]amount of contexts to allocate
  + *
  + * This function will return the first index of the number of fences 
  allocated.
  + * The fence context is used for setting fence-context to a unique 
  number.
  + */
  +unsigned fence_context_alloc(unsigned num)
  +{
  + BUG_ON(!num);
  + return atomic_add_return(num, fence_context_counter) - num;
  +}
  +EXPORT_SYMBOL(fence_context_alloc);
 
  EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
  Traditionally all of the driver core exports have been with this
  marking, any objection to making that change here as well?

 tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
 wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
 life.  We already went through this debate once with dma-buf.  We
 aren't going to change $evil_vendor's mind about non-gpl modules.  The
 only result will be a more flugly convoluted solution (ie. use syncpt
 EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
 workaround, with the result that no-one benefits.

 It has been proven that using _GPL() exports have caused companies to
 release their code properly over the years, so as these really are
 Linux-only apis, please change them to be marked this way, it helps
 everyone out in the end.

Well, maybe that is the true in some cases.  But it certainly didn't
work out that way for dma-buf.  And I think the end result is worse.

I don't really like coming down on the side of EXPORT_SYMBOL() instead
of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
result will only be creative workarounds using the _GPL symbols
indirectly by whatever is available via EXPORT_SYMBOL().  I don't
really see how that will be better.

  +int __fence_signal(struct fence *fence)
  +{
  + struct fence_cb *cur, *tmp;
  + int ret = 0;
  +
  + if (WARN_ON(!fence))
  + return -EINVAL;
  +
  + if (!ktime_to_ns(fence-timestamp)) {
  + fence-timestamp = ktime_get();
  + smp_mb__before_atomic();
  + }
  +
  + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags)) {
  + ret = -EINVAL;
  +
  + /*
  +  * we might have raced with the unlocked fence_signal,
  +  * still run through all callbacks
  +  */
  + } else
  + trace_fence_signaled(fence);
  +
  + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
  + list_del_init(cur-node);
  + cur-func(fence, cur);
  + }
  + return ret;
  +}
  +EXPORT_SYMBOL(__fence_signal);
 
  Don't export a function with __ in front of it, you are saying that an
  internal function is somehow valid for everyone else to call?  Why?
  You aren't even documenting the function, so who knows how to use it?

 fwiw, the __ versions appear to mainly be concessions for android
 syncpt.  That is the only user outside of fence.c, and it should stay
 that way.

 How are you going to ensure this?  And where did you document it?
 Please fix this up, it's a horrid way to create a new api.

 If the android code needs to be fixed to fit into this model, then fix
 it.

heh, and in fact I was wrong about this.. the __ versions are actually
for when the lock is already held.  Maarten needs to rename (ie
_locked suffix) and add some API docs for this.

  +void
  +__fence_init(struct fence *fence, const struct fence_ops *ops,
  +  spinlock_t *lock, unsigned context, unsigned seqno)
  +{
  + BUG_ON(!lock);
  + BUG_ON(!ops || !ops-wait || !ops-enable_signaling ||
  +!ops-get_driver_name || !ops-get_timeline_name);
  +
  + kref_init(fence-refcount);
  + fence-ops = ops;
  + INIT_LIST_HEAD(fence-cb_list);
  + fence-lock = lock;
  + fence-context = context;
  + fence-seqno = seqno;
  + fence-flags = 0UL;
  +
  + trace_fence_init(fence);
  +}
  +EXPORT_SYMBOL(__fence_init);
 
  Again with the __ exported function...
 
  I don't even see a fence_init() function anywhere, why the __ ?
 

 think of it as a 'protected' constructor.. only the derived fence
 subclass should call.

 Where do you say this?  Again, not a good reason, fix up the api please.

  + kref_get(fence-refcount);
  +}
 
  Why 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Greg KH
On Thu, Jun 19, 2014 at 01:45:30PM -0400, Rob Clark wrote:
 On Thu, Jun 19, 2014 at 1:00 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
  On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org 
  wrote:
   On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
   +#define CREATE_TRACE_POINTS
   +#include trace/events/fence.h
   +
   +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
   +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
  
   Are you really willing to live with these as tracepoints for forever?
   What is the use of them in debugging?  Was it just for debugging the
   fence code, or for something else?
  
   +/**
   + * fence_context_alloc - allocate an array of fence contexts
   + * @num: [in]amount of contexts to allocate
   + *
   + * This function will return the first index of the number of fences 
   allocated.
   + * The fence context is used for setting fence-context to a unique 
   number.
   + */
   +unsigned fence_context_alloc(unsigned num)
   +{
   + BUG_ON(!num);
   + return atomic_add_return(num, fence_context_counter) - num;
   +}
   +EXPORT_SYMBOL(fence_context_alloc);
  
   EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
   Traditionally all of the driver core exports have been with this
   marking, any objection to making that change here as well?
 
  tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
  wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
  life.  We already went through this debate once with dma-buf.  We
  aren't going to change $evil_vendor's mind about non-gpl modules.  The
  only result will be a more flugly convoluted solution (ie. use syncpt
  EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
  workaround, with the result that no-one benefits.
 
  It has been proven that using _GPL() exports have caused companies to
  release their code properly over the years, so as these really are
  Linux-only apis, please change them to be marked this way, it helps
  everyone out in the end.
 
 Well, maybe that is the true in some cases.  But it certainly didn't
 work out that way for dma-buf.  And I think the end result is worse.
 
 I don't really like coming down on the side of EXPORT_SYMBOL() instead
 of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
 result will only be creative workarounds using the _GPL symbols
 indirectly by whatever is available via EXPORT_SYMBOL().  I don't
 really see how that will be better.

You are saying that you _know_ companies will violate our license, so
you should just give up?  And how do you know people aren't working on
preventing those indirect usages as well?  :)

Sorry, I'm not going to give up here, again, it has proven to work in
the past in changing the ways of _very_ large companies, why stop now?

thanks,

greg k-h
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread James Bottomley
On Thu, 2014-06-19 at 11:19 -0700, Greg KH wrote:
 On Thu, Jun 19, 2014 at 01:45:30PM -0400, Rob Clark wrote:
  On Thu, Jun 19, 2014 at 1:00 PM, Greg KH gre...@linuxfoundation.org wrote:
   On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
   On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org 
   wrote:
On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
+#define CREATE_TRACE_POINTS
+#include trace/events/fence.h
+
+EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
+EXPORT_TRACEPOINT_SYMBOL(fence_emit);
   
Are you really willing to live with these as tracepoints for forever?
What is the use of them in debugging?  Was it just for debugging the
fence code, or for something else?
   
+/**
+ * fence_context_alloc - allocate an array of fence contexts
+ * @num: [in]amount of contexts to allocate
+ *
+ * This function will return the first index of the number of fences 
allocated.
+ * The fence context is used for setting fence-context to a unique 
number.
+ */
+unsigned fence_context_alloc(unsigned num)
+{
+ BUG_ON(!num);
+ return atomic_add_return(num, fence_context_counter) - num;
+}
+EXPORT_SYMBOL(fence_context_alloc);
   
EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
Traditionally all of the driver core exports have been with this
marking, any objection to making that change here as well?
  
   tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
   wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
   life.  We already went through this debate once with dma-buf.  We
   aren't going to change $evil_vendor's mind about non-gpl modules.  The
   only result will be a more flugly convoluted solution (ie. use syncpt
   EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
   workaround, with the result that no-one benefits.
  
   It has been proven that using _GPL() exports have caused companies to
   release their code properly over the years, so as these really are
   Linux-only apis, please change them to be marked this way, it helps
   everyone out in the end.
  
  Well, maybe that is the true in some cases.  But it certainly didn't
  work out that way for dma-buf.  And I think the end result is worse.
  
  I don't really like coming down on the side of EXPORT_SYMBOL() instead
  of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
  result will only be creative workarounds using the _GPL symbols
  indirectly by whatever is available via EXPORT_SYMBOL().  I don't
  really see how that will be better.
 
 You are saying that you _know_ companies will violate our license, so
 you should just give up?  And how do you know people aren't working on
 preventing those indirect usages as well?  :)
 
 Sorry, I'm not going to give up here, again, it has proven to work in
 the past in changing the ways of _very_ large companies, why stop now?

When you try to train a dog, you have to be consistent about it.  We're
fantastically inconsistent in symbol exports.

For instance, the mutex primitives are all EXPORT_SYMBOL(), so we're
telling proprietary modules they can use them.  However, when the kernel
is built with CONFIG_DEBUG_MUTEX, they all become
EXPORT_SYMBOL_GPL() ... what type of crazy message is that supposed to
send?  It's OK to use mutexes but it's potentially a GPL violation to
debug them?

We either need to decide that we have a defined and consistent part of
our API that's GPL only or make the bold statement that we don't have
any part of our API that's usable by non-GPL modules.  Right at the
minute we do neither and it confuses people no end about what is and
isn't allowed.

James


--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Rob Clark
On Thu, Jun 19, 2014 at 2:19 PM, Greg KH gre...@linuxfoundation.org wrote:
 On Thu, Jun 19, 2014 at 01:45:30PM -0400, Rob Clark wrote:
 On Thu, Jun 19, 2014 at 1:00 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
  On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org 
  wrote:
   On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
   +#define CREATE_TRACE_POINTS
   +#include trace/events/fence.h
   +
   +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
   +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
  
   Are you really willing to live with these as tracepoints for forever?
   What is the use of them in debugging?  Was it just for debugging the
   fence code, or for something else?
  
   +/**
   + * fence_context_alloc - allocate an array of fence contexts
   + * @num: [in]amount of contexts to allocate
   + *
   + * This function will return the first index of the number of fences 
   allocated.
   + * The fence context is used for setting fence-context to a unique 
   number.
   + */
   +unsigned fence_context_alloc(unsigned num)
   +{
   + BUG_ON(!num);
   + return atomic_add_return(num, fence_context_counter) - num;
   +}
   +EXPORT_SYMBOL(fence_context_alloc);
  
   EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
   Traditionally all of the driver core exports have been with this
   marking, any objection to making that change here as well?
 
  tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
  wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
  life.  We already went through this debate once with dma-buf.  We
  aren't going to change $evil_vendor's mind about non-gpl modules.  The
  only result will be a more flugly convoluted solution (ie. use syncpt
  EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
  workaround, with the result that no-one benefits.
 
  It has been proven that using _GPL() exports have caused companies to
  release their code properly over the years, so as these really are
  Linux-only apis, please change them to be marked this way, it helps
  everyone out in the end.

 Well, maybe that is the true in some cases.  But it certainly didn't
 work out that way for dma-buf.  And I think the end result is worse.

 I don't really like coming down on the side of EXPORT_SYMBOL() instead
 of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
 result will only be creative workarounds using the _GPL symbols
 indirectly by whatever is available via EXPORT_SYMBOL().  I don't
 really see how that will be better.

 You are saying that you _know_ companies will violate our license, so
 you should just give up?  And how do you know people aren't working on
 preventing those indirect usages as well?  :)

Well, all I know is what happened with dmabuf.  This seems like the
exact same scenario (same vendor, same driver, same use-case).

Not really sure how we could completely prevent indirect usage, given
that drm core and many of the drivers are dual MIT/GPL.   (But ofc,
IANAL.)

 Sorry, I'm not going to give up here, again, it has proven to work in
 the past in changing the ways of _very_ large companies, why stop now?

In the general case, I would agree.  But in this specific case, I am
not very optimistic.

That said, it isn't really my loss if it is _GPL()..  I don't have to
use or support that particular driver.  But given that we have some
history from the same debate with dma-buf, I think it is pretty easy
to infer the result from making fence EXPORT_SYMBOL_GPL().

BR,
-R

 thanks,

 greg k-h
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Daniel Vetter
On Thu, Jun 19, 2014 at 7:00 PM, Greg KH gre...@linuxfoundation.org wrote:
  + BUG_ON(f1-context != f2-context);
 
  Nice, you just crashed the kernel, making it impossible to debug or
  recover :(

 agreed, that should probably be 'if (WARN_ON(...)) return NULL;'

 (but at least I wouldn't expect to hit that under console_lock so you
 should at least see the last N lines of the backtrace on the screen
 ;-))

 Lots of devices don't have console screens :)

Aside: This is a pet peeve of mine and recently I've switched to
rejecting all patch that have a BUG_ON, period. Except when you can
prove that the kernel will die in the next few lines and there's
nothing you can do about it a WARN_ON is always better - I've wasted
_way_ too much time debugging hard hangs because such a benign
BUG_ON ended up eating my irq handler or a spinlock required by such.
Or some other nonsense that makes debugging a royal pita, especially
if your remote debugger consists of a frustrated users staring at a
hung machine.

/rant

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Daniel Vetter
On Thu, Jun 19, 2014 at 8:19 PM, Greg KH gre...@linuxfoundation.org wrote:
   EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
   Traditionally all of the driver core exports have been with this
   marking, any objection to making that change here as well?
 
  tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
  wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
  life.  We already went through this debate once with dma-buf.  We
  aren't going to change $evil_vendor's mind about non-gpl modules.  The
  only result will be a more flugly convoluted solution (ie. use syncpt
  EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
  workaround, with the result that no-one benefits.
 
  It has been proven that using _GPL() exports have caused companies to
  release their code properly over the years, so as these really are
  Linux-only apis, please change them to be marked this way, it helps
  everyone out in the end.

 Well, maybe that is the true in some cases.  But it certainly didn't
 work out that way for dma-buf.  And I think the end result is worse.

 I don't really like coming down on the side of EXPORT_SYMBOL() instead
 of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
 result will only be creative workarounds using the _GPL symbols
 indirectly by whatever is available via EXPORT_SYMBOL().  I don't
 really see how that will be better.

 You are saying that you _know_ companies will violate our license, so
 you should just give up?  And how do you know people aren't working on
 preventing those indirect usages as well?  :)

 Sorry, I'm not going to give up here, again, it has proven to work in
 the past in changing the ways of _very_ large companies, why stop now?

Dave should chime in here since currently dma-buf is _GPL and the
drm_prime.c wrapper for it is not (and he merged that one, contributed
from said $vendor). And since we're gfx people everything we do is MIT
licensed (that's where X is from after all), so _GPL for for drm stuff
really doesn't make a lot of sense for us. ianal and all that applies.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Greg KH
On Thu, Jun 19, 2014 at 09:15:36PM +0200, Daniel Vetter wrote:
 On Thu, Jun 19, 2014 at 7:00 PM, Greg KH gre...@linuxfoundation.org wrote:
   + BUG_ON(f1-context != f2-context);
  
   Nice, you just crashed the kernel, making it impossible to debug or
   recover :(
 
  agreed, that should probably be 'if (WARN_ON(...)) return NULL;'
 
  (but at least I wouldn't expect to hit that under console_lock so you
  should at least see the last N lines of the backtrace on the screen
  ;-))
 
  Lots of devices don't have console screens :)
 
 Aside: This is a pet peeve of mine and recently I've switched to
 rejecting all patch that have a BUG_ON, period.

Please do, I have been for a few years now as well for the same reasons
you cite.

greg k-h
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Dave Airlie
On 20 June 2014 04:19, Greg KH gre...@linuxfoundation.org wrote:
 On Thu, Jun 19, 2014 at 01:45:30PM -0400, Rob Clark wrote:
 On Thu, Jun 19, 2014 at 1:00 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
  On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org 
  wrote:
   On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
   +#define CREATE_TRACE_POINTS
   +#include trace/events/fence.h
   +
   +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
   +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
  
   Are you really willing to live with these as tracepoints for forever?
   What is the use of them in debugging?  Was it just for debugging the
   fence code, or for something else?
  
   +/**
   + * fence_context_alloc - allocate an array of fence contexts
   + * @num: [in]amount of contexts to allocate
   + *
   + * This function will return the first index of the number of fences 
   allocated.
   + * The fence context is used for setting fence-context to a unique 
   number.
   + */
   +unsigned fence_context_alloc(unsigned num)
   +{
   + BUG_ON(!num);
   + return atomic_add_return(num, fence_context_counter) - num;
   +}
   +EXPORT_SYMBOL(fence_context_alloc);
  
   EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
   Traditionally all of the driver core exports have been with this
   marking, any objection to making that change here as well?
 
  tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
  wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
  life.  We already went through this debate once with dma-buf.  We
  aren't going to change $evil_vendor's mind about non-gpl modules.  The
  only result will be a more flugly convoluted solution (ie. use syncpt
  EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
  workaround, with the result that no-one benefits.
 
  It has been proven that using _GPL() exports have caused companies to
  release their code properly over the years, so as these really are
  Linux-only apis, please change them to be marked this way, it helps
  everyone out in the end.

 Well, maybe that is the true in some cases.  But it certainly didn't
 work out that way for dma-buf.  And I think the end result is worse.

 I don't really like coming down on the side of EXPORT_SYMBOL() instead
 of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
 result will only be creative workarounds using the _GPL symbols
 indirectly by whatever is available via EXPORT_SYMBOL().  I don't
 really see how that will be better.

 You are saying that you _know_ companies will violate our license, so
 you should just give up?  And how do you know people aren't working on
 preventing those indirect usages as well?  :)

 Sorry, I'm not going to give up here, again, it has proven to work in
 the past in changing the ways of _very_ large companies, why stop now?

I've found large companies shipping lots of hw putting pressure on
other large/small companies seems to be only way this has ever
happened, we'd like to cover that up and say its some great GPL
enforcement thing.

To be honest, author's choice is how I'd treat this.

Personally I think _GPL is broken by design, and that Linus's initial
point for them has been so diluted by random lobby groups asking for
every symbol to be _GPL that they are becoming effectively pointless
now. I also dislike the fact that the lobby groups don't just bring
violators to court. I'm also sure someone like the LF could have a
nice income stream if Linus gave them permission to enforce his
copyrights.

But anyways, has someone checked that iOS or Windows don't have a
fence interface? so we know that this is a Linux only interface and
any works using it are derived? Say the nvidia driver isn't a derived
work now, will using this interface magically translate it into a
derived work, so we can go sue them? I don't think so.

But its up to Maarten and Rob, and if they say no _GPL then I don't
think we should be overriding authors intents.

Dave.
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread H. Peter Anvin
On 06/19/2014 01:01 PM, Greg KH wrote:
 On Thu, Jun 19, 2014 at 09:15:36PM +0200, Daniel Vetter wrote:
 On Thu, Jun 19, 2014 at 7:00 PM, Greg KH gre...@linuxfoundation.org wrote:
 + BUG_ON(f1-context != f2-context);

 Nice, you just crashed the kernel, making it impossible to debug or
 recover :(

 agreed, that should probably be 'if (WARN_ON(...)) return NULL;'

 (but at least I wouldn't expect to hit that under console_lock so you
 should at least see the last N lines of the backtrace on the screen
 ;-))

 Lots of devices don't have console screens :)

 Aside: This is a pet peeve of mine and recently I've switched to
 rejecting all patch that have a BUG_ON, period.
 
 Please do, I have been for a few years now as well for the same reasons
 you cite.
 

I'm actually concerned about this trend.  Downgrading things to WARN_ON
can allow a security bug in the kernel to continue to exist, for
example, or make the error message disappear.

I am wondering if the right thing here isn't to have a user (command
line?) settable policy as to how to proceed on an assert violation,
instead of hardcoding it at compile time.

-hpa


--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread James Bottomley
On Thu, 2014-06-19 at 15:39 -0700, H. Peter Anvin wrote:
 On 06/19/2014 01:01 PM, Greg KH wrote:
  On Thu, Jun 19, 2014 at 09:15:36PM +0200, Daniel Vetter wrote:
  On Thu, Jun 19, 2014 at 7:00 PM, Greg KH gre...@linuxfoundation.org 
  wrote:
  + BUG_ON(f1-context != f2-context);
 
  Nice, you just crashed the kernel, making it impossible to debug or
  recover :(
 
  agreed, that should probably be 'if (WARN_ON(...)) return NULL;'
 
  (but at least I wouldn't expect to hit that under console_lock so you
  should at least see the last N lines of the backtrace on the screen
  ;-))
 
  Lots of devices don't have console screens :)
 
  Aside: This is a pet peeve of mine and recently I've switched to
  rejecting all patch that have a BUG_ON, period.
  
  Please do, I have been for a few years now as well for the same reasons
  you cite.
  
 
 I'm actually concerned about this trend.  Downgrading things to WARN_ON
 can allow a security bug in the kernel to continue to exist, for
 example, or make the error message disappear.

Me too.  We use BUG_ON in the I/O subsystem where we're forced to
violate a guarantee.  When the choice is corrupt something or panic the
system, I prefer the latter every time.

 I am wondering if the right thing here isn't to have a user (command
 line?) settable policy as to how to proceed on an assert violation,
 instead of hardcoding it at compile time.

I'd say it depends on the consequence of the assertion violation.  We
have assertions that are largely theoretical, ones that govern process
internal state (so killing the process mostly sanitizes the system) and
a few that imply data loss or data corruption.

James


--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Rob Clark
On Thu, Jun 19, 2014 at 5:50 PM, Dave Airlie airl...@gmail.com wrote:
 On 20 June 2014 04:19, Greg KH gre...@linuxfoundation.org wrote:
 On Thu, Jun 19, 2014 at 01:45:30PM -0400, Rob Clark wrote:
 On Thu, Jun 19, 2014 at 1:00 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Thu, Jun 19, 2014 at 10:00:18AM -0400, Rob Clark wrote:
  On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org 
  wrote:
   On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
   +#define CREATE_TRACE_POINTS
   +#include trace/events/fence.h
   +
   +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
   +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
  
   Are you really willing to live with these as tracepoints for forever?
   What is the use of them in debugging?  Was it just for debugging the
   fence code, or for something else?
  
   +/**
   + * fence_context_alloc - allocate an array of fence contexts
   + * @num: [in]amount of contexts to allocate
   + *
   + * This function will return the first index of the number of fences 
   allocated.
   + * The fence context is used for setting fence-context to a unique 
   number.
   + */
   +unsigned fence_context_alloc(unsigned num)
   +{
   + BUG_ON(!num);
   + return atomic_add_return(num, fence_context_counter) - num;
   +}
   +EXPORT_SYMBOL(fence_context_alloc);
  
   EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
   Traditionally all of the driver core exports have been with this
   marking, any objection to making that change here as well?
 
  tbh, I prefer EXPORT_SYMBOL()..  well, I'd prefer even more if there
  wasn't even a need for EXPORT_SYMBOL_GPL(), but sadly it is a fact of
  life.  We already went through this debate once with dma-buf.  We
  aren't going to change $evil_vendor's mind about non-gpl modules.  The
  only result will be a more flugly convoluted solution (ie. use syncpt
  EXPORT_SYMBOL() on top of fence EXPORT_SYMBOL_GPL()) just as a
  workaround, with the result that no-one benefits.
 
  It has been proven that using _GPL() exports have caused companies to
  release their code properly over the years, so as these really are
  Linux-only apis, please change them to be marked this way, it helps
  everyone out in the end.

 Well, maybe that is the true in some cases.  But it certainly didn't
 work out that way for dma-buf.  And I think the end result is worse.

 I don't really like coming down on the side of EXPORT_SYMBOL() instead
 of EXPORT_SYMBOL_GPL(), but if we do use EXPORT_SYMBOL_GPL() then the
 result will only be creative workarounds using the _GPL symbols
 indirectly by whatever is available via EXPORT_SYMBOL().  I don't
 really see how that will be better.

 You are saying that you _know_ companies will violate our license, so
 you should just give up?  And how do you know people aren't working on
 preventing those indirect usages as well?  :)

 Sorry, I'm not going to give up here, again, it has proven to work in
 the past in changing the ways of _very_ large companies, why stop now?

 I've found large companies shipping lots of hw putting pressure on
 other large/small companies seems to be only way this has ever
 happened, we'd like to cover that up and say its some great GPL
 enforcement thing.

 To be honest, author's choice is how I'd treat this.

 Personally I think _GPL is broken by design, and that Linus's initial
 point for them has been so diluted by random lobby groups asking for
 every symbol to be _GPL that they are becoming effectively pointless
 now. I also dislike the fact that the lobby groups don't just bring
 violators to court. I'm also sure someone like the LF could have a
 nice income stream if Linus gave them permission to enforce his
 copyrights.

 But anyways, has someone checked that iOS or Windows don't have a
 fence interface? so we know that this is a Linux only interface and
 any works using it are derived? Say the nvidia driver isn't a derived
 work now, will using this interface magically translate it into a
 derived work, so we can go sue them? I don't think so.

I've no ideas about what the APIs are in windows, but windows has had
multi-gpu support for a *long* time, which implies some mechanism like
dmabuf and fence.. this isn't exactly an area where we are
trailblazing here.

BR,
-R


 But its up to Maarten and Rob, and if they say no _GPL then I don't
 think we should be overriding authors intents.

 Dave.
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-19 Thread Greg KH
On Thu, Jun 19, 2014 at 03:39:47PM -0700, H. Peter Anvin wrote:
 On 06/19/2014 01:01 PM, Greg KH wrote:
  On Thu, Jun 19, 2014 at 09:15:36PM +0200, Daniel Vetter wrote:
  On Thu, Jun 19, 2014 at 7:00 PM, Greg KH gre...@linuxfoundation.org 
  wrote:
  + BUG_ON(f1-context != f2-context);
 
  Nice, you just crashed the kernel, making it impossible to debug or
  recover :(
 
  agreed, that should probably be 'if (WARN_ON(...)) return NULL;'
 
  (but at least I wouldn't expect to hit that under console_lock so you
  should at least see the last N lines of the backtrace on the screen
  ;-))
 
  Lots of devices don't have console screens :)
 
  Aside: This is a pet peeve of mine and recently I've switched to
  rejecting all patch that have a BUG_ON, period.
  
  Please do, I have been for a few years now as well for the same reasons
  you cite.
  
 
 I'm actually concerned about this trend.  Downgrading things to WARN_ON
 can allow a security bug in the kernel to continue to exist, for
 example, or make the error message disappear.

A BUG_ON makes any error message disappear pretty quickly :)

I'm talking about foolish ASSERT-like BUG_ON that driver authors like
to add to their code when writing it to catch things they are messing
up.  After the code is working, they should be removed, like this one.

Don't enforce an api requirement with a kernel crash, warn and return an
error which the caller should always be checking anyway.

thanks,

greg k-h
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Maarten Lankhorst
A fence can be attached to a buffer which is being filled or consumed
by hw, to allow userspace to pass the buffer without waiting to another
device.  For example, userspace can call page_flip ioctl to display the
next frame of graphics after kicking the GPU but while the GPU is still
rendering.  The display device sharing the buffer with the GPU would
attach a callback to get notified when the GPU's rendering-complete IRQ
fires, to update the scan-out address of the display, without having to
wake up userspace.

A driver must allocate a fence context for each execution ring that can
run in parallel. The function for this takes an argument with how many
contexts to allocate:
  + fence_context_alloc()

A fence is transient, one-shot deal.  It is allocated and attached
to one or more dma-buf's.  When the one that attached it is done, with
the pending operation, it can signal the fence:
  + fence_signal()

To have a rough approximation whether a fence is fired, call:
  + fence_is_signaled()

The dma-buf-mgr handles tracking, and waiting on, the fences associated
with a dma-buf.

The one pending on the fence can add an async callback:
  + fence_add_callback()

The callback can optionally be cancelled with:
  + fence_remove_callback()

To wait synchronously, optionally with a timeout:
  + fence_wait()
  + fence_wait_timeout()

When emitting a fence, call:
  + trace_fence_emit()

To annotate that a fence is blocking on another fence, call:
  + trace_fence_annotate_wait_on(fence, on_fence)

A default software-only implementation is provided, which can be used
by drivers attaching a fence to a buffer when they have no other means
for hw sync.  But a memory backed fence is also envisioned, because it
is common that GPU's can write to, or poll on some memory location for
synchronization.  For example:

  fence = custom_get_fence(...);
  if ((seqno_fence = to_seqno_fence(fence)) != NULL) {
dma_buf *fence_buf = seqno_fence-sync_buf;
get_dma_buf(fence_buf);

... tell the hw the memory location to wait ...
custom_wait_on(fence_buf, seqno_fence-seqno_ofs, fence-seqno);
  } else {
/* fall-back to sw sync * /
fence_add_callback(fence, my_cb);
  }

On SoC platforms, if some other hw mechanism is provided for synchronizing
between IP blocks, it could be supported as an alternate implementation
with it's own fence ops in a similar way.

enable_signaling callback is used to provide sw signaling in case a cpu
waiter is requested or no compatible hardware signaling could be used.

The intention is to provide a userspace interface (presumably via eventfd)
later, to be used in conjunction with dma-buf's mmap support for sw access
to buffers (or for userspace apps that would prefer to do their own
synchronization).

v1: Original
v2: After discussion w/ danvet and mlankhorst on #dri-devel, we decided
that dma-fence didn't need to care about the sw-hw signaling path
(it can be handled same as sw-sw case), and therefore the fence-ops
can be simplified and more handled in the core.  So remove the signal,
add_callback, cancel_callback, and wait ops, and replace with a simple
enable_signaling() op which can be used to inform a fence supporting
hw-hw signaling that one or more devices which do not support hw
signaling are waiting (and therefore it should enable an irq or do
whatever is necessary in order that the CPU is notified when the
fence is passed).
v3: Fix locking fail in attach_fence() and get_fence()
v4: Remove tie-in w/ dma-buf..  after discussion w/ danvet and mlankorst
we decided that we need to be able to attach one fence to N dma-buf's,
so using the list_head in dma-fence struct would be problematic.
v5: [ Maarten Lankhorst ] Updated for dma-bikeshed-fence and dma-buf-manager.
v6: [ Maarten Lankhorst ] I removed dma_fence_cancel_callback and some comments
about checking if fence fired or not. This is broken by design.
waitqueue_active during destruction is now fatal, since the signaller
should be holding a reference in enable_signalling until it signalled
the fence. Pass the original dma_fence_cb along, and call __remove_wait
in the dma_fence_callback handler, so that no cleanup needs to be
performed.
v7: [ Maarten Lankhorst ] Set cb-func and only enable sw signaling if
fence wasn't signaled yet, for example for hardware fences that may
choose to signal blindly.
v8: [ Maarten Lankhorst ] Tons of tiny fixes, moved __dma_fence_init to
header and fixed include mess. dma-fence.h now includes dma-buf.h
All members are now initialized, so kmalloc can be used for
allocating a dma-fence. More documentation added.
v9: Change compiler bitfields to flags, change return type of
enable_signaling to bool. Rework dma_fence_wait. Added
dma_fence_is_signaled and dma_fence_wait_timeout.
s/dma// and change exports to non GPL. Added fence_is_signaled and
fence_enable_sw_signaling calls, add ability to override default

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Greg KH
On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 +#define CREATE_TRACE_POINTS
 +#include trace/events/fence.h
 +
 +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
 +EXPORT_TRACEPOINT_SYMBOL(fence_emit);

Are you really willing to live with these as tracepoints for forever?
What is the use of them in debugging?  Was it just for debugging the
fence code, or for something else?

 +/**
 + * fence_context_alloc - allocate an array of fence contexts
 + * @num: [in]amount of contexts to allocate
 + *
 + * This function will return the first index of the number of fences 
 allocated.
 + * The fence context is used for setting fence-context to a unique number.
 + */
 +unsigned fence_context_alloc(unsigned num)
 +{
 + BUG_ON(!num);
 + return atomic_add_return(num, fence_context_counter) - num;
 +}
 +EXPORT_SYMBOL(fence_context_alloc);

EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
Traditionally all of the driver core exports have been with this
marking, any objection to making that change here as well?

 +int __fence_signal(struct fence *fence)
 +{
 + struct fence_cb *cur, *tmp;
 + int ret = 0;
 +
 + if (WARN_ON(!fence))
 + return -EINVAL;
 +
 + if (!ktime_to_ns(fence-timestamp)) {
 + fence-timestamp = ktime_get();
 + smp_mb__before_atomic();
 + }
 +
 + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags)) {
 + ret = -EINVAL;
 +
 + /*
 +  * we might have raced with the unlocked fence_signal,
 +  * still run through all callbacks
 +  */
 + } else
 + trace_fence_signaled(fence);
 +
 + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
 + list_del_init(cur-node);
 + cur-func(fence, cur);
 + }
 + return ret;
 +}
 +EXPORT_SYMBOL(__fence_signal);

Don't export a function with __ in front of it, you are saying that an
internal function is somehow valid for everyone else to call?  Why?
You aren't even documenting the function, so who knows how to use it?

 +/**
 + * fence_signal - signal completion of a fence
 + * @fence: the fence to signal
 + *
 + * Signal completion for software callbacks on a fence, this will unblock
 + * fence_wait() calls and run all the callbacks added with
 + * fence_add_callback(). Can be called multiple times, but since a fence
 + * can only go from unsignaled to signaled state, it will only be effective
 + * the first time.
 + */
 +int fence_signal(struct fence *fence)
 +{
 + unsigned long flags;
 +
 + if (!fence)
 + return -EINVAL;
 +
 + if (!ktime_to_ns(fence-timestamp)) {
 + fence-timestamp = ktime_get();
 + smp_mb__before_atomic();
 + }
 +
 + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags))
 + return -EINVAL;
 +
 + trace_fence_signaled(fence);
 +
 + if (test_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, fence-flags)) {
 + struct fence_cb *cur, *tmp;
 +
 + spin_lock_irqsave(fence-lock, flags);
 + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
 + list_del_init(cur-node);
 + cur-func(fence, cur);
 + }
 + spin_unlock_irqrestore(fence-lock, flags);
 + }
 + return 0;
 +}
 +EXPORT_SYMBOL(fence_signal);

So, why should I use this over __fence_signal?  What is the difference?
Am I missing some documentation somewhere?

 +void release_fence(struct kref *kref)
 +{
 + struct fence *fence =
 + container_of(kref, struct fence, refcount);
 +
 + trace_fence_destroy(fence);
 +
 + BUG_ON(!list_empty(fence-cb_list));
 +
 + if (fence-ops-release)
 + fence-ops-release(fence);
 + else
 + kfree(fence);
 +}
 +EXPORT_SYMBOL(release_fence);

fence_release() makes it more unified with the other functions in this
file, right?

 +/**
 + * fence_default_wait - default sleep until the fence gets signaled
 + * or until timeout elapses
 + * @fence:   [in]the fence to wait on
 + * @intr:[in]if true, do an interruptible wait
 + * @timeout: [in]timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
 + *
 + * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
 + * remaining timeout in jiffies on success.
 + */
 +long

Shouldn't this be signed to be explicit?

 +fence_default_wait(struct fence *fence, bool intr, signed long timeout)
 +{
 + struct default_wait_cb cb;
 + unsigned long flags;
 + long ret = timeout;
 + bool was_set;
 +
 + if (test_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags))
 + return timeout;
 +
 + spin_lock_irqsave(fence-lock, flags);
 +
 + if (intr  signal_pending(current)) {
 + ret = -ERESTARTSYS;
 + goto out;
 + }
 +
 + was_set = test_and_set_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, fence-flags);
 +
 + if 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Greg KH
On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 + * This program is distributed in the hope that it will be useful, but 
 WITHOUT
 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 + * more details.

I don't like this paragraph in all of the files, but if you insist that
some lawyer wants it there, I'll live with it...

 + * You should have received a copy of the GNU General Public License along 
 with
 + * this program.  If not, see http://www.gnu.org/licenses/.

That's just not needed at all and is fluff.  Please remove.
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Greg KH
On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 A fence can be attached to a buffer which is being filled or consumed
 by hw, to allow userspace to pass the buffer without waiting to another
 device.  For example, userspace can call page_flip ioctl to display the
 next frame of graphics after kicking the GPU but while the GPU is still
 rendering.  The display device sharing the buffer with the GPU would
 attach a callback to get notified when the GPU's rendering-complete IRQ
 fires, to update the scan-out address of the display, without having to
 wake up userspace.
 
 A driver must allocate a fence context for each execution ring that can
 run in parallel. The function for this takes an argument with how many
 contexts to allocate:
   + fence_context_alloc()
 
 A fence is transient, one-shot deal.  It is allocated and attached
 to one or more dma-buf's.  When the one that attached it is done, with
 the pending operation, it can signal the fence:
   + fence_signal()
 
 To have a rough approximation whether a fence is fired, call:
   + fence_is_signaled()
 
 The dma-buf-mgr handles tracking, and waiting on, the fences associated
 with a dma-buf.
 
 The one pending on the fence can add an async callback:
   + fence_add_callback()
 
 The callback can optionally be cancelled with:
   + fence_remove_callback()
 
 To wait synchronously, optionally with a timeout:
   + fence_wait()
   + fence_wait_timeout()
 
 When emitting a fence, call:
   + trace_fence_emit()
 
 To annotate that a fence is blocking on another fence, call:
   + trace_fence_annotate_wait_on(fence, on_fence)
 
 A default software-only implementation is provided, which can be used
 by drivers attaching a fence to a buffer when they have no other means
 for hw sync.  But a memory backed fence is also envisioned, because it
 is common that GPU's can write to, or poll on some memory location for
 synchronization.  For example:
 
   fence = custom_get_fence(...);
   if ((seqno_fence = to_seqno_fence(fence)) != NULL) {
 dma_buf *fence_buf = seqno_fence-sync_buf;
 get_dma_buf(fence_buf);
 
 ... tell the hw the memory location to wait ...
 custom_wait_on(fence_buf, seqno_fence-seqno_ofs, fence-seqno);
   } else {
 /* fall-back to sw sync * /
 fence_add_callback(fence, my_cb);
   }
 
 On SoC platforms, if some other hw mechanism is provided for synchronizing
 between IP blocks, it could be supported as an alternate implementation
 with it's own fence ops in a similar way.
 
 enable_signaling callback is used to provide sw signaling in case a cpu
 waiter is requested or no compatible hardware signaling could be used.
 
 The intention is to provide a userspace interface (presumably via eventfd)
 later, to be used in conjunction with dma-buf's mmap support for sw access
 to buffers (or for userspace apps that would prefer to do their own
 synchronization).
 
 v1: Original
 v2: After discussion w/ danvet and mlankhorst on #dri-devel, we decided
 that dma-fence didn't need to care about the sw-hw signaling path
 (it can be handled same as sw-sw case), and therefore the fence-ops
 can be simplified and more handled in the core.  So remove the signal,
 add_callback, cancel_callback, and wait ops, and replace with a simple
 enable_signaling() op which can be used to inform a fence supporting
 hw-hw signaling that one or more devices which do not support hw
 signaling are waiting (and therefore it should enable an irq or do
 whatever is necessary in order that the CPU is notified when the
 fence is passed).
 v3: Fix locking fail in attach_fence() and get_fence()
 v4: Remove tie-in w/ dma-buf..  after discussion w/ danvet and mlankorst
 we decided that we need to be able to attach one fence to N dma-buf's,
 so using the list_head in dma-fence struct would be problematic.
 v5: [ Maarten Lankhorst ] Updated for dma-bikeshed-fence and dma-buf-manager.
 v6: [ Maarten Lankhorst ] I removed dma_fence_cancel_callback and some 
 comments
 about checking if fence fired or not. This is broken by design.
 waitqueue_active during destruction is now fatal, since the signaller
 should be holding a reference in enable_signalling until it signalled
 the fence. Pass the original dma_fence_cb along, and call __remove_wait
 in the dma_fence_callback handler, so that no cleanup needs to be
 performed.
 v7: [ Maarten Lankhorst ] Set cb-func and only enable sw signaling if
 fence wasn't signaled yet, for example for hardware fences that may
 choose to signal blindly.
 v8: [ Maarten Lankhorst ] Tons of tiny fixes, moved __dma_fence_init to
 header and fixed include mess. dma-fence.h now includes dma-buf.h
 All members are now initialized, so kmalloc can be used for
 allocating a dma-fence. More documentation added.
 v9: Change compiler bitfields to flags, change return type of
 enable_signaling to bool. Rework dma_fence_wait. Added
 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Rob Clark
On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org wrote:
 On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 +#define CREATE_TRACE_POINTS
 +#include trace/events/fence.h
 +
 +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
 +EXPORT_TRACEPOINT_SYMBOL(fence_emit);

 Are you really willing to live with these as tracepoints for forever?
 What is the use of them in debugging?  Was it just for debugging the
 fence code, or for something else?

fwiw, the goal is something like this:

http://people.freedesktop.org/~robclark/perf-supertuxkart.svg

but without needing to make perf understand each driver's custom trace events

(from: 
http://bloggingthemonkey.blogspot.com/2013/09/freedreno-update-moar-fps.html
)

BR,
-R


 +/**
 + * fence_context_alloc - allocate an array of fence contexts
 + * @num: [in]amount of contexts to allocate
 + *
 + * This function will return the first index of the number of fences 
 allocated.
 + * The fence context is used for setting fence-context to a unique number.
 + */
 +unsigned fence_context_alloc(unsigned num)
 +{
 + BUG_ON(!num);
 + return atomic_add_return(num, fence_context_counter) - num;
 +}
 +EXPORT_SYMBOL(fence_context_alloc);

 EXPORT_SYMBOL_GPL()?  Same goes for all of the exports in here.
 Traditionally all of the driver core exports have been with this
 marking, any objection to making that change here as well?

 +int __fence_signal(struct fence *fence)
 +{
 + struct fence_cb *cur, *tmp;
 + int ret = 0;
 +
 + if (WARN_ON(!fence))
 + return -EINVAL;
 +
 + if (!ktime_to_ns(fence-timestamp)) {
 + fence-timestamp = ktime_get();
 + smp_mb__before_atomic();
 + }
 +
 + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags)) {
 + ret = -EINVAL;
 +
 + /*
 +  * we might have raced with the unlocked fence_signal,
 +  * still run through all callbacks
 +  */
 + } else
 + trace_fence_signaled(fence);
 +
 + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
 + list_del_init(cur-node);
 + cur-func(fence, cur);
 + }
 + return ret;
 +}
 +EXPORT_SYMBOL(__fence_signal);

 Don't export a function with __ in front of it, you are saying that an
 internal function is somehow valid for everyone else to call?  Why?
 You aren't even documenting the function, so who knows how to use it?

 +/**
 + * fence_signal - signal completion of a fence
 + * @fence: the fence to signal
 + *
 + * Signal completion for software callbacks on a fence, this will unblock
 + * fence_wait() calls and run all the callbacks added with
 + * fence_add_callback(). Can be called multiple times, but since a fence
 + * can only go from unsignaled to signaled state, it will only be effective
 + * the first time.
 + */
 +int fence_signal(struct fence *fence)
 +{
 + unsigned long flags;
 +
 + if (!fence)
 + return -EINVAL;
 +
 + if (!ktime_to_ns(fence-timestamp)) {
 + fence-timestamp = ktime_get();
 + smp_mb__before_atomic();
 + }
 +
 + if (test_and_set_bit(FENCE_FLAG_SIGNALED_BIT, fence-flags))
 + return -EINVAL;
 +
 + trace_fence_signaled(fence);
 +
 + if (test_bit(FENCE_FLAG_ENABLE_SIGNAL_BIT, fence-flags)) {
 + struct fence_cb *cur, *tmp;
 +
 + spin_lock_irqsave(fence-lock, flags);
 + list_for_each_entry_safe(cur, tmp, fence-cb_list, node) {
 + list_del_init(cur-node);
 + cur-func(fence, cur);
 + }
 + spin_unlock_irqrestore(fence-lock, flags);
 + }
 + return 0;
 +}
 +EXPORT_SYMBOL(fence_signal);

 So, why should I use this over __fence_signal?  What is the difference?
 Am I missing some documentation somewhere?

 +void release_fence(struct kref *kref)
 +{
 + struct fence *fence =
 + container_of(kref, struct fence, refcount);
 +
 + trace_fence_destroy(fence);
 +
 + BUG_ON(!list_empty(fence-cb_list));
 +
 + if (fence-ops-release)
 + fence-ops-release(fence);
 + else
 + kfree(fence);
 +}
 +EXPORT_SYMBOL(release_fence);

 fence_release() makes it more unified with the other functions in this
 file, right?

 +/**
 + * fence_default_wait - default sleep until the fence gets signaled
 + * or until timeout elapses
 + * @fence:   [in]the fence to wait on
 + * @intr:[in]if true, do an interruptible wait
 + * @timeout: [in]timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
 + *
 + * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or the
 + * remaining timeout in jiffies on success.
 + */
 +long

 Shouldn't this be signed to be explicit?

 +fence_default_wait(struct fence *fence, bool intr, signed long timeout)
 +{
 + struct default_wait_cb cb;
 + unsigned long flags;
 + long ret = timeout;
 + bool was_set;
 +
 + 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Rob Clark
On Wed, Jun 18, 2014 at 9:16 PM, Greg KH gre...@linuxfoundation.org wrote:
 On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 A fence can be attached to a buffer which is being filled or consumed
 by hw, to allow userspace to pass the buffer without waiting to another
 device.  For example, userspace can call page_flip ioctl to display the
 next frame of graphics after kicking the GPU but while the GPU is still
 rendering.  The display device sharing the buffer with the GPU would
 attach a callback to get notified when the GPU's rendering-complete IRQ
 fires, to update the scan-out address of the display, without having to
 wake up userspace.

 A driver must allocate a fence context for each execution ring that can
 run in parallel. The function for this takes an argument with how many
 contexts to allocate:
   + fence_context_alloc()

 A fence is transient, one-shot deal.  It is allocated and attached
 to one or more dma-buf's.  When the one that attached it is done, with
 the pending operation, it can signal the fence:
   + fence_signal()

 To have a rough approximation whether a fence is fired, call:
   + fence_is_signaled()

 The dma-buf-mgr handles tracking, and waiting on, the fences associated
 with a dma-buf.

 The one pending on the fence can add an async callback:
   + fence_add_callback()

 The callback can optionally be cancelled with:
   + fence_remove_callback()

 To wait synchronously, optionally with a timeout:
   + fence_wait()
   + fence_wait_timeout()

 When emitting a fence, call:
   + trace_fence_emit()

 To annotate that a fence is blocking on another fence, call:
   + trace_fence_annotate_wait_on(fence, on_fence)

 A default software-only implementation is provided, which can be used
 by drivers attaching a fence to a buffer when they have no other means
 for hw sync.  But a memory backed fence is also envisioned, because it
 is common that GPU's can write to, or poll on some memory location for
 synchronization.  For example:

   fence = custom_get_fence(...);
   if ((seqno_fence = to_seqno_fence(fence)) != NULL) {
 dma_buf *fence_buf = seqno_fence-sync_buf;
 get_dma_buf(fence_buf);

 ... tell the hw the memory location to wait ...
 custom_wait_on(fence_buf, seqno_fence-seqno_ofs, fence-seqno);
   } else {
 /* fall-back to sw sync * /
 fence_add_callback(fence, my_cb);
   }

 On SoC platforms, if some other hw mechanism is provided for synchronizing
 between IP blocks, it could be supported as an alternate implementation
 with it's own fence ops in a similar way.

 enable_signaling callback is used to provide sw signaling in case a cpu
 waiter is requested or no compatible hardware signaling could be used.

 The intention is to provide a userspace interface (presumably via eventfd)
 later, to be used in conjunction with dma-buf's mmap support for sw access
 to buffers (or for userspace apps that would prefer to do their own
 synchronization).

 v1: Original
 v2: After discussion w/ danvet and mlankhorst on #dri-devel, we decided
 that dma-fence didn't need to care about the sw-hw signaling path
 (it can be handled same as sw-sw case), and therefore the fence-ops
 can be simplified and more handled in the core.  So remove the signal,
 add_callback, cancel_callback, and wait ops, and replace with a simple
 enable_signaling() op which can be used to inform a fence supporting
 hw-hw signaling that one or more devices which do not support hw
 signaling are waiting (and therefore it should enable an irq or do
 whatever is necessary in order that the CPU is notified when the
 fence is passed).
 v3: Fix locking fail in attach_fence() and get_fence()
 v4: Remove tie-in w/ dma-buf..  after discussion w/ danvet and mlankorst
 we decided that we need to be able to attach one fence to N dma-buf's,
 so using the list_head in dma-fence struct would be problematic.
 v5: [ Maarten Lankhorst ] Updated for dma-bikeshed-fence and dma-buf-manager.
 v6: [ Maarten Lankhorst ] I removed dma_fence_cancel_callback and some 
 comments
 about checking if fence fired or not. This is broken by design.
 waitqueue_active during destruction is now fatal, since the signaller
 should be holding a reference in enable_signalling until it signalled
 the fence. Pass the original dma_fence_cb along, and call __remove_wait
 in the dma_fence_callback handler, so that no cleanup needs to be
 performed.
 v7: [ Maarten Lankhorst ] Set cb-func and only enable sw signaling if
 fence wasn't signaled yet, for example for hardware fences that may
 choose to signal blindly.
 v8: [ Maarten Lankhorst ] Tons of tiny fixes, moved __dma_fence_init to
 header and fixed include mess. dma-fence.h now includes dma-buf.h
 All members are now initialized, so kmalloc can be used for
 allocating a dma-fence. More documentation added.
 v9: Change compiler bitfields to flags, change return type of
 enable_signaling 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Greg KH
On Wed, Jun 18, 2014 at 09:23:06PM -0400, Rob Clark wrote:
 On Wed, Jun 18, 2014 at 9:13 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
  +#define CREATE_TRACE_POINTS
  +#include trace/events/fence.h
  +
  +EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on);
  +EXPORT_TRACEPOINT_SYMBOL(fence_emit);
 
  Are you really willing to live with these as tracepoints for forever?
  What is the use of them in debugging?  Was it just for debugging the
  fence code, or for something else?
 
 fwiw, the goal is something like this:
 
 http://people.freedesktop.org/~robclark/perf-supertuxkart.svg
 
 but without needing to make perf understand each driver's custom trace events
 
 (from: 
 http://bloggingthemonkey.blogspot.com/2013/09/freedreno-update-moar-fps.html
 )

Will these tracepoints provide something like that?  If so, great, but I
want to make sure as these now become a user/kernel ABI that you can not
break.

thanks,

greg k-h
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Sumit Semwal
Hi Greg,

On 19 June 2014 06:55, Rob Clark robdcl...@gmail.com wrote:
 On Wed, Jun 18, 2014 at 9:16 PM, Greg KH gre...@linuxfoundation.org wrote:
 On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
 A fence can be attached to a buffer which is being filled or consumed
 by hw, to allow userspace to pass the buffer without waiting to another
 device.  For example, userspace can call page_flip ioctl to display the
 next frame of graphics after kicking the GPU but while the GPU is still
 rendering.  The display device sharing the buffer with the GPU would
 attach a callback to get notified when the GPU's rendering-complete IRQ
 fires, to update the scan-out address of the display, without having to
 wake up userspace.

 A driver must allocate a fence context for each execution ring that can
 run in parallel. The function for this takes an argument with how many
 contexts to allocate:
   + fence_context_alloc()

 A fence is transient, one-shot deal.  It is allocated and attached
 to one or more dma-buf's.  When the one that attached it is done, with
 the pending operation, it can signal the fence:
   + fence_signal()

 To have a rough approximation whether a fence is fired, call:
   + fence_is_signaled()

 The dma-buf-mgr handles tracking, and waiting on, the fences associated
 with a dma-buf.

 The one pending on the fence can add an async callback:
   + fence_add_callback()

 The callback can optionally be cancelled with:
   + fence_remove_callback()

 To wait synchronously, optionally with a timeout:
   + fence_wait()
   + fence_wait_timeout()

 When emitting a fence, call:
   + trace_fence_emit()

 To annotate that a fence is blocking on another fence, call:
   + trace_fence_annotate_wait_on(fence, on_fence)

 A default software-only implementation is provided, which can be used
 by drivers attaching a fence to a buffer when they have no other means
 for hw sync.  But a memory backed fence is also envisioned, because it
 is common that GPU's can write to, or poll on some memory location for
 synchronization.  For example:

   fence = custom_get_fence(...);
   if ((seqno_fence = to_seqno_fence(fence)) != NULL) {
 dma_buf *fence_buf = seqno_fence-sync_buf;
 get_dma_buf(fence_buf);

 ... tell the hw the memory location to wait ...
 custom_wait_on(fence_buf, seqno_fence-seqno_ofs, fence-seqno);
   } else {
 /* fall-back to sw sync * /
 fence_add_callback(fence, my_cb);
   }

 On SoC platforms, if some other hw mechanism is provided for synchronizing
 between IP blocks, it could be supported as an alternate implementation
 with it's own fence ops in a similar way.

 enable_signaling callback is used to provide sw signaling in case a cpu
 waiter is requested or no compatible hardware signaling could be used.

 The intention is to provide a userspace interface (presumably via eventfd)
 later, to be used in conjunction with dma-buf's mmap support for sw access
 to buffers (or for userspace apps that would prefer to do their own
 synchronization).

 v1: Original
 v2: After discussion w/ danvet and mlankhorst on #dri-devel, we decided
 that dma-fence didn't need to care about the sw-hw signaling path
 (it can be handled same as sw-sw case), and therefore the fence-ops
 can be simplified and more handled in the core.  So remove the signal,
 add_callback, cancel_callback, and wait ops, and replace with a simple
 enable_signaling() op which can be used to inform a fence supporting
 hw-hw signaling that one or more devices which do not support hw
 signaling are waiting (and therefore it should enable an irq or do
 whatever is necessary in order that the CPU is notified when the
 fence is passed).
 v3: Fix locking fail in attach_fence() and get_fence()
 v4: Remove tie-in w/ dma-buf..  after discussion w/ danvet and mlankorst
 we decided that we need to be able to attach one fence to N dma-buf's,
 so using the list_head in dma-fence struct would be problematic.
 v5: [ Maarten Lankhorst ] Updated for dma-bikeshed-fence and 
 dma-buf-manager.
 v6: [ Maarten Lankhorst ] I removed dma_fence_cancel_callback and some 
 comments
 about checking if fence fired or not. This is broken by design.
 waitqueue_active during destruction is now fatal, since the signaller
 should be holding a reference in enable_signalling until it signalled
 the fence. Pass the original dma_fence_cb along, and call __remove_wait
 in the dma_fence_callback handler, so that no cleanup needs to be
 performed.
 v7: [ Maarten Lankhorst ] Set cb-func and only enable sw signaling if
 fence wasn't signaled yet, for example for hardware fences that may
 choose to signal blindly.
 v8: [ Maarten Lankhorst ] Tons of tiny fixes, moved __dma_fence_init to
 header and fixed include mess. dma-fence.h now includes dma-buf.h
 All members are now initialized, so kmalloc can be used for
 allocating a dma-fence. More documentation added.
 v9: Change 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Greg KH
On Thu, Jun 19, 2014 at 09:57:35AM +0530, Sumit Semwal wrote:
 Hi Greg,
 
 On 19 June 2014 06:55, Rob Clark robdcl...@gmail.com wrote:
  On Wed, Jun 18, 2014 at 9:16 PM, Greg KH gre...@linuxfoundation.org wrote:
  On Wed, Jun 18, 2014 at 12:36:54PM +0200, Maarten Lankhorst wrote:
  A fence can be attached to a buffer which is being filled or consumed
  by hw, to allow userspace to pass the buffer without waiting to another
  device.  For example, userspace can call page_flip ioctl to display the
  next frame of graphics after kicking the GPU but while the GPU is still
  rendering.  The display device sharing the buffer with the GPU would
  attach a callback to get notified when the GPU's rendering-complete IRQ
  fires, to update the scan-out address of the display, without having to
  wake up userspace.
 
  A driver must allocate a fence context for each execution ring that can
  run in parallel. The function for this takes an argument with how many
  contexts to allocate:
+ fence_context_alloc()
 
  A fence is transient, one-shot deal.  It is allocated and attached
  to one or more dma-buf's.  When the one that attached it is done, with
  the pending operation, it can signal the fence:
+ fence_signal()
 
  To have a rough approximation whether a fence is fired, call:
+ fence_is_signaled()
 
  The dma-buf-mgr handles tracking, and waiting on, the fences associated
  with a dma-buf.
 
  The one pending on the fence can add an async callback:
+ fence_add_callback()
 
  The callback can optionally be cancelled with:
+ fence_remove_callback()
 
  To wait synchronously, optionally with a timeout:
+ fence_wait()
+ fence_wait_timeout()
 
  When emitting a fence, call:
+ trace_fence_emit()
 
  To annotate that a fence is blocking on another fence, call:
+ trace_fence_annotate_wait_on(fence, on_fence)
 
  A default software-only implementation is provided, which can be used
  by drivers attaching a fence to a buffer when they have no other means
  for hw sync.  But a memory backed fence is also envisioned, because it
  is common that GPU's can write to, or poll on some memory location for
  synchronization.  For example:
 
fence = custom_get_fence(...);
if ((seqno_fence = to_seqno_fence(fence)) != NULL) {
  dma_buf *fence_buf = seqno_fence-sync_buf;
  get_dma_buf(fence_buf);
 
  ... tell the hw the memory location to wait ...
  custom_wait_on(fence_buf, seqno_fence-seqno_ofs, fence-seqno);
} else {
  /* fall-back to sw sync * /
  fence_add_callback(fence, my_cb);
}
 
  On SoC platforms, if some other hw mechanism is provided for synchronizing
  between IP blocks, it could be supported as an alternate implementation
  with it's own fence ops in a similar way.
 
  enable_signaling callback is used to provide sw signaling in case a cpu
  waiter is requested or no compatible hardware signaling could be used.
 
  The intention is to provide a userspace interface (presumably via eventfd)
  later, to be used in conjunction with dma-buf's mmap support for sw access
  to buffers (or for userspace apps that would prefer to do their own
  synchronization).
 
  v1: Original
  v2: After discussion w/ danvet and mlankhorst on #dri-devel, we decided
  that dma-fence didn't need to care about the sw-hw signaling path
  (it can be handled same as sw-sw case), and therefore the fence-ops
  can be simplified and more handled in the core.  So remove the signal,
  add_callback, cancel_callback, and wait ops, and replace with a simple
  enable_signaling() op which can be used to inform a fence supporting
  hw-hw signaling that one or more devices which do not support hw
  signaling are waiting (and therefore it should enable an irq or do
  whatever is necessary in order that the CPU is notified when the
  fence is passed).
  v3: Fix locking fail in attach_fence() and get_fence()
  v4: Remove tie-in w/ dma-buf..  after discussion w/ danvet and mlankorst
  we decided that we need to be able to attach one fence to N dma-buf's,
  so using the list_head in dma-fence struct would be problematic.
  v5: [ Maarten Lankhorst ] Updated for dma-bikeshed-fence and 
  dma-buf-manager.
  v6: [ Maarten Lankhorst ] I removed dma_fence_cancel_callback and some 
  comments
  about checking if fence fired or not. This is broken by design.
  waitqueue_active during destruction is now fatal, since the signaller
  should be holding a reference in enable_signalling until it signalled
  the fence. Pass the original dma_fence_cb along, and call 
  __remove_wait
  in the dma_fence_callback handler, so that no cleanup needs to be
  performed.
  v7: [ Maarten Lankhorst ] Set cb-func and only enable sw signaling if
  fence wasn't signaled yet, for example for hardware fences that may
  choose to signal blindly.
  v8: [ Maarten Lankhorst ] Tons of tiny fixes, moved __dma_fence_init to
  header and fixed include 

Re: [REPOST PATCH 1/8] fence: dma-buf cross-device synchronization (v17)

2014-06-18 Thread Sumit Semwal
On 19 June 2014 10:24, Greg KH gre...@linuxfoundation.org wrote:
 On Thu, Jun 19, 2014 at 09:57:35AM +0530, Sumit Semwal wrote:
 Hi Greg,


 
  Who is going to sign up to maintain this code?  (hint, it's not me...)
 
  that would be Sumit (dma-buf tree)..
 
  probably we should move fence/reservation/dma-buf into drivers/dma-buf
  (or something approximately like that)
 Yes, that would be me - it might be better to create a new directory
 as suggested above (drivers/dma-buf).

 That's fine with me, there is going to be more than just one file in
 there, right?  :)

 greg k-h
Certainly atleast 3 :)

~sumit
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html