All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cornelia Huck <cohuck@redhat.com>
To: Pierre Morel <pmorel@linux.ibm.com>
Cc: Dong Jia Shi <bjsdjshi@linux.ibm.com>,
	Halil Pasic <pasic@linux.ibm.com>,
	linux-s390@vger.kernel.org, kvm@vger.kernel.org,
	linux-kernel@vger.kernel.org, qemu-s390x@nongnu.org,
	qemu-devel@nongnu.org
Subject: Re: [PATCH RFC 1/2] vfio-ccw: forward halt/clear to device if supported
Date: Tue, 15 May 2018 18:01:04 +0200	[thread overview]
Message-ID: <20180515180104.646cba0c.cohuck@redhat.com> (raw)
In-Reply-To: <d2030a0c-6ab6-a470-f7d7-0926a7ff2b28@linux.ibm.com>

On Fri, 11 May 2018 11:53:52 +0200
Pierre Morel <pmorel@linux.ibm.com> wrote:

> On 09/05/2018 17:49, Cornelia Huck wrote:
> > The initial version of vfio-ccw did not support forwarding of the
> > halt or clear functions to the device, and we had to emulate them
> > instead.
> >
> > For versions of the vfio-ccw kernel implementation that indeed do
> > support halt/clear (by indicating them in the fctl of the scsw in
> > the io_region), we can simply start making use of it. If the kernel
> > does not support handling halt/clear, fall back to emulation.
> >
> > Signed-off-by: Cornelia Huck <cohuck@redhat.com>
> > ---
> >   hw/s390x/css.c         | 32 ++++++++++++++++++++++++++++----
> >   hw/vfio/ccw.c          | 11 +++++++++--
> >   include/hw/s390x/css.h | 10 +++++++---
> >   3 files changed, 44 insertions(+), 9 deletions(-)
> >
> > diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> > index 301bf1772f..b6727d0607 100644
> > --- a/hw/s390x/css.c
> > +++ b/hw/s390x/css.c
> > @@ -1180,6 +1180,16 @@ static void sch_handle_start_func_virtual(SubchDev *sch)
> >   
> >   }
> >   
> > +static IOInstEnding sch_handle_clear_func_passthrough(SubchDev *sch)
> > +{
> > +    return s390_ccw_cmd_request(sch);
> > +}
> > +
> > +static IOInstEnding sch_handle_halt_func_passthrough(SubchDev *sch)
> > +{
> > +    return s390_ccw_cmd_request(sch);
> > +}
> > +
> >   static IOInstEnding sch_handle_start_func_passthrough(SubchDev *sch)
> >   {
> >   
> > @@ -1233,13 +1243,27 @@ IOInstEnding do_subchannel_work_virtual(SubchDev *sch)
> >   IOInstEnding do_subchannel_work_passthrough(SubchDev *sch)
> >   {
> >       SCSW *s = &sch->curr_status.scsw;
> > +    static bool no_halt_clear;
> >   
> > +    /* if the kernel does not support halt/clear, fall back to emulation */
> >       if (s->ctrl & SCSW_FCTL_CLEAR_FUNC) {
> > -        /* TODO: Clear handling */
> > -        sch_handle_clear_func(sch);
> > +        if (no_halt_clear) {
> > +            sch_handle_clear_func(sch);
> > +        } else {
> > +            if (sch_handle_clear_func_passthrough(sch) == IOINST_OPNOTSUPP) {
> > +                no_halt_clear = true;
> > +                sch_handle_halt_func(sch);
> > +            }
> > +        }
> >       } else if (s->ctrl & SCSW_FCTL_HALT_FUNC) {
> > -        /* TODO: Halt handling */
> > -        sch_handle_halt_func(sch);
> > +        if (no_halt_clear) {
> > +            sch_handle_halt_func(sch);
> > +        } else {
> > +            if (sch_handle_halt_func_passthrough(sch) == IOINST_OPNOTSUPP) {
> > +                no_halt_clear = true;
> > +                sch_handle_halt_func(sch);
> > +            }
> > +        }
> >       } else if (s->ctrl & SCSW_FCTL_START_FUNC) {
> >           return sch_handle_start_func_passthrough(sch);
> >       }
> > diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> > index e67392c5f9..247901ae41 100644
> > --- a/hw/vfio/ccw.c
> > +++ b/hw/vfio/ccw.c
> > @@ -60,6 +60,7 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
> >   
> >       memset(region, 0, sizeof(*region));
> >   
> > +    /* orb is only valid for ssch, but does not hurt for other functions */
> >       memcpy(region->orb_area, &sch->orb, sizeof(ORB));
> >       memcpy(region->scsw_area, &sch->curr_status.scsw, sizeof(SCSW));
> >   
> > @@ -70,8 +71,12 @@ again:
> >           if (errno == EAGAIN) {
> >               goto again;
> >           }
> > -        error_report("vfio-ccw: wirte I/O region failed with errno=%d", errno);
> > -        ret = -errno;
> > +        /* handle not supported operations like halt/clear on older kernels */
> > +        if (ret != -EOPNOTSUPP) {
> > +            error_report("vfio-ccw: write I/O region failed with errno=%d",
> > +                         errno);
> > +            ret = -errno;
> > +        }
> >       } else {
> >           ret = region->ret_code;
> >       }
> > @@ -83,6 +88,8 @@ again:
> >       case -ENODEV:
> >       case -EACCES:
> >           return IOINST_CC_NOT_OPERATIONAL;
> > +    case -EOPNOTSUPP:
> > +        return IOINST_OPNOTSUPP;
> >       case -EFAULT:
> >       default:
> >           sch_gen_unit_exception(sch);
> > diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> > index 35facb47d2..e33f26882b 100644
> > --- a/include/hw/s390x/css.h
> > +++ b/include/hw/s390x/css.h
> > @@ -100,9 +100,11 @@ typedef struct CcwDataStream {
> >   } CcwDataStream;
> >   
> >   /*
> > - * IO instructions conclude according to this. Currently we have only
> > - * cc codes. Valid values are 0, 1, 2, 3 and the generic semantic for
> > + * IO instructions conclude according to this. One class of values are
> > + * cc codes: Valid values are 0, 1, 2, 3 and the generic semantic for
> >    * IO instructions is described briefly. For more details consult the PoP.
> > + * Additionally, other endings may occur due to internal processing errors
> > + * like lack of support for an operation.
> >    */
> >   typedef enum IOInstEnding {
> >       /* produced expected result */
> > @@ -112,7 +114,9 @@ typedef enum IOInstEnding {
> >       /* inst. ineffective because busy with previously initiated function */
> >       IOINST_CC_BUSY = 2,
> >       /* inst. ineffective because not operational */
> > -    IOINST_CC_NOT_OPERATIONAL = 3
> > +    IOINST_CC_NOT_OPERATIONAL = 3,
> > +    /* internal: operation not supported */
> > +    IOINST_OPNOTSUPP = 4
> >   } IOInstEnding;
> >   
> >   typedef struct SubchDev SubchDev;  
> 
> 
> Couldn't we introduce ABI versioning ?

Can you elaborate what you're referring to?

If you mean checking capabilities of the kernel or so: If we can avoid
that and just try (and stop if it does not work), I'd prefer that (no
dependencies).

The IOINST_OPNOTSUPP is a bit ugly, but I did not see a more elegant
way to pass 'not supported' up to the caller.

WARNING: multiple messages have this Message-ID (diff)
From: Cornelia Huck <cohuck@redhat.com>
To: Pierre Morel <pmorel@linux.ibm.com>
Cc: Dong Jia Shi <bjsdjshi@linux.ibm.com>,
	Halil Pasic <pasic@linux.ibm.com>,
	linux-s390@vger.kernel.org, kvm@vger.kernel.org,
	linux-kernel@vger.kernel.org, qemu-s390x@nongnu.org,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH RFC 1/2] vfio-ccw: forward halt/clear to device if supported
