Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1728233
| Path | csiph.com!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Prateek Sood <prsood@codeaurora.org> |
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH] rwsem: fix missed wakeup due to reordering of load |
| Date | Thu, 07 Sep 2017 16:10:02 +0200 |
| Message-ID | <un5Fg-To-21@gated-at.bofh.it> (permalink) |
| References | <uhC1c-8iX-13@gated-at.bofh.it> <uhYuK-5Me-5@gated-at.bofh.it> <uhZAu-6z1-19@gated-at.bofh.it> <uhZTQ-6H8-23@gated-at.bofh.it> |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1504793314; bh=xdZKLkfX0BCXpmd8IITNlNkvnK9m/nKQ8BaWPXuDR2Q=; h=Subject:To:References:Cc:From:Date:In-Reply-To:From; b=mmnsD4V0g4JHZaqmkUNdroRQuaLLO11JrHMdP6i+g0UCF35oWppiP8IM4MBK5/09w Ew2sydjjaDOyEKV3KfASRbdhTQqsn/WObcJslkGC1vbLSN/Sa8HRoiux4JBPA7j11t KRPytK1SG7hqPI7BgTqLfgegv8fxpKfU7o4Pi0t4= |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1504793313; bh=xdZKLkfX0BCXpmd8IITNlNkvnK9m/nKQ8BaWPXuDR2Q=; h=Subject:To:References:Cc:From:Date:In-Reply-To:From; b=B0QbadDHuMbCN5ePkO9wJRWPGP03FNRFaZeILAiZQtXt2yvo36XHtPeDLT7rzz2OR 9j1/wHA4dPKi+WKYrWVw+c+Y4CANjte/wuSuGZAW038P4Aqi/PX0X1hlSyEBc5HfIy qXepmwHtTtD6Z9g2KQhmZiNZs1PwRflTgUUzf/4U= |
| Dmarc-Filter | OpenDMARC Filter v1.3.2 smtp.codeaurora.org D5C846071C |
| Authentication-Results | pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org |
| Authentication-Results | pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=prsood@codeaurora.org |
| User-Agent | Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
| MIME-Version | 1.0 |
| Content-Type | text/plain; charset=windows-1252 |
| Content-Transfer-Encoding | 7bit |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 99 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | mingo@redhat.com, sramana@codeaurora.org, linux-kernel@vger.kernel.org, Waiman Long <longman@redhat.com>, Davidlohr Bueso <dave@stgolabs.net>, Andrea Parri <parri.andrea@gmail.com>, Will Deacon <will.deacon@arm.com> |
| X-Original-Date | Thu, 7 Sep 2017 19:38:18 +0530 |
| X-Original-Message-ID | <85a99bb9-d7e6-3844-8a41-89c5225710a7@codeaurora.org> |
| X-Original-References | <1503487735-4362-1-git-send-email-prsood@codeaurora.org> <20170824112927.tqejopswi7mcy4sq@hirez.programming.kicks-ass.net> <20170824123304.5pqw53qbsytpfbrp@hirez.programming.kicks-ass.net> <20170824125233.nmgfau45sh4jgsqf@hirez.programming.kicks-ass.net> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1728233 |
Show key headers only | View raw
On 08/24/2017 06:22 PM, Peter Zijlstra wrote: > On Thu, Aug 24, 2017 at 02:33:04PM +0200, Peter Zijlstra wrote: >> On Thu, Aug 24, 2017 at 01:29:27PM +0200, Peter Zijlstra wrote: >>> >>> WTH did you not Cc the people that commented on your patch last time? >>> >>> On Wed, Aug 23, 2017 at 04:58:55PM +0530, Prateek Sood wrote: >>>> If a spinner is present, there is a chance that the load of >>>> rwsem_has_spinner() in rwsem_wake() can be reordered with >>>> respect to decrement of rwsem count in __up_write() leading >>>> to wakeup being missed. >>> >>>> spinning writer up_write caller >>>> --------------- ----------------------- >>>> [S] osq_unlock() [L] osq >>>> spin_lock(wait_lock) >>>> sem->count=0xFFFFFFFF00000001 >>>> +0xFFFFFFFF00000000 >>>> count=sem->count >>>> MB >>>> sem->count=0xFFFFFFFE00000001 >>>> -0xFFFFFFFF00000001 >>>> RMB >>> >>> This doesn't make sense, it appears to order a STORE against something >>> else. >>> >>>> spin_trylock(wait_lock) >>>> return >>>> rwsem_try_write_lock(count) >>>> spin_unlock(wait_lock) >>>> schedule() >> >> Is this what you wanted to write? > > And ideally there should be a comment near the atomic_long_add_return() > in __rwsem_down_write_failed_common() to indicate we rely on the implied > smp_mb() before it -- just in case someone goes and makes it > atomic_long_add_return_relaxed(). > > And I suppose someone should look at the waiting branch of that thing > too.. because I'm not sure what happens if waiting is true but count > isn't big enough. > > I bloody hate the rwsem code, that BIAS stuff forever confuses me. I > have a start at rewriting the thing to put the owner in the lock word > just like we now do for mutex, but never seem to get around to finishing > it. > >> --- >> kernel/locking/rwsem-xadd.c | 27 +++++++++++++++++++++++++++ >> 1 file changed, 27 insertions(+) >> >> diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c >> index 02f660666ab8..813b5d3654ce 100644 >> --- a/kernel/locking/rwsem-xadd.c >> +++ b/kernel/locking/rwsem-xadd.c >> @@ -613,6 +613,33 @@ struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem) >> DEFINE_WAKE_Q(wake_q); >> >> /* >> + * __rwsem_down_write_failed_common(sem) >> + * rwsem_optimistic_spin(sem) >> + * osq_unlock(sem->osq) >> + * ... >> + * atomic_long_add_return(&sem->count) >> + * >> + * - VS - >> + * >> + * __up_write() >> + * if (atomic_long_sub_return_release(&sem->count) < 0) >> + * rwsem_wake(sem) >> + * osq_is_locked(&sem->osq) >> + * >> + * And __up_write() must observe !osq_is_locked() when it observes the >> + * atomic_long_add_return() in order to not miss a wakeup. >> + * >> + * This boils down to: >> + * >> + * [S.rel] X = 1 [RmW] r0 = (Y += 0) >> + * MB RMB >> + * [RmW] Y += 1 [L] r1 = X >> + * >> + * exists (r0=1 /\ r1=0) >> + */ >> + smp_rmb(); >> + >> + /* >> * If a spinner is present, it is not necessary to do the wakeup. >> * Try to do wakeup only if the trylock succeeds to minimize >> * spinlock contention which may introduce too much delay in the Thanks Peter for your suggestion on comments. I will resend the patch with updated comments -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc., is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
Re: [PATCH] rwsem: fix missed wakeup due to reordering of load Prateek Sood <prsood@codeaurora.org> - 2017-09-07 16:10 +0200
csiph-web