From: Cornelia Huck <cohuck@redhat.com>
To: Eric Farman <farman@linux.ibm.com>
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org,
Jason Herne <jjherne@linux.ibm.com>,
Jared Rossi <jrossi@linux.ibm.com>
Subject: Re: [RFC PATCH v1 08/10] vfio-ccw: Wire up the CRW irq and CRW region
Date: Tue, 19 Nov 2019 19:52:36 +0100 [thread overview]
Message-ID: <20191119195236.35189d5b.cohuck@redhat.com> (raw)
In-Reply-To: <20191115025620.19593-9-farman@linux.ibm.com>
On Fri, 15 Nov 2019 03:56:18 +0100
Eric Farman <farman@linux.ibm.com> wrote:
> From: Farhan Ali <alifm@linux.ibm.com>
>
> Use an IRQ to notify userspace that there is a CRW
> pending in the region, related to path-availability
> changes on the passthrough subchannel.
Thinking a bit more about this, it feels a bit odd that a crw for a
chpid ends up on one subchannel. What happens if we have multiple
subchannels passed through by vfio-ccw that use that same chpid?
>
> Signed-off-by: Farhan Ali <alifm@linux.ibm.com>
> Signed-off-by: Eric Farman <farman@linux.ibm.com>
> ---
>
> Notes:
> v0->v1: [EF]
> - Place the non-refactoring changes from the previous patch here
> - Clean up checkpatch (whitespace) errors
> - s/chp_crw/crw/
> - Move acquire/release of io_mutex in vfio_ccw_crw_region_read()
> into patch that introduces that region
> - Remove duplicate include from vfio_ccw_drv.c
> - Reorder include in vfio_ccw_private.h
>
> drivers/s390/cio/vfio_ccw_drv.c | 27 +++++++++++++++++++++++++++
> drivers/s390/cio/vfio_ccw_ops.c | 4 ++++
> drivers/s390/cio/vfio_ccw_private.h | 4 ++++
> include/uapi/linux/vfio.h | 1 +
> 4 files changed, 36 insertions(+)
>
> diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c
> index d1b9020d037b..ab20c32e5319 100644
> --- a/drivers/s390/cio/vfio_ccw_drv.c
> +++ b/drivers/s390/cio/vfio_ccw_drv.c
> @@ -108,6 +108,22 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work)
> eventfd_signal(private->io_trigger, 1);
> }
>
> +static void vfio_ccw_crw_todo(struct work_struct *work)
> +{
> + struct vfio_ccw_private *private;
> + struct crw *crw;
> +
> + private = container_of(work, struct vfio_ccw_private, crw_work);
> + crw = &private->crw;
> +
> + mutex_lock(&private->io_mutex);
> + memcpy(&private->crw_region->crw0, crw, sizeof(*crw));
This looks a bit inflexible. Should we want to support subchannel crws
in the future, we'd need to copy two crws.
Maybe keep two crws (they're not that large, anyway) in the private
structure and copy the second one iff the first one has the chaining
bit on?
> + mutex_unlock(&private->io_mutex);
> +
> + if (private->crw_trigger)
> + eventfd_signal(private->crw_trigger, 1);
> +}
> +
> /*
> * Css driver callbacks
> */
> @@ -187,6 +203,7 @@ static int vfio_ccw_sch_probe(struct subchannel *sch)
> goto out_free;
>
> INIT_WORK(&private->io_work, vfio_ccw_sch_io_todo);
> + INIT_WORK(&private->crw_work, vfio_ccw_crw_todo);
> atomic_set(&private->avail, 1);
> private->state = VFIO_CCW_STATE_STANDBY;
>
> @@ -303,6 +320,11 @@ static int vfio_ccw_chp_event(struct subchannel *sch,
> case CHP_OFFLINE:
> /* Path is gone */
> cio_cancel_halt_clear(sch, &retry);
> + private->crw.rsc = CRW_RSC_CPATH;
> + private->crw.rsid = 0x0 | (link->chpid.cssid << 8) |
What's the leading '0x0' for?
> + link->chpid.id;
> + private->crw.erc = CRW_ERC_PERRN;
> + queue_work(vfio_ccw_work_q, &private->crw_work);
> break;
> case CHP_VARY_ON:
> /* Path logically turned on */
> @@ -312,6 +334,11 @@ static int vfio_ccw_chp_event(struct subchannel *sch,
> case CHP_ONLINE:
> /* Path became available */
> sch->lpm |= mask & sch->opm;
> + private->crw.rsc = CRW_RSC_CPATH;
> + private->crw.rsid = 0x0 | (link->chpid.cssid << 8) |
> + link->chpid.id;
> + private->crw.erc = CRW_ERC_INIT;
> + queue_work(vfio_ccw_work_q, &private->crw_work);
Isn't that racy? Imagine you get one notification for a chpid and queue
it. Then, you get another notification for another chpid and queue it
as well. Depending on when userspace reads, it gets different chpids.
Moreover, a crw may be lost... or am I missing something obvious?
Maybe you need a real queue for the generated crws?
> break;
> }
>
next prev parent reply other threads:[~2019-11-19 18:52 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-15 2:56 [RFC PATCH v1 00/10] s390/vfio-ccw: Channel Path Handling Eric Farman
2019-11-15 2:56 ` [RFC PATCH v1 01/10] vfio-ccw: Introduce new helper functions to free/destroy regions Eric Farman
2019-11-19 12:33 ` Cornelia Huck
2019-11-15 2:56 ` [RFC PATCH v1 02/10] vfio-ccw: Register a chp_event callback for vfio-ccw Eric Farman
2019-11-19 12:48 ` Cornelia Huck
2019-11-19 15:45 ` Eric Farman
2019-11-15 2:56 ` [RFC PATCH v1 03/10] vfio-ccw: Use subchannel lpm in the orb Eric Farman
2019-11-19 13:00 ` Cornelia Huck
2019-11-19 15:16 ` Eric Farman
2019-11-19 15:38 ` Cornelia Huck
2019-11-19 18:58 ` Eric Farman
2019-11-15 2:56 ` [RFC PATCH v1 04/10] vfio-ccw: Refactor the unregister of the async regions Eric Farman
2019-11-19 16:21 ` Cornelia Huck
2019-11-15 2:56 ` [RFC PATCH v1 05/10] vfio-ccw: Introduce a new schib region Eric Farman
2019-11-19 16:52 ` Cornelia Huck
2019-11-20 16:49 ` Eric Farman
2019-11-15 2:56 ` [RFC PATCH v1 06/10] vfio-ccw: Introduce a new CRW region Eric Farman
2019-11-19 17:17 ` Cornelia Huck
2019-11-15 2:56 ` [RFC PATCH v1 07/10] vfio-ccw: Refactor IRQ handlers Eric Farman
2019-11-19 17:18 ` Cornelia Huck
2019-11-15 2:56 ` [RFC PATCH v1 08/10] vfio-ccw: Wire up the CRW irq and CRW region Eric Farman
2019-11-19 18:52 ` Cornelia Huck [this message]
2019-12-05 20:43 ` Eric Farman
2019-12-06 10:21 ` Cornelia Huck
2019-12-06 21:24 ` Eric Farman
2019-12-09 12:38 ` Cornelia Huck
2019-11-15 2:56 ` [RFC PATCH v1 09/10] vfio-ccw: Add trace for CRW event Eric Farman
2019-11-15 2:56 ` [RFC PATCH v1 10/10] vfio-ccw: Remove inline get_schid() routine Eric Farman
2019-11-15 11:15 ` [RFC PATCH v1 00/10] s390/vfio-ccw: Channel Path Handling Cornelia Huck
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=20191119195236.35189d5b.cohuck@redhat.com \
--to=cohuck@redhat.com \
--cc=farman@linux.ibm.com \
--cc=jjherne@linux.ibm.com \
--cc=jrossi@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.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