On Wed 11-05-16 10:44:01, Peter Zijlstra wrote:
[...]
> @@ -504,6 +502,18 @@ __rwsem_down_write_failed_common(struct rw_semaphore 
> *sem, int state)
>       raw_spin_unlock_irq(&sem->wait_lock);
>  
>       return ret;
> +
> +out_nolock:
> +     __set_current_state(TASK_RUNNING);
> +     raw_spin_lock_irq(&sem->wait_lock);
> +     list_del(&waiter.list);
> +     if (list_empty(&sem->wait_list))
> +             rwsem_atomic_update(-RWSEM_WAITING_BIAS, sem);
> +     else
> +             __rwsem_do_wake(sem, RWSEM_WAKE_READERS);
> +     raw_spin_unlock_irq(&sem->wait_lock);
> +
> +     return ERR_PTR(-EINTR);
>  }

Looks much better but don't we have to check the count for potentially
pending writers?

-- 
Michal Hocko
SUSE Labs

Reply via email to