Message ID | 20210511195631.3995081-3-farman@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio-ccw: Fix interrupt handling for HALT/CLEAR | expand |
On 5/11/21 3:56 PM, Eric Farman wrote: > When an I/O request is made, the fsm_io_request() routine > moves the FSM state from IDLE to CP_PROCESSING, and then > fsm_io_helper() moves it to CP_PENDING if the START SUBCHANNEL > received a cc0. Yet, the error case to go from CP_PROCESSING > back to IDLE is done after the FSM call returns. > > Let's move this up into the FSM proper, to provide some > better symmetry when unwinding in this case. > > Signed-off-by: Eric Farman <farman@linux.ibm.com> > Reviewed-by: Cornelia Huck <cohuck@redhat.com> Acked-by: Matthew Rosato <mjrosato@linux.ibm.com> > --- > drivers/s390/cio/vfio_ccw_fsm.c | 1 + > drivers/s390/cio/vfio_ccw_ops.c | 2 -- > 2 files changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c > index 23e61aa638e4..e435a9cd92da 100644 > --- a/drivers/s390/cio/vfio_ccw_fsm.c > +++ b/drivers/s390/cio/vfio_ccw_fsm.c > @@ -318,6 +318,7 @@ static void fsm_io_request(struct vfio_ccw_private *private, > } > > err_out: > + private->state = VFIO_CCW_STATE_IDLE; > trace_vfio_ccw_fsm_io_request(scsw->cmd.fctl, schid, > io_region->ret_code, errstr); > } > diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c > index 767ac41686fe..5971641964c6 100644 > --- a/drivers/s390/cio/vfio_ccw_ops.c > +++ b/drivers/s390/cio/vfio_ccw_ops.c > @@ -276,8 +276,6 @@ static ssize_t vfio_ccw_mdev_write_io_region(struct vfio_ccw_private *private, > } > > vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_IO_REQ); > - if (region->ret_code != 0) > - private->state = VFIO_CCW_STATE_IDLE; > ret = (region->ret_code != 0) ? region->ret_code : count; > > out_unlock: >
diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c index 23e61aa638e4..e435a9cd92da 100644 --- a/drivers/s390/cio/vfio_ccw_fsm.c +++ b/drivers/s390/cio/vfio_ccw_fsm.c @@ -318,6 +318,7 @@ static void fsm_io_request(struct vfio_ccw_private *private, } err_out: + private->state = VFIO_CCW_STATE_IDLE; trace_vfio_ccw_fsm_io_request(scsw->cmd.fctl, schid, io_region->ret_code, errstr); } diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c index 767ac41686fe..5971641964c6 100644 --- a/drivers/s390/cio/vfio_ccw_ops.c +++ b/drivers/s390/cio/vfio_ccw_ops.c @@ -276,8 +276,6 @@ static ssize_t vfio_ccw_mdev_write_io_region(struct vfio_ccw_private *private, } vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_IO_REQ); - if (region->ret_code != 0) - private->state = VFIO_CCW_STATE_IDLE; ret = (region->ret_code != 0) ? region->ret_code : count; out_unlock: