diff mbox series

[1/1] vfio-ccw: Enable transparent CCW IPL from DASD

Message ID 20200417183838.11796-2-jrossi@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series vfio-ccw: Enable transparent CCW IPL from DASD | expand

Commit Message

Jared Rossi April 17, 2020, 6:38 p.m. UTC
Remove the explicit prefetch check when using vfio-ccw devices.
This check is not needed as all Linux channel programs are intended
to use prefetch and will be executed in the same way regardless.

Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
---
 hw/vfio/ccw.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

Comments

Cornelia Huck April 20, 2020, 12:26 p.m. UTC | #1
On Fri, 17 Apr 2020 14:38:38 -0400
Jared Rossi <jrossi@linux.ibm.com> wrote:

> Remove the explicit prefetch check when using vfio-ccw devices.
> This check is not needed as all Linux channel programs are intended
> to use prefetch and will be executed in the same way regardless.

As already commented on the Linux patch: Can we log something, so this
is debuggable if this statement does not hold true in the future?

> 
> Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
> ---
>  hw/vfio/ccw.c | 13 +++----------
>  1 file changed, 3 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> index 50cc2ec75c..e649377b68 100644
> --- a/hw/vfio/ccw.c
> +++ b/hw/vfio/ccw.c
> @@ -74,16 +74,9 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
>      struct ccw_io_region *region = vcdev->io_region;
>      int ret;
>  
> -    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) {
> -        if (!(vcdev->force_orb_pfch)) {
> -            warn_once_pfch(vcdev, sch, "requires PFCH flag set");
> -            sch_gen_unit_exception(sch);
> -            css_inject_io_interrupt(sch);
> -            return IOINST_CC_EXPECTED;
> -        } else {
> -            sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
> -            warn_once_pfch(vcdev, sch, "PFCH flag forced");
> -        }
> +    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH) && vcdev->force_orb_pfch) {
> +        sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
> +        warn_once_pfch(vcdev, sch, "PFCH flag forced");
>      }

What happens when you run it with an old kernel? I guess the I/O is
only rejected later (after a trip into the kernel), but has that path
ever been tested?

>  
>      QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB));
Cornelia Huck April 20, 2020, 12:29 p.m. UTC | #2
On Mon, 20 Apr 2020 14:26:17 +0200
Cornelia Huck <cohuck@redhat.com> wrote:

> On Fri, 17 Apr 2020 14:38:38 -0400
> Jared Rossi <jrossi@linux.ibm.com> wrote:
> 
> > Remove the explicit prefetch check when using vfio-ccw devices.
> > This check is not needed as all Linux channel programs are intended
> > to use prefetch and will be executed in the same way regardless.  
> 
> As already commented on the Linux patch: Can we log something, so this
> is debuggable if this statement does not hold true in the future?
> 
> > 
> > Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
> > ---
> >  hw/vfio/ccw.c | 13 +++----------
> >  1 file changed, 3 insertions(+), 10 deletions(-)
> > 
> > diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> > index 50cc2ec75c..e649377b68 100644
> > --- a/hw/vfio/ccw.c
> > +++ b/hw/vfio/ccw.c
> > @@ -74,16 +74,9 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
> >      struct ccw_io_region *region = vcdev->io_region;
> >      int ret;
> >  
> > -    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) {
> > -        if (!(vcdev->force_orb_pfch)) {
> > -            warn_once_pfch(vcdev, sch, "requires PFCH flag set");
> > -            sch_gen_unit_exception(sch);
> > -            css_inject_io_interrupt(sch);
> > -            return IOINST_CC_EXPECTED;
> > -        } else {
> > -            sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
> > -            warn_once_pfch(vcdev, sch, "PFCH flag forced");
> > -        }
> > +    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH) && vcdev->force_orb_pfch) {
> > +        sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
> > +        warn_once_pfch(vcdev, sch, "PFCH flag forced");
> >      }  
> 
> What happens when you run it with an old kernel? I guess the I/O is
> only rejected later (after a trip into the kernel), but has that path
> ever been tested?
> 
> >  
> >      QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB));  
> 

Oh, and do we want to deprecate the force prefetch interface in the
future? We probably need to wait a bit, until the kernel changes have
become widely available.
Jared Rossi April 20, 2020, 10:35 p.m. UTC | #3
On 2020-04-20 08:29, Cornelia Huck wrote:
> On Mon, 20 Apr 2020 14:26:17 +0200
> Cornelia Huck <cohuck@redhat.com> wrote:
> 
>> On Fri, 17 Apr 2020 14:38:38 -0400
>> Jared Rossi <jrossi@linux.ibm.com> wrote:
>> 
>> > Remove the explicit prefetch check when using vfio-ccw devices.
>> > This check is not needed as all Linux channel programs are intended
>> > to use prefetch and will be executed in the same way regardless.
>> 
>> As already commented on the Linux patch: Can we log something, so this
>> is debuggable if this statement does not hold true in the future?
>> 

Agreed.  I will work on debugging improvements so that any future issues
related to unintended prefetching are more clearly logged.