Date: Tue, 15 May 2018 18:01:04 +0200	[thread overview]
Message-ID: <20180515180104.646cba0c.cohuck@redhat.com> (raw)
In-Reply-To: <d2030a0c-6ab6-a470-f7d7-0926a7ff2b28@linux.ibm.com>

On Fri, 11 May 2018 11:53:52 +0200
Pierre Morel <pmorel@linux.ibm.com> wrote:

> On 09/05/2018 17:49, Cornelia Huck wrote:
> > The initial version of vfio-ccw did not support forwarding of the
> > halt or clear functions to the device, and we had to emulate them
> > instead.
> >
> > For versions of the vfio-ccw kernel implementation that indeed do
> > support halt/clear (by indicating them in the fctl of the scsw in
> > the io_region), we can simply start making use of it. If the kernel
> > does not support handling halt/clear, fall back to emulation.
> >
> > Signed-off-by: Cornelia Huck <cohuck@redhat.com>
> > ---
> >   hw/s390x/css.c         | 32 ++++++++++++++++++++++++++++----
> >   hw/vfio/ccw.c          | 11 +++++++++--
> >   include/hw/s390x/css.h | 10 +++++++---
> >   3 files changed, 44 insertions(+), 9 deletions(-)
> >
> > diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> > index 301bf1772f..b6727d0607 100644
> > --- a/hw/s390x/css.c
> > +++ b/hw/s390x/css.c
> > @@ -1180,6 +1180,16 @@ static void sch_handle_start_func_virtual(SubchDev *sch)
> >   
> >   }
> >   
> > +static IOInstEnding sch_handle_clear_func_passthrough(SubchDev *sch)
> > +{
> > +    return s390_ccw_cmd_request(sch);
> > +}
> > +
> > +static IOInstEnding sch_handle_halt_func_passthrough(SubchDev *sch)
> > +{
> > +    return s390_ccw_cmd_request(sch);
> > +}
> > +
> >   static IOInstEnding sch_handle_start_func_passthrough(SubchDev *sch)
> >   {
> >   
> > @@ -1233,13 +1243,27 @@ IOInstEnding do_subchannel_work_virtual(SubchDev *sch)
> >   IOInstEnding do_subchannel_work_passthrough(SubchDev *sch)
> >   {
> >       SCSW *s = &sch->curr_status.scsw;
> > +    static bool no_halt_clear;
> >   
> > +    /* if the kernel does not support halt/clear, fall back to emulation */
> >       if (s->ctrl & SCSW_FCTL_CLEAR_FUNC) {
> > -        /* TODO: Clear handling */
> > -        sch_handle_clear_func(sch);
> > +        if (no_halt_clear) {
> > +            sch_handle_clear_func(sch);
> > +        } else {
> > +            if (sch_handle_clear_func_passthrough(sch) == IOINST_OPNOTSUPP) {
> > +                no_halt_clear = true;
> > +                sch_handle_halt_func(sch);
> > +            }
> > +        }
> >       } else if (s->ctrl & SCSW_FCTL_HALT_FUNC) {
> > -        /* TODO: Halt handling */
> > -        sch_handle_halt_func(sch);
> > +        if (no_halt_clear) {
> > +            sch_handle_halt_func(sch);
> > +        } else {
> > +            if (sch_handle_halt_func_passthrough(sch) == IOINST_OPNOTSUPP) {
> > +                no_halt_clear = true;
> > +                sch_handle_halt_func(sch);
> > +            }
> > +        }
> >       } else if (s->ctrl & SCSW_FCTL_START_FUNC) {
> >           return sch_handle_start_func_passthrough(sch);
> >       }
> > diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> > index e67392c5f9..247901ae41 100644
> > --- a/hw/vfio/ccw.c
> > +++ b/hw/vfio/ccw.c
> > @@ -60,6 +60,7 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
> >   
> >       memset(region, 0, sizeof(*region));
> >   
> > +    /* orb is only valid for ssch, but does not hurt for other functions */
> >       memcpy(region->orb_area, &sch->orb, sizeof(ORB));
> >       memcpy(region->scsw_area, &sch->curr_status.scsw, sizeof(SCSW));
> >   
> > @@ -70,8 +71,12 @@ again:
> >           if (errno == EAGAIN) {
> >               goto again;
> >           }
> > -        error_report("vfio-ccw: wirte I/O region failed with errno=%d", errno);
> > -        ret = -errno;
> > +        /* handle not supported operations like halt/clear on older kernels */
> > +        if (ret != -EOPNOTSUPP) {
> > +            error_report("vfio-ccw: write I/O region failed with errno=%d",
> > +                         errno);
> > +            ret = -errno;
> > +        }
> >       } else {
> >           ret = region->ret_code;
> >       }
> > @@ -83,6 +88,8 @@ again:
> >       case -ENODEV:
> >       case -EACCES:
> >           return IOINST_CC_NOT_OPERATIONAL;
> > +    case -EOPNOTSUPP:
> > +        return IOINST_OPNOTSUPP;
> >       case -EFAULT:
> >       default:
> >           sch_gen_unit_exception(sch);
> > diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> > index 35facb47d2..e33f26882b 100644
> > --- a/include/hw/s390x/css.h
> > +++ b/include/hw/s390x/css.h
> > @@ -100,9 +100,11 @@ typedef struct CcwDataStream {
> >   } CcwDataStream;
> >   
> >   /*
> > - * IO instructions conclude according to this. Currently we have only
> > - * cc codes. Valid values are 0, 1, 2, 3 and the generic semantic for
> > + * IO instructions conclude according to this. One class of values are
> > + * cc codes: Valid values are 0, 1, 2, 3 and the generic semantic for
> >    * IO instructions is described briefly. For more details consult the PoP.
> > + * Additionally, other endings may occur due to internal processing errors
> > + * like lack of support for an operation.
> >    */
> >   typedef enum IOInstEnding {
> >       /* produced expected result */
> > @@ -112,7 +114,9 @@ typedef enum IOInstEnding {
> >       /* inst. ineffective because busy with previously initiated function */
> >       IOINST_CC_BUSY = 2,
> >       /* inst. ineffective because not operational */
> > -    IOINST_CC_NOT_OPERATIONAL = 3
> > +    IOINST_CC_NOT_OPERATIONAL = 3,
> > +    /* internal: operation not supported */
> > +    IOINST_OPNOTSUPP = 4
> >   } IOInstEnding;
> >   
> >   typedef struct SubchDev SubchDev;  
> 
> 
> Couldn't we introduce ABI versioning ?

Can you elaborate what you're referring to?

If you mean checking capabilities of the kernel or so: If we can avoid
that and just try (and stop if it does not work), I'd prefer that (no
dependencies).

The IOINST_OPNOTSUPP is a bit ugly, but I did not see a more elegant
way to pass 'not supported' up to the caller.

  reply	other threads:[~2018-05-15 16:01 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-09 15:49 [PATCH RFC 0/2] vfio-ccw: exploit halt/clear subchannel support Cornelia Huck
2018-05-09 15:49 ` [Qemu-devel] " Cornelia Huck
2018-05-09 15:49 ` [PATCH RFC 1/2] vfio-ccw: forward halt/clear to device if supported Cornelia Huck
2018-05-09 15:49   ` [Qemu-devel] " Cornelia Huck
2018-05-11  9:53   ` Pierre Morel
2018-05-11  9:53     ` [Qemu-devel] " Pierre Morel
2018-05-15 16:01     ` Cornelia Huck [this message]
2018-05-15 16:01       ` Cornelia Huck
2018-05-16 13:53       ` Pierre Morel
2018-05-16 13:53         ` [Qemu-devel] " Pierre Morel
2018-05-16 15:52         ` Cornelia Huck
2018-05-16 15:52           ` [Qemu-devel] " Cornelia Huck
2018-05-09 15:49 ` [PATCH RFC 2/2] s390/css: add some tracing for pass-through handling Cornelia Huck
2018-05-09 15:49   ` [Qemu-devel] " 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=20180515180104.646cba0c.cohuck@redhat.com \
    --to=cohuck@redhat.com \
    --cc=bjsdjshi@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=pasic@linux.ibm.com \
    --cc=pmorel@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.