lkml.org 
[lkml]   [2008]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 06 of 11] rwsem contended
    Date
    From
    # HG changeset patch
    # User Andrea Arcangeli <andrea@qumranet.com>
    # Date 1209740186 -7200
    # Node ID 74b873f3ea07012e2fc864f203edf1179865feb1
    # Parent a8ac53b928dfcea0ccb326fb7d71f908f0df85f4
    rwsem contended

    Add a function to rw_semaphores to check if there are any processes
    waiting for the semaphore. Add rwsem_needbreak to sched.h that works
    in the same way as spinlock_needbreak().

    Signed-off-by: Christoph Lameter <clameter@sgi.com>
    Signed-off-by: Andrea Arcangeli <andrea@qumranet.com>

    diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h
    --- a/include/linux/rwsem.h
    +++ b/include/linux/rwsem.h
    @@ -57,6 +57,8 @@ extern void up_write(struct rw_semaphore
    */
    extern void downgrade_write(struct rw_semaphore *sem);

    +extern int rwsem_is_contended(struct rw_semaphore *sem);
    +
    #ifdef CONFIG_DEBUG_LOCK_ALLOC
    /*
    * nested locking. NOTE: rwsems are not allowed to recurse
    diff --git a/include/linux/sched.h b/include/linux/sched.h
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -2030,6 +2030,15 @@ static inline int spin_needbreak(spinloc
    #endif
    }

    +static inline int rwsem_needbreak(struct rw_semaphore *sem)
    +{
    +#ifdef CONFIG_PREEMPT
    + return rwsem_is_contended(sem);
    +#else
    + return 0;
    +#endif
    +}
    +
    /*
    * Reevaluate whether the task has signals pending delivery.
    * Wake the task if so.
    diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c
    --- a/lib/rwsem-spinlock.c
    +++ b/lib/rwsem-spinlock.c
    @@ -305,6 +305,18 @@ void __downgrade_write(struct rw_semapho
    spin_unlock_irqrestore(&sem->wait_lock, flags);
    }

    +int rwsem_is_contended(struct rw_semaphore *sem)
    +{
    + /*
    + * Racy check for an empty list. False positives or negatives
    + * would be okay. False positive may cause a useless dropping of
    + * locks. False negatives may cause locks to be held a bit
    + * longer until the next check.
    + */
    + return !list_empty(&sem->wait_list);
    +}
    +
    +EXPORT_SYMBOL(rwsem_is_contended);
    EXPORT_SYMBOL(__init_rwsem);
    EXPORT_SYMBOL(__down_read);
    EXPORT_SYMBOL(__down_read_trylock);
    diff --git a/lib/rwsem.c b/lib/rwsem.c
    --- a/lib/rwsem.c
    +++ b/lib/rwsem.c
    @@ -251,6 +251,18 @@ asmregparm struct rw_semaphore *rwsem_do
    return sem;
    }

    +int rwsem_is_contended(struct rw_semaphore *sem)
    +{
    + /*
    + * Racy check for an empty list. False positives or negatives
    + * would be okay. False positive may cause a useless dropping of
    + * locks. False negatives may cause locks to be held a bit
    + * longer until the next check.
    + */
    + return !list_empty(&sem->wait_list);
    +}
    +
    +EXPORT_SYMBOL(rwsem_is_contended);
    EXPORT_SYMBOL(rwsem_down_read_failed);
    EXPORT_SYMBOL(rwsem_down_write_failed);
    EXPORT_SYMBOL(rwsem_wake);

    \
     
     \ /
      Last update: 2008-05-02 17:19    [W:0.035 / U:0.424 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site