public inbox for linux-s390@vger.kernel.org
 help / color / mirror / Atom feed
From: Cornelia Huck <cohuck@redhat.com>
To: Pierre Morel <pmorel@linux.vnet.ibm.com>
Cc: pasic@linux.vnet.ibm.com, bjsdjshi@linux.vnet.ibm.com,
	linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,
	kvm@vger.kernel.org
Subject: Re: [PATCH 10/10] vfio: ccw: Let user wait when busy on IO
Date: Wed, 25 Apr 2018 10:48:41 +0200	[thread overview]
Message-ID: <20180425104841.758a314d.cohuck@redhat.com> (raw)
In-Reply-To: <1524149293-12658-11-git-send-email-pmorel@linux.vnet.ibm.com>

On Thu, 19 Apr 2018 16:48:13 +0200
Pierre Morel <pmorel@linux.vnet.ibm.com> wrote:

> In the current implementation, we do not want to start a new SSCH
> command before the last one ends.
> 
> Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
> ---
>  drivers/s390/cio/vfio_ccw_fsm.c     |  3 +++
>  drivers/s390/cio/vfio_ccw_ops.c     | 21 ++++++++++++++++++++-
>  drivers/s390/cio/vfio_ccw_private.h |  4 +++-
>  3 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c
> index b77b8ad..4140292 100644
> --- a/drivers/s390/cio/vfio_ccw_fsm.c
> +++ b/drivers/s390/cio/vfio_ccw_fsm.c
> @@ -195,6 +195,9 @@ static int fsm_irq(struct vfio_ccw_private *private)
>  	if (private->io_trigger)
>  		eventfd_signal(private->io_trigger, 1);
>  
> +	if (private->io_completion)
> +		complete(private->io_completion);
> +
>  	return VFIO_CCW_STATE_IDLE;
>  }
>  
> diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c
> index f0f4071..346532d 100644
> --- a/drivers/s390/cio/vfio_ccw_ops.c
> +++ b/drivers/s390/cio/vfio_ccw_ops.c
> @@ -171,6 +171,8 @@ static ssize_t vfio_ccw_mdev_write(struct mdev_device *mdev,
>  	struct vfio_ccw_private *private;
>  	struct ccw_io_region *region;
>  	union scsw *scsw;
> +	int max_retries = 5;
> +	DECLARE_COMPLETION_ONSTACK(completion);
>  
>  	if (*ppos + count > sizeof(*region))
>  		return -EINVAL;
> @@ -185,7 +187,24 @@ static ssize_t vfio_ccw_mdev_write(struct mdev_device *mdev,
>  	if ((scsw->cmd.fctl & SCSW_FCTL_START_FUNC) != SCSW_FCTL_START_FUNC)
>  		return -EINVAL;
>  
> -	vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_SSCH_REQ);
> +	do {
> +		switch (private->state) {
> +		case VFIO_CCW_STATE_BUSY:
> +			private->io_completion = &completion;
> +			wait_for_completion(&completion);
> +			break;
> +		case VFIO_CCW_STATE_IDLE:
> +			if (!vfio_ccw_fsm_event(private,
> +						VFIO_CCW_EVENT_SSCH_REQ))
> +				return count;
> +			break;
> +		default:
> +			return -EBUSY;
> +		}
> +	} while (max_retries--);

I really don't think we want to go there. If we are busy, generate an
indication to that respect, but don't retry. My preferred approach
would be to keep the "we're busy" times as small as possible and let
the host channel subsystem handle any further races. We can't make that
bulletproof anyway, so no reason to make life more difficult for us.

> +
> +	if (max_retries <= 0)
> +		return -EBUSY;
>  	if (region->ret_code != 0)
>  		return region->ret_code;
>  
> diff --git a/drivers/s390/cio/vfio_ccw_private.h b/drivers/s390/cio/vfio_ccw_private.h
> index dbef727..7cca078 100644
> --- a/drivers/s390/cio/vfio_ccw_private.h
> +++ b/drivers/s390/cio/vfio_ccw_private.h
> @@ -39,6 +39,7 @@ struct vfio_ccw_private {
>  	struct subchannel	*sch;
>  	int			state;
>  	struct completion	*completion;
> +	struct completion	*io_completion;
>  	atomic_t		avail;
>  	struct mdev_device	*mdev;
>  	struct notifier_block	nb;
> @@ -93,12 +94,13 @@ enum vfio_ccw_event {
>  typedef int (fsm_func_t)(struct vfio_ccw_private *);
>  extern fsm_func_t *vfio_ccw_jumptable[NR_VFIO_CCW_STATES][NR_VFIO_CCW_EVENTS];
>  
> -static inline void vfio_ccw_fsm_event(struct vfio_ccw_private *private,
> +static inline int vfio_ccw_fsm_event(struct vfio_ccw_private *private,
>  				     int event)
>  {
>  	mutex_lock(&private->state_mutex);
>  	private->state = vfio_ccw_jumptable[private->state][event](private);
>  	mutex_unlock(&private->state_mutex);
> +	return private->io_region.ret_code;
>  }
>  
>  extern struct workqueue_struct *vfio_ccw_work_q;

  reply	other threads:[~2018-04-25  8:48 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-19 14:48 [PATCH 00/10] vfio: ccw: Refactoring the VFIO CCW state machine Pierre Morel
2018-04-19 14:48 ` [PATCH 01/10] vfio: ccw: Moving state change out of IRQ context Pierre Morel
     [not found]   ` <20180424065442.GV12194@bjsdjshi@linux.vnet.ibm.com>
2018-04-24  8:40     ` Pierre Morel
2018-04-24  9:59       ` Cornelia Huck
2018-04-24 11:49         ` Pierre Morel
2018-04-24 11:55           ` Cornelia Huck
2018-04-24 13:07             ` Pierre Morel
2018-04-24 16:42         ` Halil Pasic
2018-04-25  6:57           ` Cornelia Huck
2018-04-25 11:06             ` Halil Pasic
2018-04-30 13:56               ` Cornelia Huck
2018-04-19 14:48 ` [PATCH 02/10] vfio: ccw: Transform FSM functions to return state Pierre Morel
     [not found]   ` <20180424072550.GW12194@bjsdjshi@linux.vnet.ibm.com>
2018-04-24  8:22     ` Pierre Morel
2018-04-30 13:58       ` Cornelia Huck
2018-04-19 14:48 ` [PATCH 03/10] vfio: ccw: new SCH_EVENT event Pierre Morel
2018-04-25  8:25   ` Cornelia Huck
2018-04-25 13:54     ` Pierre Morel
     [not found]   ` <20180426065954.GP5428@bjsdjshi@linux.vnet.ibm.com>
2018-04-30 15:28     ` Cornelia Huck
2018-05-04  8:25       ` Pierre Morel
2018-04-19 14:48 ` [PATCH 04/10] vfio: ccw: replace IO_REQ event with SSCH_REQ event Pierre Morel
2018-04-25  8:41   ` Cornelia Huck
     [not found]     ` <24f638e4-2f7e-00e1-1efb-ff3fe524bca0@linux.vnet.ibm.com>
2018-04-30 15:30       ` Cornelia Huck
2018-05-03 12:06         ` Pierre Morel
2018-05-22 15:38           ` Cornelia Huck
2018-05-23  8:19             ` Pierre Morel
     [not found]   ` <20180426073053.GZ12194@bjsdjshi@linux.vnet.ibm.com>
     [not found]     ` <20180426074806.GB12194@bjsdjshi@linux.vnet.ibm.com>
2018-04-30 15:33       ` Cornelia Huck
     [not found]         ` <20180502074622.GV5428@bjsdjshi@linux.vnet.ibm.com>
2018-05-02  8:22           ` Cornelia Huck
2018-05-03 14:26           ` Pierre Morel
     [not found]             ` <20180504011916.GA26081@bjsdjshi@linux.ibm.com>
2018-05-04 11:02               ` Pierre Morel
2018-05-22 15:41                 ` Cornelia Huck
2018-05-23  7:50                   ` Pierre Morel
2018-05-23  8:10                     ` Cornelia Huck
2018-04-19 14:48 ` [PATCH 05/10] vfio: ccw: Suppress unused event parameter Pierre Morel
     [not found]   ` <20180426073618.GA12194@bjsdjshi@linux.vnet.ibm.com>
2018-05-03 10:34     ` Pierre Morel
2018-04-19 14:48 ` [PATCH 06/10] vfio: ccw: Make FSM functions atomic Pierre Morel
2018-04-19 14:48 ` [PATCH 07/10] vfio: ccw: Introduce the INIT event Pierre Morel
2018-04-30 15:39   ` Cornelia Huck
2018-05-03 10:31     ` Pierre Morel
2018-04-19 14:48 ` [PATCH 08/10] vfio: ccw: Handling reset and shutdown with states Pierre Morel
2018-04-30 15:43   ` Cornelia Huck
2018-04-19 14:48 ` [PATCH 09/10] vfio: ccw: Suppressing the BOXED state Pierre Morel
2018-04-25  8:44   ` Cornelia Huck
2018-04-25 13:55     ` Pierre Morel
2018-04-30 15:47       ` Cornelia Huck
2018-05-03  9:02         ` Pierre Morel
2018-04-19 14:48 ` [PATCH 10/10] vfio: ccw: Let user wait when busy on IO Pierre Morel
2018-04-25  8:48   ` Cornelia Huck [this message]
2018-04-25 14:00     ` Pierre Morel

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=20180425104841.758a314d.cohuck@redhat.com \
    --to=cohuck@redhat.com \
    --cc=bjsdjshi@linux.vnet.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=pasic@linux.vnet.ibm.com \
    --cc=pmorel@linux.vnet.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox