lkml.org 
[lkml]   [2014]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH 2/2] drivers/base: add managed token devres interfaces
    On Thu, Apr 17, 2014 at 04:10:34PM -0400, Tejun Heo wrote:
    > On Thu, Apr 17, 2014 at 02:01:32PM -0600, Shuah Khan wrote:
    > > Operating on the lock should be atomic, which is what devres_update()
    > > is doing. It can be simplified as follows by holding devres_lock
    > > in devm_token_lock().
    > >
    > > spin_lock_irqsave(&dev->devres_lock, flags);
    > > if (tkn_ptr->status == TOKEN_DEVRES_FREE)
    > > tkn_ptr->status = TOKEN_DEVRES_BUSY;
    > > spin_unlock_irqrestore(&dev->devres_lock, flags);
    > >
    > > Is this in-line with what you have in mind?
    >
    > How is that different from tkn_ptr->status = TOKEN_DEVRES_BUSY?

    Let me clear it up. How could the code snippet that you wrote
    possibly function as a lock between two threads? You're doing the
    following.


    if (state == busy)
    return -EBUSY;

    spin_lock;
    if (state == free)
    state = busy;
    spin_unlock;

    return SUCCESS!!!11!!1!!;

    The above is equivalent to

    if (state == busy)
    return -EBUSY;
    state = busy;
    return SUCCESS!!!11!!1!!;

    Now, if you let two threads compete on it, both can return SUCCESS.
    Can you see that?

    Please consult with somebody who has basic understanding of
    concurrency and synchronization. Please do not implement locking
    primitive directly if at all avoidable. Why can't it use a mutex
    embedded in the data area of a devres entry? And if you for some
    reason have to implement it directly, at least add lockdep
    annotations.

    Anyways, I really think this needs help from somebody who knows
    better.

    Thanks.

    --
    tejun


    \
     
     \ /
      Last update: 2014-04-17 23:01    [W:4.454 / U:0.696 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site