From: Cornelia Huck <cohuck@redhat.com>
To: Eric Farman <farman@linux.ibm.com>
Cc: Halil Pasic <pasic@linux.ibm.com>,
Jason Herne <jjherne@linux.ibm.com>,
qemu-s390x@nongnu.org, qemu-devel@nongnu.org,
Jared Rossi <jrossi@linux.ibm.com>
Subject: Re: [RFC PATCH v1 5/8] vfio-ccw: Add support for the schib region
Date: Wed, 20 Nov 2019 12:13:29 +0100 [thread overview]
Message-ID: <20191120121329.73dbddc2.cohuck@redhat.com> (raw)
In-Reply-To: <20191115033437.37926-6-farman@linux.ibm.com>
On Fri, 15 Nov 2019 04:34:34 +0100
Eric Farman <farman@linux.ibm.com> wrote:
> From: Farhan Ali <alifm@linux.ibm.com>
>
> The schib region can be used to obtain the latest SCHIB from the host
> passthrough subchannel. Since the guest SCHIB is virtualized,
> we currently only update the path related information so that the
> guest is aware of any path related changes when it issues the
> 'stsch' instruction.
One important information here is that you tweak the generic stsch
handling, although the behaviour remains the same for non-vfio
subchannels.
>
> Signed-off-by: Farhan Ali <alifm@linux.ibm.com>
> Signed-off-by: Eric Farman <farman@linux.ibm.com>
> ---
>
> Notes:
> v0->v1: [EF]
> - Change various incarnations of "update chp status" to
> "handle_store", to reflect the STSCH instruction that will
> drive this code
> - Remove temporary variable for casting/testing purposes in
> s390_ccw_store(), and add a block comment of WHY its there.
> - Add a few comments to vfio_ccw_handle_store()
>
> hw/s390x/css.c | 8 ++++--
> hw/s390x/s390-ccw.c | 20 +++++++++++++
> hw/vfio/ccw.c | 57 +++++++++++++++++++++++++++++++++++++
> include/hw/s390x/css.h | 3 +-
> include/hw/s390x/s390-ccw.h | 1 +
> target/s390x/ioinst.c | 3 +-
> 6 files changed, 87 insertions(+), 5 deletions(-)
>
> diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> index 844caab408..6ee6a96d75 100644
> --- a/hw/s390x/css.c
> +++ b/hw/s390x/css.c
> @@ -1335,11 +1335,15 @@ static void copy_schib_to_guest(SCHIB *dest, const SCHIB *src)
> }
> }
>
> -int css_do_stsch(SubchDev *sch, SCHIB *schib)
> +IOInstEnding css_do_stsch(SubchDev *sch, SCHIB *schib)
> {
> + int ret = IOINST_CC_EXPECTED;
It's a bit useless initializing ret here, given that you use it right
below :)
> +
Maybe add a comment here:
/*
* For some subchannels, we may want to update parts of
* the schib (e.g. update path masks from the host device
* for passthrough subchannels).
*/
> + ret = s390_ccw_store(sch);
> +
> /* Use current status. */
> copy_schib_to_guest(schib, &sch->curr_status);
> - return 0;
> + return ret;
> }
>
> static void copy_pmcw_from_guest(PMCW *dest, const PMCW *src)
> diff --git a/hw/s390x/s390-ccw.c b/hw/s390x/s390-ccw.c
> index 0c5a5b60bd..be0b379338 100644
> --- a/hw/s390x/s390-ccw.c
> +++ b/hw/s390x/s390-ccw.c
> @@ -51,6 +51,26 @@ int s390_ccw_clear(SubchDev *sch)
> return cdc->handle_clear(sch);
> }
>
> +IOInstEnding s390_ccw_store(SubchDev *sch)
> +{
> + S390CCWDeviceClass *cdc = NULL;
> + int ret = IOINST_CC_EXPECTED;
> +
> + /*
> + * This only applies to passthrough devices, so we can't unconditionally
> + * set this variable like we would for halt/clear.
Hm, can we maybe handle this differently? We have a generic ccw_cb in
the subchannel structure for ccw interpretation; would it make sense to
add a generic callback for stsch there as well?
(This works fine, though. Might want to add the check for halt/clear as
well, but that might be a bit overkill.)
> + */
> + if (object_dynamic_cast(OBJECT(sch->driver_data), TYPE_S390_CCW)) {
> + cdc = S390_CCW_DEVICE_GET_CLASS(sch->driver_data);
> + }
> +
> + if (cdc && cdc->handle_store) {
> + ret = cdc->handle_store(sch);
> + }
> +
> + return ret;
> +}
> +
> static void s390_ccw_get_dev_info(S390CCWDevice *cdev,
> char *sysfsdev,
> Error **errp)
> diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> index 3e32bc1819..2ff223470f 100644
> --- a/hw/vfio/ccw.c
> +++ b/hw/vfio/ccw.c
> @@ -41,6 +41,9 @@ struct VFIOCCWDevice {
> uint64_t async_cmd_region_size;
> uint64_t async_cmd_region_offset;
> struct ccw_cmd_region *async_cmd_region;
> + uint64_t schib_region_size;
> + uint64_t schib_region_offset;
> + struct ccw_schib_region *schib_region;
> EventNotifier io_notifier;
> bool force_orb_pfch;
> bool warned_orb_pfch;
> @@ -124,6 +127,45 @@ again:
> }
> }
>
> +static IOInstEnding vfio_ccw_handle_store(SubchDev *sch)
> +{
> + S390CCWDevice *cdev = sch->driver_data;
> + VFIOCCWDevice *vcdev = DO_UPCAST(VFIOCCWDevice, cdev, cdev);
> + SCHIB *schib = &sch->curr_status;
> + struct ccw_schib_region *region = vcdev->schib_region;
> + SCHIB *s = (SCHIB *)region->schib_area;
You probably don't want to access region until after you checked it's
not NULL :)
> + int ret;
> +
> + /* schib region not available so nothing else to do */
> + if (!region) {
> + return IOINST_CC_EXPECTED;
> + }
> +
> + memset(region, 0, sizeof(*region));
> + ret = pread(vcdev->vdev.fd, region, vcdev->schib_region_size,
> + vcdev->schib_region_offset);
> +
> + if (ret == -1) {
> + /* Assume device is damaged, regardless of errno */
> + return IOINST_CC_NOT_OPERATIONAL;
Not sure that's correct; cc 3 for stsch indicates that there are no
more subchannels with higher ids?
> + }
> +
> + /*
> + * Selectively copy path-related bits of the SCHIB,
> + * rather than copying the entire struct.
> + */
> + schib->pmcw.pnom = s->pmcw.pnom;
> + schib->pmcw.lpum = s->pmcw.lpum;
> + schib->pmcw.pam = s->pmcw.pam;
> + schib->pmcw.pom = s->pmcw.pom;
> +
> + if (s->scsw.flags & SCSW_FLAGS_MASK_PNO) {
> + schib->scsw.flags |= SCSW_FLAGS_MASK_PNO;
> + }
> +
> + return IOINST_CC_EXPECTED;
> +}
> +
The rest of the patch looks good to me.
next prev parent reply other threads:[~2019-11-20 11:17 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-15 3:34 [RFC PATCH v1 0/8] s390x/vfio-ccw: Channel Path Handling Eric Farman
2019-11-15 3:34 ` [RFC PATCH v1 1/8] vfio-ccw: Return IOINST_CC_NOT_OPERATIONAL for EIO Eric Farman
2019-11-18 18:13 ` Cornelia Huck
2019-11-19 11:23 ` Halil Pasic
2019-11-19 12:02 ` Cornelia Huck
2019-11-19 15:42 ` Eric Farman
2019-11-19 17:59 ` Halil Pasic
2019-11-20 10:11 ` Cornelia Huck
2019-11-19 15:49 ` Eric Farman
2019-11-15 3:34 ` [RFC PATCH v1 2/8] vfio-ccw: Don't inject an I/O interrupt if the subchannel is not enabled Eric Farman
2019-11-18 18:23 ` Cornelia Huck
2019-11-19 15:47 ` Eric Farman
2019-11-15 3:34 ` [RFC PATCH v1 3/8] linux-headers: update Eric Farman
2019-11-15 3:34 ` [RFC PATCH v1 4/8] vfio-ccw: Refactor cleanup of regions Eric Farman
2019-11-20 10:31 ` Cornelia Huck
2019-11-15 3:34 ` [RFC PATCH v1 5/8] vfio-ccw: Add support for the schib region Eric Farman
2019-11-20 11:13 ` Cornelia Huck [this message]
2020-01-31 20:15 ` Eric Farman
2020-02-03 10:43 ` Cornelia Huck
2019-11-15 3:34 ` [RFC PATCH v1 6/8] vfio-ccw: Add support for the crw region Eric Farman
2019-11-20 12:30 ` Cornelia Huck
2019-11-15 3:34 ` [RFC PATCH v1 7/8] vfio-ccw: Refactor ccw irq handler Eric Farman
2019-11-20 12:39 ` Cornelia Huck
2019-12-03 20:01 ` Eric Farman
2019-11-15 3:34 ` [RFC PATCH v1 8/8] vfio-ccw: Add support for the CRW irq Eric Farman
2019-11-20 12:50 ` 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=20191120121329.73dbddc2.cohuck@redhat.com \
--to=cohuck@redhat.com \
--cc=farman@linux.ibm.com \
--cc=jjherne@linux.ibm.com \
--cc=jrossi@linux.ibm.com \
--cc=pasic@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 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.