From: Cornelia Huck <cohuck@redhat.com>
To: Pierre Morel <pmorel@linux.ibm.com>
Cc: Dong Jia Shi <bjsdjshi@linux.ibm.com>,
Halil Pasic <pasic@linux.ibm.com>,
linux-s390@vger.kernel.org, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org, qemu-s390x@nongnu.org,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH RFC 2/2] vfio-ccw: support for halt/clear subchannel
Date: Tue, 15 May 2018 18:10:06 +0200 [thread overview]
Message-ID: <20180515181006.0cb1dfc2.cohuck@redhat.com> (raw)
In-Reply-To: <c18f9b9f-da00-1a0b-8ef0-7ac223c73d1a@linux.ibm.com>
On Fri, 11 May 2018 11:33:35 +0200
Pierre Morel <pmorel@linux.ibm.com> wrote:
> On 09/05/2018 17:48, Cornelia Huck wrote:
> > Currently, vfio-ccw only relays start subchannel requests to the real
> > hardware, which is enough in many cases but falls short e.g. during
> > error recovery.
> >
> > Fortunately, it is easy to add support for halt and clear subchannel
> > requests to the existing infrastructure. User space can detect
> > support for halt/clear subchannel easily, as we always returned
> > -EOPNOTSUPP before and therefore we do not need any capability to
> > make this support discoverable.
> >
> > Signed-off-by: Cornelia Huck <cohuck@redhat.com>
> > ---
> > drivers/s390/cio/vfio_ccw_drv.c | 10 ++++-
> > drivers/s390/cio/vfio_ccw_fsm.c | 94 ++++++++++++++++++++++++++++++++++++-----
> > 2 files changed, 92 insertions(+), 12 deletions(-)
> > @@ -65,6 +67,70 @@ static int fsm_io_helper(struct vfio_ccw_private *private)
> > return ret;
> > }
> >
> > +static int fsm_halt_helper(struct vfio_ccw_private *private)
> > +{
> > + struct subchannel *sch;
> > + int ccode;
> > + unsigned long flags;
> > + int ret;
> > +
> > + sch = private->sch;
> > +
> > + spin_lock_irqsave(sch->lock, flags);
> > + private->state = VFIO_CCW_STATE_BUSY;
> > +
> > + /* Issue "Halt Subchannel" */
> > + ccode = hsch(sch->schid);
> > +
> > + switch (ccode) {
> > + case 0:
> > + /*
> > + * Initialize device status information
> > + */
> > + sch->schib.scsw.cmd.actl |= SCSW_ACTL_HALT_PEND;
> > + ret = 0;
> > + break;
> > + case 1: /* Status pending */
>
> shouldn't we make a difference between status pending
> and having halt in progress?
>
> The guest can examine the SCSW, but couldn't it introduce
> a race condition?
Yes, good point. Especially as the guest might want to do different
things.
Regarding race conditions: The scsw can already be outdated after the
operation that stored it finished, which is true even on LPAR. That's
especially true for tsch which clears some status at the subchannel.
The guest must already be able to deal with this, the race window is
just larger.
>
>
> > + case 2: /* Busy */
> > + ret = -EBUSY;
> > + break;
> > + default: /* Device not operational */
> > + ret = -ENODEV;
> > + }
> > + spin_unlock_irqrestore(sch->lock, flags);
> > + return ret;
> > +}
> > +
> > +static int fsm_clear_helper(struct vfio_ccw_private *private)
> > +{
> > + struct subchannel *sch;
> > + int ccode;
> > + unsigned long flags;
> > + int ret;
> > +
> > + sch = private->sch;
> > +
> > + spin_lock_irqsave(sch->lock, flags);
> > + private->state = VFIO_CCW_STATE_BUSY;
> > +
> > + /* Issue "Clear Subchannel" */
> > + ccode = csch(sch->schid);
> > +
> > + switch (ccode) {
> > + case 0:
> > + /*
> > + * Initialize device status information
> > + */
> > + sch->schib.scsw.cmd.actl |= SCSW_ACTL_CLEAR_PEND;
> > + ret = 0;
> > + break;
> > + default: /* Device not operational */
> > + ret = -ENODEV;
> > + }
> > + spin_unlock_irqrestore(sch->lock, flags);
> > + return ret;
> > +}
> > +
> > static void fsm_notoper(struct vfio_ccw_private *private,
> > enum vfio_ccw_event event)
> > {
> > @@ -126,7 +192,24 @@ static void fsm_io_request(struct vfio_ccw_private *private,
> >
> > memcpy(scsw, io_region->scsw_area, sizeof(*scsw));
> >
> > - if (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) {
> > + /*
> > + * Start processing with the clear function, then halt, then start.
> > + * We may still be start pending when the caller wants to clean
> > + * up things via halt/clear.
> > + */
>
> hum. The scsw here does not reflect the hardware state but the
> command passed from the user interface.
> Can we and should we authorize multiple commands in one call?
>
> If not, the comment is not appropriate and a switch on cmd.fctl
> would be a clearer.
There may be multiple functions specified, but we need to process them
in precedence order (and clear wins over the others, so to speak).
Would adding a sentence like "we always process just one function" help?
>
> > + if (scsw->cmd.fctl & SCSW_FCTL_CLEAR_FUNC) {
> > + /* issue clear and wait for interupt */
> > + io_region->ret_code = fsm_clear_helper(private);
> > + if (io_region->ret_code)
> > + goto err_out;
> > + return;
> > + } else if (scsw->cmd.fctl & SCSW_FCTL_HALT_FUNC) {
> > + /* issue halt and wait for interrupt */
> > + io_region->ret_code = fsm_halt_helper(private);
> > + if (io_region->ret_code)
> > + goto err_out;
> > + return;
> > + } else if (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) {
> > orb = (union orb *)io_region->orb_area;
> >
> > /* Don't try to build a cp if transport mode is specified. */
> > @@ -152,16 +235,7 @@ static void fsm_io_request(struct vfio_ccw_private *private,
> > goto err_out;
> > }
> > return;
> > - } else if (scsw->cmd.fctl & SCSW_FCTL_HALT_FUNC) {
> > - /* XXX: Handle halt. */
> > - io_region->ret_code = -EOPNOTSUPP;
> > - goto err_out;
> > - } else if (scsw->cmd.fctl & SCSW_FCTL_CLEAR_FUNC) {
> > - /* XXX: Handle clear. */
> > - io_region->ret_code = -EOPNOTSUPP;
> > - goto err_out;
> > }
> > -
> > err_out:
> > private->state = VFIO_CCW_STATE_IDLE;
> > }
>
>
next prev parent reply other threads:[~2018-05-15 16:10 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-09 15:48 [Qemu-devel] [PATCH RFC 0/2] vfio-ccw: support for {halt, clear} subchannel Cornelia Huck
2018-05-09 15:48 ` [Qemu-devel] [PATCH RFC 1/2] s390/cio: export hsch to modules Cornelia Huck
2018-05-11 9:36 ` Pierre Morel
2018-05-09 15:48 ` [Qemu-devel] [PATCH RFC 2/2] vfio-ccw: support for halt/clear subchannel Cornelia Huck
2018-05-11 9:33 ` Pierre Morel
2018-05-15 16:10 ` Cornelia Huck [this message]
2018-05-16 13:32 ` Pierre Morel
2018-05-22 12:52 ` Cornelia Huck
2018-05-22 15:10 ` Pierre Morel
2018-06-05 13:14 ` Cornelia Huck
2018-06-05 15:23 ` Pierre Morel
2018-06-05 15:36 ` Cornelia Huck
2018-06-06 12:21 ` Cornelia Huck
2018-06-06 14:15 ` Pierre Morel
2018-06-07 9:54 ` Cornelia Huck
2018-06-07 16:17 ` [Qemu-devel] [qemu-s390x] " Halil Pasic
2018-06-07 16:34 ` Cornelia Huck
2018-06-08 20:40 ` Halil Pasic
2018-06-11 11:12 ` Cornelia Huck
2018-06-11 16:00 ` Cornelia Huck
2018-06-07 16:37 ` [Qemu-devel] " Pierre Morel
2018-06-08 12:20 ` Cornelia Huck
2018-06-08 13:13 ` Halil Pasic
2018-06-08 14:45 ` Cornelia Huck
2018-06-08 15:51 ` Pierre Morel
2018-06-12 9:59 ` Cornelia Huck
2018-06-12 13:56 ` Pierre Morel
2018-06-12 14:08 ` Halil Pasic
2018-06-12 15:25 ` Cornelia Huck
2018-06-08 21:10 ` Halil Pasic
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=20180515181006.0cb1dfc2.cohuck@redhat.com \
--to=cohuck@redhat.com \
--cc=bjsdjshi@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=pasic@linux.ibm.com \
--cc=pmorel@linux.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).