From: Eric Farman <farman@linux.ibm.com>
To: Cornelia Huck <cohuck@redhat.com>
Cc: Jared Rossi <jrossi@linux.ibm.com>,
Halil Pasic <pasic@linux.ibm.com>,
linux-s390@vger.kernel.org, kvm@vger.kernel.org,
Eric Farman <farman@linux.ibm.com>
Subject: [RFC PATCH v2 3/4] vfio-ccw: Expand SCSW usage to HALT and CLEAR
Date: Wed, 13 May 2020 16:29:33 +0200 [thread overview]
Message-ID: <20200513142934.28788-4-farman@linux.ibm.com> (raw)
In-Reply-To: <20200513142934.28788-1-farman@linux.ibm.com>
Expand the Activity Control flags to include HALT/CLEAR PENDING,
in the same way as is done for the START PENDING flag.
The POPS states that for HALT SUBCHANNEL:
> Condition code 2 is set, and no other action is
> taken, ... when a halt function or clear function is
> already in progress at the subchannel.
So take that into account in fsm_do_halt().
CLEAR SUBCHANNEL is the biggest hammer, and always gets to happen,
so no corresponding check is added to fsm_do_clear(). But it does
reset both START and HALT functions that may be active, which is
why it incorporates the resetting of the HALT bit on the interrupt
path.
FIXME: What happens if a guest hammers a bunch of CSCH in a row?
We clear this for the first interrupt; is that fine?
Signed-off-by: Eric Farman <farman@linux.ibm.com>
---
drivers/s390/cio/vfio_ccw_drv.c | 6 ++++++
drivers/s390/cio/vfio_ccw_fsm.c | 12 +++++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c
index ee153fa72a0f..55051972325f 100644
--- a/drivers/s390/cio/vfio_ccw_drv.c
+++ b/drivers/s390/cio/vfio_ccw_drv.c
@@ -101,6 +101,12 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work)
if (private->mdev && scsw_is_solicited(&irb->scsw) && is_final) {
private->state = VFIO_CCW_STATE_IDLE;
private->scsw.cmd.actl &= ~SCSW_ACTL_START_PEND;
+ if (scsw_fctl(&irb->scsw) & SCSW_FCTL_HALT_FUNC)
+ private->scsw.cmd.actl &= ~SCSW_ACTL_HALT_PEND;
+ if (scsw_fctl(&irb->scsw) & SCSW_FCTL_CLEAR_FUNC) {
+ private->scsw.cmd.actl &= ~SCSW_ACTL_HALT_PEND;
+ private->scsw.cmd.actl &= ~SCSW_ACTL_CLEAR_PEND;
+ }
}
if (private->io_trigger)
diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c
index 258ce32549f3..d8075a56eb9b 100644
--- a/drivers/s390/cio/vfio_ccw_fsm.c
+++ b/drivers/s390/cio/vfio_ccw_fsm.c
@@ -86,6 +86,14 @@ static int fsm_do_halt(struct vfio_ccw_private *private)
sch = private->sch;
+ if (scsw_actl(&private->scsw) & (SCSW_ACTL_HALT_PEND | SCSW_ACTL_CLEAR_PEND)) {
+ VFIO_CCW_MSG_EVENT(2,
+ "%pUl: actl %x pending\n",
+ mdev_uuid(private->mdev),
+ scsw_actl(&private->scsw));
+ return -EBUSY;
+ }
+
spin_lock_irqsave(sch->lock, flags);
VFIO_CCW_TRACE_EVENT(2, "haltIO");
@@ -102,6 +110,7 @@ static int fsm_do_halt(struct vfio_ccw_private *private)
* Initialize device status information
*/
sch->schib.scsw.cmd.actl |= SCSW_ACTL_HALT_PEND;
+ private->scsw.cmd.actl |= SCSW_ACTL_HALT_PEND;
ret = 0;
break;
case 1: /* Status pending */
@@ -143,6 +152,7 @@ static int fsm_do_clear(struct vfio_ccw_private *private)
* Initialize device status information
*/
sch->schib.scsw.cmd.actl = SCSW_ACTL_CLEAR_PEND;
+ private->scsw.cmd.actl |= SCSW_ACTL_CLEAR_PEND;
/* TODO: check what else we might need to clear */
ret = 0;
break;
@@ -246,7 +256,7 @@ static void fsm_io_request(struct vfio_ccw_private *private,
char *errstr = "request";
struct subchannel_id schid = get_schid(private);
- if (scsw_actl(scsw) & SCSW_ACTL_START_PEND) {
+ if (scsw_actl(scsw) & (SCSW_ACTL_START_PEND | SCSW_ACTL_HALT_PEND | SCSW_ACTL_CLEAR_PEND)) {
io_region->ret_code = -EBUSY;
VFIO_CCW_MSG_EVENT(2,
"%pUl (%x.%x.%04x): actl %x pending\n",
--
2.17.1
next prev parent reply other threads:[~2020-05-13 14:29 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-13 14:29 [RFC PATCH v2 0/4] vfio-ccw: Fix interrupt handling for HALT/CLEAR Eric Farman
2020-05-13 14:29 ` [RFC PATCH v2 1/4] vfio-ccw: Do not reset FSM state for unsolicited interrupts Eric Farman
2020-05-13 14:29 ` [RFC PATCH v2 2/4] vfio-ccw: Utilize scsw actl to serialize start operations Eric Farman
2020-05-13 14:29 ` Eric Farman [this message]
2020-05-13 14:29 ` [RFC PATCH v2 4/4] vfio-ccw: Clean up how to react to a failed START Eric Farman
2020-05-14 13:46 ` [RFC PATCH v2 0/4] vfio-ccw: Fix interrupt handling for HALT/CLEAR Halil Pasic
2020-05-15 13:09 ` Eric Farman
2020-05-15 14:55 ` Halil Pasic
2020-05-15 15:58 ` Cornelia Huck
2020-05-15 17:41 ` Halil Pasic
2020-05-15 18:19 ` Eric Farman
2020-05-15 18:12 ` Eric Farman
2020-05-15 18:37 ` Halil Pasic
2020-05-18 22:01 ` Eric Farman
2020-05-15 19:35 ` Halil Pasic
2020-05-18 16:09 ` Cornelia Huck
2020-05-18 21:57 ` Eric Farman
2020-05-19 11:23 ` Cornelia Huck
2020-05-18 22:09 ` Halil Pasic
2020-05-19 11:36 ` Cornelia Huck
2020-05-19 12:10 ` Halil Pasic
2020-05-26 9:55 ` Cornelia Huck
2020-05-26 11:08 ` Eric Farman
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=20200513142934.28788-4-farman@linux.ibm.com \
--to=farman@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=jrossi@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=pasic@linux.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.