lkml.org 
[lkml]   [2016]   [Dec]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues
    On 12/02, Davidlohr Bueso wrote:
    >
    > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem)
    > */
    > __this_cpu_dec(*sem->read_count);
    >
    > + rcu_read_lock();
    > + writer = rcu_dereference(sem->writer);
    > +
    > /* Prod writer to recheck readers_active */
    > - wake_up(&sem->writer);
    > + if (writer)
    > + wake_up_process(writer);
    > + rcu_read_unlock();

    This needs a barrier between __this_cpu_dec() and rcu_dereference(), I think.

    > @@ -159,8 +165,18 @@ void percpu_down_write(struct percpu_rw_semaphore *sem)
    > * will wait for them.
    > */
    >
    > - /* Wait for all now active readers to complete. */
    > - wait_event(sem->writer, readers_active_check(sem));
    > + WRITE_ONCE(sem->writer, current);
    > + for (;;) {
    > + set_current_state(TASK_UNINTERRUPTIBLE);
    > +
    > + if (readers_active_check(sem))
    > + break;

    This looks fine, we can rely on set_current_state() which inserts a barrier
    between WRITE_ONCE() and readers_active_check(). So we do not even need
    WRITE_ONCE().

    And the fact this needs the barriers and the comments makes me think again
    you should add the new helpers.

    Oleg.

    \
     
     \ /
      Last update: 2016-12-05 18:15    [W:3.587 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site