From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
To: Bart Van Assche <Bart.VanAssche@wdc.com>
Cc: "jthumshirn@suse.de" <jthumshirn@suse.de>,
"hch@lst.de" <hch@lst.de>,
"stuart.w.hayes@gmail.com" <stuart.w.hayes@gmail.com>,
"stable@vger.kernel.org" <stable@vger.kernel.org>,
"martin.petersen@oracle.com" <martin.petersen@oracle.com>,
"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>,
"hare@suse.com" <hare@suse.com>,
"jejb@linux.vnet.ibm.com" <jejb@linux.vnet.ibm.com>,
"khorenko@virtuozzo.com" <khorenko@virtuozzo.com>
Subject: Re: [PATCH v3 1/2] Ensure that the SCSI error handler gets woken up
Date: Wed, 6 Dec 2017 01:49:49 +0300 [thread overview]
Message-ID: <5A27228D.1090705@virtuozzo.com> (raw)
In-Reply-To: <1512510365.2660.35.camel@wdc.com>
Hello, Bart!
On 12/06/2017 12:46 AM, Bart Van Assche wrote:
> On Wed, 2017-12-06 at 00:17 +0300, ptikhomirov wrote:
>> I mean threads in scsi_dec_host_busy() the part under rcu_read_lock are
>> divided into two groups: a) finished before call_rcu, b) beginning rcu
>> section after call_rcu. So first, in scsi_eh_inc_host_failed() we will
>> see all changes to host busy from group (a), second, all threads in group
>> (b) will see our change to host_failed. Either there is nobody in (b) and
>> we will start EH, or the thread from (b) which entered spin_lock last will
>> start EH.
>>
>> In your case tasks from b does not see host_failed was incremented, and
>> will not start EH.
>
> Hello Pavel,
>
> What does "your case" mean? In my previous e-mail I explained a scenario that
> cannot happen so it's not clear to me what "your case" refers to?
By "your case" I meant how your code works, especially that host_failed
increment is inside scsi_eh_inc_host_failed() in your patch.
>
> Additionally, it seems like you are assuming that RCU guarantees ordering of
> RCU read-locked sections against call_rcu()?
Sorry.. Not "call_rcu" itself, In my previous reply I meant the delayed
callback which actually triggers. (s/call_rcu/call_rcu's callback start/)
> That's not how RCU works. RCU
> guarantees serialization of read-locked sections against grace periods. The
> function scsi_eh_inc_host_failed() is invoked through call_rcu() and hence
> will be called during a grace period.
May be I missunderstand something, but I think that callback from
call_rcu is guaranteed to _start_ after a grace period, but not to end
before a next grace period. Other threads can enter rcu_read_lock
protected critical regions while we are still in a callback and will run
concurrently with callback.
>
> Anyway, the different scenarios I see are as follows:
> (a) scsi_dec_host_busy() finishes before scsi_eh_inc_host_failed() starts.
> (b) scsi_dec_host_busy() starts after scsi_eh_inc_host_failed() has
> finished.
So I think in (b) scsi_dec_host_busy starts after
scsi_eh_inc_host_failed has _started_.
>
> In case (a) scsi_eh_inc_host_failed() will wake up the error handler. And in
> case (b) scsi_dec_host_busy() will wake up the error handler. So it's not
> clear to me why you think that there is a scenario in which the EH won't be
> woken up?
So in case (b), in my understanding, scsi_dec_host_busy can skip wakeups
as it does not see host_failed change yet.
>
> Bart.
>
To prove my point, some parts of kernel docs:
"This function invokes func(head) after a grace period has elapsed."
Documentation/RCU/whatisRCU.txt
"
15. The whole point of call_rcu(), synchronize_rcu(), and friends
is to wait until all pre-existing readers have finished before
carrying out some otherwise-destructive operation.
...
Because these primitives only wait for pre-existing readers, it
is the caller's responsibility to guarantee that any subsequent
readers will execute safely.
"
Documentation/RCU/checklist.txt
There is nothing about "callback ends before next grace period".
Sorry, if I'm missing something.
Pavel.
next prev parent reply other threads:[~2017-12-05 22:51 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-04 18:06 [PATCH v3 0/2] Ensure that the SCSI error handler gets woken up Bart Van Assche
2017-12-04 18:06 ` [PATCH v3 1/2] " Bart Van Assche
2017-12-05 10:18 ` Pavel Tikhomirov
2017-12-05 16:19 ` Bart Van Assche
[not found] ` <sr4inbsihn7krboba8euqqp1.1512508675214@email.android.com>
2017-12-05 21:46 ` Bart Van Assche
2017-12-05 22:49 ` Pavel Tikhomirov [this message]
2017-12-05 22:59 ` Bart Van Assche
2017-12-06 7:20 ` Pavel Tikhomirov
2017-12-07 5:12 ` Stuart Hayes
2017-12-04 18:06 ` [PATCH v3 2/2] Convert a source code comment into a runtime check Bart Van Assche
2017-12-07 1:55 ` [PATCH v3 0/2] Ensure that the SCSI error handler gets woken up Martin K. Petersen
2017-12-07 12:02 ` John Garry
2017-12-07 16:50 ` Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5A27228D.1090705@virtuozzo.com \
--to=ptikhomirov@virtuozzo.com \
--cc=Bart.VanAssche@wdc.com \
--cc=hare@suse.com \
--cc=hch@lst.de \
--cc=jejb@linux.vnet.ibm.com \
--cc=jthumshirn@suse.de \
--cc=khorenko@virtuozzo.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=stable@vger.kernel.org \
--cc=stuart.w.hayes@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.