diff mbox series

[v3,2/7] s390x/css: IO instr handler ending control

Message ID 20171017140453.51099-3-pasic@linux.vnet.ibm.com
State New
Headers show
Series improve error handling for IO instr | expand

Commit Message

Halil Pasic Oct. 17, 2017, 2:04 p.m. UTC
CSS code needs to tell the IO instruction handlers located in how should
the emulated instruction be ended. Currently this is done by returning
generic (POSIX) error codes, and mapping them to outcomes like condition
codes. This makes bugs easy to create and hard to recognise.

As a preparation for moving a way form (mis)using generic error codes for
flow control let us introduce a type which tells the instruction
handler function how to end the instruction, in a more straight-forward
and less ambiguous way.

Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
---
 include/hw/s390x/css.h | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

Comments

Cornelia Huck Oct. 17, 2017, 2:58 p.m. UTC | #1
On Tue, 17 Oct 2017 16:04:48 +0200
Halil Pasic <pasic@linux.vnet.ibm.com> wrote:

> CSS code needs to tell the IO instruction handlers located in how should
> the emulated instruction be ended. Currently this is done by returning
> generic (POSIX) error codes, and mapping them to outcomes like condition
> codes. This makes bugs easy to create and hard to recognise.
> 
> As a preparation for moving a way form (mis)using generic error codes for

s/form/from/

> flow control let us introduce a type which tells the instruction
> handler function how to end the instruction, in a more straight-forward
> and less ambiguous way.
> 
> Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
> ---
>  include/hw/s390x/css.h | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> index 69b374730e..7e0dbd162f 100644
> --- a/include/hw/s390x/css.h
> +++ b/include/hw/s390x/css.h
> @@ -99,6 +99,22 @@ typedef struct CcwDataStream {
>      hwaddr cda;
>  } CcwDataStream;
>  
> +/*
> + * IO instructions conclude according this. Currently we have only

s/this/to this/

> + * cc codes. Valid values are 0,1,2,3 and the generic semantic for

blanks between numbers?

> + * IO instructions is described briefly. For more details consult the PoP.
> + */
> +typedef enum IOInstEnding {
> +    /* produced expected result */
> +    IOINST_CC_EXPECTED = 0,
> +    /* status conditions were present or produced alternate result */
> +    IOINST_CC_STATUS_PRESENT = 1,
> +    /* inst. ineffective because busy with previously initiated function */
> +    IOINST_CC_BUSY = 2,
> +    /* inst. ineffective because not operational */
> +    IOINST_CC_NOT_OPERATIONAL = 3
> +} IOInstEnding;

This looks a bit odd for some I/O instructions (STCRW, TPI, TSCH), but
is fine for the others. But as the PoP also defines the meanings as
above, it should be fine (and not confusing).

> +
>  typedef struct SubchDev SubchDev;
>  struct SubchDev {
>      /* channel-subsystem related things: */
Halil Pasic Oct. 17, 2017, 4:13 p.m. UTC | #2
On 10/17/2017 04:58 PM, Cornelia Huck wrote:
> On Tue, 17 Oct 2017 16:04:48 +0200
> Halil Pasic <pasic@linux.vnet.ibm.com> wrote:
> 
>> CSS code needs to tell the IO instruction handlers located in how should
>> the emulated instruction be ended. Currently this is done by returning
>> generic (POSIX) error codes, and mapping them to outcomes like condition
>> codes. This makes bugs easy to create and hard to recognise.

also
s/recognise/recognize/

To on mix American and British.

>>
>> As a preparation for moving a way form (mis)using generic error codes for
> 
> s/form/from/
> 

Sorry this seems to be a recurring typo of me (not detected by spell check
because both valid).

>> flow control let us introduce a type which tells the instruction
>> handler function how to end the instruction, in a more straight-forward
>> and less ambiguous way.
>>
>> Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
>> ---
>>  include/hw/s390x/css.h | 16 ++++++++++++++++
>>  1 file changed, 16 insertions(+)
>>
>> diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
>> index 69b374730e..7e0dbd162f 100644
>> --- a/include/hw/s390x/css.h
>> +++ b/include/hw/s390x/css.h
>> @@ -99,6 +99,22 @@ typedef struct CcwDataStream {
>>      hwaddr cda;
>>  } CcwDataStream;
>>  
>> +/*
>> + * IO instructions conclude according this. Currently we have only
> 
> s/this/to this/
> 
>> + * cc codes. Valid values are 0,1,2,3 and the generic semantic for
> 
> blanks between numbers?

Overrated. Just joking. Definitely blanks between numbers.

> 
>> + * IO instructions is described briefly. For more details consult the PoP.
>> + */
>> +typedef enum IOInstEnding {
>> +    /* produced expected result */
>> +    IOINST_CC_EXPECTED = 0,
>> +    /* status conditions were present or produced alternate result */
>> +    IOINST_CC_STATUS_PRESENT = 1,
>> +    /* inst. ineffective because busy with previously initiated function */
>> +    IOINST_CC_BUSY = 2,
>> +    /* inst. ineffective because not operational */
>> +    IOINST_CC_NOT_OPERATIONAL = 3
>> +} IOInstEnding;
> 
> This looks a bit odd for some I/O instructions (STCRW, TPI, TSCH), but
> is fine for the others. But as the PoP also defines the meanings as
> above, it should be fine (and not confusing).

Yeah. The original idea was to keep stuff abstract, but I decided
to go with the names carrying meaning because Thomas seems to
be more reliable than me when it comes to matters of taste, and also
for consistency with SIGP_CC_*. I think, in the end it does not matter
that much.

> 
>> +
>>  typedef struct SubchDev SubchDev;
>>  struct SubchDev {
>>      /* channel-subsystem related things: */
> 
>
Thomas Huth Oct. 18, 2017, 8:45 a.m. UTC | #3
On 17.10.2017 16:04, Halil Pasic wrote:
> CSS code needs to tell the IO instruction handlers located in how should

locate in? ... sorry, I've got trouble to parse this sentence ...

> the emulated instruction be ended. Currently this is done by returning
> generic (POSIX) error codes, and mapping them to outcomes like condition
> codes. This makes bugs easy to create and hard to recognise.
> 
> As a preparation for moving a way form (mis)using generic error codes for

s/a way/away/ ?

> flow control let us introduce a type which tells the instruction
> handler function how to end the instruction, in a more straight-forward
> and less ambiguous way.
> 
> Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
> ---
>  include/hw/s390x/css.h | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> index 69b374730e..7e0dbd162f 100644
> --- a/include/hw/s390x/css.h
> +++ b/include/hw/s390x/css.h
> @@ -99,6 +99,22 @@ typedef struct CcwDataStream {
>      hwaddr cda;
>  } CcwDataStream;
>  
> +/*
> + * IO instructions conclude according this. Currently we have only

Maybe rather "terminate like this" or "finish like this"? I'm not a
native speaker, but "conclude" sounds a little bit strange to me here.

> + * 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.
> + */
> +typedef enum IOInstEnding {
> +    /* produced expected result */
> +    IOINST_CC_EXPECTED = 0,
> +    /* status conditions were present or produced alternate result */
> +    IOINST_CC_STATUS_PRESENT = 1,
> +    /* inst. ineffective because busy with previously initiated function */
> +    IOINST_CC_BUSY = 2,
> +    /* inst. ineffective because not operational */
> +    IOINST_CC_NOT_OPERATIONAL = 3
> +} IOInstEnding;
> +
>  typedef struct SubchDev SubchDev;
>  struct SubchDev {
>      /* channel-subsystem related things: */
> 

With the patch description fixed:

Reviewed-by: Thomas Huth <thuth@redhat.com>
Dong Jia Shi Oct. 18, 2017, 9:13 a.m. UTC | #4
* Halil Pasic <pasic@linux.vnet.ibm.com> [2017-10-17 16:04:48 +0200]:

[...]

> diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> index 69b374730e..7e0dbd162f 100644
> --- a/include/hw/s390x/css.h
> +++ b/include/hw/s390x/css.h
> @@ -99,6 +99,22 @@ typedef struct CcwDataStream {
>      hwaddr cda;
>  } CcwDataStream;
> 
> +/*
> + * IO instructions conclude according this. Currently we have only
> + * 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.
> + */
> +typedef enum IOInstEnding {
> +    /* produced expected result */
> +    IOINST_CC_EXPECTED = 0,
> +    /* status conditions were present or produced alternate result */
> +    IOINST_CC_STATUS_PRESENT = 1,
> +    /* inst. ineffective because busy with previously initiated function */
> +    IOINST_CC_BUSY = 2,
> +    /* inst. ineffective because not operational */
> +    IOINST_CC_NOT_OPERATIONAL = 3
> +} IOInstEnding;
> +
>  typedef struct SubchDev SubchDev;
>  struct SubchDev {
>      /* channel-subsystem related things: */
> -- 
> 2.13.5
> 

With what has been pointed out by Conny and Thomas addressed:
Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Cornelia Huck Oct. 18, 2017, 9:34 a.m. UTC | #5
On Wed, 18 Oct 2017 10:45:28 +0200
Thomas Huth <thuth@redhat.com> wrote:

> On 17.10.2017 16:04, Halil Pasic wrote:
> > CSS code needs to tell the IO instruction handlers located in how should  
> 
> locate in? ... sorry, I've got trouble to parse this sentence ...

"located in ioinst.c", I guess.

And maybe also move "should" a bit later in the sentence.

> 
> > the emulated instruction be ended. Currently this is done by returning
> > generic (POSIX) error codes, and mapping them to outcomes like condition
> > codes. This makes bugs easy to create and hard to recognise.
> > 
> > As a preparation for moving a way form (mis)using generic error codes for  
> 
> s/a way/away/ ?

I can fix that up as well.

> 
> > flow control let us introduce a type which tells the instruction
> > handler function how to end the instruction, in a more straight-forward
> > and less ambiguous way.
> > 
> > Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
> > ---
> >  include/hw/s390x/css.h | 16 ++++++++++++++++
> >  1 file changed, 16 insertions(+)
> > 
> > diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> > index 69b374730e..7e0dbd162f 100644
> > --- a/include/hw/s390x/css.h
> > +++ b/include/hw/s390x/css.h
> > @@ -99,6 +99,22 @@ typedef struct CcwDataStream {
> >      hwaddr cda;
> >  } CcwDataStream;
> >  
> > +/*
> > + * IO instructions conclude according this. Currently we have only  
> 
> Maybe rather "terminate like this" or "finish like this"? I'm not a
> native speaker, but "conclude" sounds a little bit strange to me here.

I do remember reading "conclude" in various places in s390
documentation, so I think I'll keep this.

> 
> > + * 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.
> > + */
> > +typedef enum IOInstEnding {
> > +    /* produced expected result */
> > +    IOINST_CC_EXPECTED = 0,
> > +    /* status conditions were present or produced alternate result */
> > +    IOINST_CC_STATUS_PRESENT = 1,
> > +    /* inst. ineffective because busy with previously initiated function */
> > +    IOINST_CC_BUSY = 2,
> > +    /* inst. ineffective because not operational */
> > +    IOINST_CC_NOT_OPERATIONAL = 3
> > +} IOInstEnding;
> > +
> >  typedef struct SubchDev SubchDev;
> >  struct SubchDev {
> >      /* channel-subsystem related things: */
> >   
> 
> With the patch description fixed:
> 
> Reviewed-by: Thomas Huth <thuth@redhat.com>
diff mbox series

Patch

diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
index 69b374730e..7e0dbd162f 100644
--- a/include/hw/s390x/css.h
+++ b/include/hw/s390x/css.h
@@ -99,6 +99,22 @@  typedef struct CcwDataStream {
     hwaddr cda;
 } CcwDataStream;
 
+/*
+ * IO instructions conclude according this. Currently we have only
+ * 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.
+ */
+typedef enum IOInstEnding {
+    /* produced expected result */
+    IOINST_CC_EXPECTED = 0,
+    /* status conditions were present or produced alternate result */
+    IOINST_CC_STATUS_PRESENT = 1,
+    /* inst. ineffective because busy with previously initiated function */
+    IOINST_CC_BUSY = 2,
+    /* inst. ineffective because not operational */
+    IOINST_CC_NOT_OPERATIONAL = 3
+} IOInstEnding;
+
 typedef struct SubchDev SubchDev;
 struct SubchDev {
     /* channel-subsystem related things: */