From: Anthony Liguori <anthony@codemonkey.ws>
To: Ryan Harper <ryanh@us.ibm.com>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: Re: [PATCH 2/2] lsi,scsi-disk: check for reentrance via tag matching
Date: Fri, 23 Jan 2009 09:42:32 -0600 [thread overview]
Message-ID: <4979E568.3090904@codemonkey.ws> (raw)
In-Reply-To: <20090123152359.GK13481@us.ibm.com>
Ryan Harper wrote:
> * Anthony Liguori <anthony@codemonkey.ws> [2009-01-23 09:09]:
>
> Just moving scsi_command_complete to a bottom half won't be sufficent
> since lsi_command_complete() is also re-entrent via calls to
> lsi_resume_script() which can invoke lsi_do_command(). The issue of
> bottom halves for lsi is something I've thought about, but haven't
> figured out how to only execute enough lsi scripts to complete the
> current command. Having the device stop executing scripts after sending
> back the command completion to the OS was my first though on how to
> prevent this loop, but so far, just stopping after just sending
> the completion back to the OS isn't something that the OS driver
> handles well.
>
> I suppose once we figure out how to stop executing scripts after
> sending command completion in a way that the OS drivers understand,
> moving that to a bottom half will work fine.
>
I think we're talking past each other. Let me describe what my
(limited) understanding of the problem is and you can correct me if I've
got it wrong.
lsi_do_command():
does some action on the next command
stores some info in global state
calls into scsi disk
scsi_disk normally does:
bdrv_aio_read() with callback of scsi_complete.
returns
lsi_do_command()
finishes up command and touching global state
returns
When IO completes:
scsi_complete:
executes lsi_do_command() to run next command
We run into trouble when:
lsi_do_command():
does some action on the next command
stores some info in global state
calls into scsi disk
scsi_disk abnormally does:
scsi_command_complete()
scsi_command_complete:
executes lsi_do_command() to run next command
lsi_do_command():
does some action on the next command
we're fubar because the global state is setup to process another command
So what a bottom half would do is:
lsi_do_command():
does some action on the next command
stores some info in global state
calls into scsi disk
scsi_disk abnormally does:
schedule bottom half for scsi_command_complete
returns
lsi_do_command()
finishes up command and touching global state
returns
When bottom halves get run
scsi_complete:
executes lsi_do_command() to run next command
And we avoid getting fubar.
Regards,
Anthony Liguori
WARNING: multiple messages have this Message-ID (diff)
From: Anthony Liguori <anthony@codemonkey.ws>
To: Ryan Harper <ryanh@us.ibm.com>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: [Qemu-devel] Re: [PATCH 2/2] lsi, scsi-disk: check for reentrance via tag matching
Date: Fri, 23 Jan 2009 09:42:32 -0600 [thread overview]
Message-ID: <4979E568.3090904@codemonkey.ws> (raw)
In-Reply-To: <20090123152359.GK13481@us.ibm.com>
Ryan Harper wrote:
> * Anthony Liguori <anthony@codemonkey.ws> [2009-01-23 09:09]:
>
> Just moving scsi_command_complete to a bottom half won't be sufficent
> since lsi_command_complete() is also re-entrent via calls to
> lsi_resume_script() which can invoke lsi_do_command(). The issue of
> bottom halves for lsi is something I've thought about, but haven't
> figured out how to only execute enough lsi scripts to complete the
> current command. Having the device stop executing scripts after sending
> back the command completion to the OS was my first though on how to
> prevent this loop, but so far, just stopping after just sending
> the completion back to the OS isn't something that the OS driver
> handles well.
>
> I suppose once we figure out how to stop executing scripts after
> sending command completion in a way that the OS drivers understand,
> moving that to a bottom half will work fine.
>
I think we're talking past each other. Let me describe what my
(limited) understanding of the problem is and you can correct me if I've
got it wrong.
lsi_do_command():
does some action on the next command
stores some info in global state
calls into scsi disk
scsi_disk normally does:
bdrv_aio_read() with callback of scsi_complete.
returns
lsi_do_command()
finishes up command and touching global state
returns
When IO completes:
scsi_complete:
executes lsi_do_command() to run next command
We run into trouble when:
lsi_do_command():
does some action on the next command
stores some info in global state
calls into scsi disk
scsi_disk abnormally does:
scsi_command_complete()
scsi_command_complete:
executes lsi_do_command() to run next command
lsi_do_command():
does some action on the next command
we're fubar because the global state is setup to process another command
So what a bottom half would do is:
lsi_do_command():
does some action on the next command
stores some info in global state
calls into scsi disk
scsi_disk abnormally does:
schedule bottom half for scsi_command_complete
returns
lsi_do_command()
finishes up command and touching global state
returns
When bottom halves get run
scsi_complete:
executes lsi_do_command() to run next command
And we avoid getting fubar.
Regards,
Anthony Liguori
next prev parent reply other threads:[~2009-01-23 15:42 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-23 14:21 [PATCH 0/2] LSI53C895A and scsi-disk fixes Ryan Harper
2009-01-23 14:21 ` [Qemu-devel] " Ryan Harper
2009-01-23 14:21 ` [PATCH 1/2] lsi: add ISTAT1 register read Ryan Harper
2009-01-23 14:21 ` [Qemu-devel] " Ryan Harper
2009-01-23 14:21 ` [PATCH 2/2] lsi,scsi-disk: check for reentrance via tag matching Ryan Harper
2009-01-23 14:21 ` [Qemu-devel] [PATCH 2/2] lsi, scsi-disk: " Ryan Harper
2009-01-23 15:00 ` [PATCH 2/2] lsi,scsi-disk: " Anthony Liguori
2009-01-23 15:00 ` [Qemu-devel] Re: [PATCH 2/2] lsi, scsi-disk: " Anthony Liguori
2009-01-23 15:23 ` [PATCH 2/2] lsi,scsi-disk: " Ryan Harper
2009-01-23 15:23 ` [Qemu-devel] Re: [PATCH 2/2] lsi, scsi-disk: " Ryan Harper
2009-01-23 15:42 ` Anthony Liguori [this message]
2009-01-23 15:42 ` Anthony Liguori
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=4979E568.3090904@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=kvm@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
--cc=ryanh@us.ibm.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.