>> >
>> > Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
>> > ---
>> >  hw/vfio/ccw.c | 13 +++----------
>> >  1 file changed, 3 insertions(+), 10 deletions(-)
>> >
>> > diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
>> > index 50cc2ec75c..e649377b68 100644
>> > --- a/hw/vfio/ccw.c
>> > +++ b/hw/vfio/ccw.c
>> > @@ -74,16 +74,9 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
>> >      struct ccw_io_region *region = vcdev->io_region;
>> >      int ret;
>> >
>> > -    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) {
>> > -        if (!(vcdev->force_orb_pfch)) {
>> > -            warn_once_pfch(vcdev, sch, "requires PFCH flag set");
>> > -            sch_gen_unit_exception(sch);
>> > -            css_inject_io_interrupt(sch);
>> > -            return IOINST_CC_EXPECTED;
>> > -        } else {
>> > -            sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
>> > -            warn_once_pfch(vcdev, sch, "PFCH flag forced");
>> > -        }
>> > +    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH) && vcdev->force_orb_pfch) {
>> > +        sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
>> > +        warn_once_pfch(vcdev, sch, "PFCH flag forced");
>> >      }
>> 
>> What happens when you run it with an old kernel? I guess the I/O is
>> only rejected later (after a trip into the kernel), but has that path
>> ever been tested?
>> 

Yes, this was tested and you are correct that the kernel will reject the 
I/O unless
the corresponding patch is also applied there.  I will revisit this path 
while I'm
updating the logging to ensure that any potential interactions are 
appropriately
considered.

>> >
>> >      QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB));
>> 
> 
> Oh, and do we want to deprecate the force prefetch interface in the
> future? We probably need to wait a bit, until the kernel changes have
> become widely available.

Yes, I think we will want to deprecate it at an appropriate time in the 
future.
Cornelia Huck April 21, 2020, 8:29 a.m. UTC | #4
On Mon, 20 Apr 2020 18:35:58 -0400
Jared Rossi <jrossi@linux.ibm.com> wrote:

> On 2020-04-20 08:29, Cornelia Huck wrote:
> > On Mon, 20 Apr 2020 14:26:17 +0200
> > Cornelia Huck <cohuck@redhat.com> wrote:
> >   
> >> On Fri, 17 Apr 2020 14:38:38 -0400
> >> Jared Rossi <jrossi@linux.ibm.com> wrote:
> >>   
> >> > Remove the explicit prefetch check when using vfio-ccw devices.
> >> > This check is not needed as all Linux channel programs are intended
> >> > to use prefetch and will be executed in the same way regardless.  
> >> 
> >> As already commented on the Linux patch: Can we log something, so this
> >> is debuggable if this statement does not hold true in the future?
> >>   
> 
> Agreed.  I will work on debugging improvements so that any future issues
> related to unintended prefetching are more clearly logged.

Great.

> 
> >> >
> >> > Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
> >> > ---
> >> >  hw/vfio/ccw.c | 13 +++----------
> >> >  1 file changed, 3 insertions(+), 10 deletions(-)
> >> >
> >> > diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> >> > index 50cc2ec75c..e649377b68 100644
> >> > --- a/hw/vfio/ccw.c
> >> > +++ b/hw/vfio/ccw.c
> >> > @@ -74,16 +74,9 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
> >> >      struct ccw_io_region *region = vcdev->io_region;
> >> >      int ret;
> >> >
> >> > -    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) {
> >> > -        if (!(vcdev->force_orb_pfch)) {
> >> > -            warn_once_pfch(vcdev, sch, "requires PFCH flag set");
> >> > -            sch_gen_unit_exception(sch);
> >> > -            css_inject_io_interrupt(sch);
> >> > -            return IOINST_CC_EXPECTED;
> >> > -        } else {
> >> > -            sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
> >> > -            warn_once_pfch(vcdev, sch, "PFCH flag forced");
> >> > -        }
> >> > +    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH) && vcdev->force_orb_pfch) {
> >> > +        sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
> >> > +        warn_once_pfch(vcdev, sch, "PFCH flag forced");
> >> >      }  
> >> 
> >> What happens when you run it with an old kernel? I guess the I/O is
> >> only rejected later (after a trip into the kernel), but has that path
> >> ever been tested?
> >>   
> 
> Yes, this was tested and you are correct that the kernel will reject the 
> I/O unless
> the corresponding patch is also applied there.  I will revisit this path 
> while I'm
> updating the logging to ensure that any potential interactions are 
> appropriately
> considered.

I've looked at the code again and it seems that the kernel will end up
signaling -EOPNOTSUPP to us on that case, which causes the same unit
exception as without this patch, so we should be all good.

> 
> >> >
> >> >      QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB));  
> >>   
> > 
> > Oh, and do we want to deprecate the force prefetch interface in the
> > future? We probably need to wait a bit, until the kernel changes have
> > become widely available.  
> 
> Yes, I think we will want to deprecate it at an appropriate time in the 
> future.
>
diff mbox series

Patch

diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index 50cc2ec75c..e649377b68 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -74,16 +74,9 @@  static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
     struct ccw_io_region *region = vcdev->io_region;
     int ret;
 
-    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) {
-        if (!(vcdev->force_orb_pfch)) {
-            warn_once_pfch(vcdev, sch, "requires PFCH flag set");
-            sch_gen_unit_exception(sch);
-            css_inject_io_interrupt(sch);
-            return IOINST_CC_EXPECTED;
-        } else {
-            sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
-            warn_once_pfch(vcdev, sch, "PFCH flag forced");
-        }
+    if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH) && vcdev->force_orb_pfch) {
+        sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
+        warn_once_pfch(vcdev, sch, "PFCH flag forced");
     }
 
     QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB));