[5/7] s390/vfio_ap: fix handling of error response codes

Message ID 20221213154437.15480-6-akrowiak@linux.ibm.com
State New
Headers
Series improve AP queue reset processing |

Commit Message

Anthony Krowiak Dec. 13, 2022, 3:44 p.m. UTC
  Some response codes returned from the queue reset function are not being
handled correctly; this patch fixes them:

1. Response code 3, AP queue deconfigured: Deconfiguring an AP adapter
   resets all of its queues, so this is handled by indicating the reset
   verification completed successfully.

2. For all response codes other than 0 (normal reset completion), 2
   (queue reset in progress) and 3 (AP deconfigured), the -EIO error will
   be returned from the vfio_ap_mdev_reset_queue() function. In all cases,
   all fields of the status word other than the response code will be
   set to zero, so it makes no sense to check status bits.

Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
---
 drivers/s390/crypto/vfio_ap_ops.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)
  

Comments

Harald Freudenberger Dec. 15, 2022, 10:56 a.m. UTC | #1
On 2022-12-13 16:44, Tony Krowiak wrote:
> Some response codes returned from the queue reset function are not 
> being
> handled correctly; this patch fixes them:
> 
> 1. Response code 3, AP queue deconfigured: Deconfiguring an AP adapter
>    resets all of its queues, so this is handled by indicating the reset
>    verification completed successfully.
> 
> 2. For all response codes other than 0 (normal reset completion), 2
>    (queue reset in progress) and 3 (AP deconfigured), the -EIO error 
> will
>    be returned from the vfio_ap_mdev_reset_queue() function. In all 
> cases,
>    all fields of the status word other than the response code will be
>    set to zero, so it makes no sense to check status bits.
> 
> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
> ---
>  drivers/s390/crypto/vfio_ap_ops.c | 17 +++++++----------
>  1 file changed, 7 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/s390/crypto/vfio_ap_ops.c
> b/drivers/s390/crypto/vfio_ap_ops.c
> index c0cf5050be59..dbf681715a6d 100644
> --- a/drivers/s390/crypto/vfio_ap_ops.c
> +++ b/drivers/s390/crypto/vfio_ap_ops.c
> @@ -1659,17 +1659,15 @@ static int vfio_ap_mdev_reset_queue(struct
> vfio_ap_queue *q)
>  		if (ret)
>  			break;
>  		goto retry_zapq;
> -	case AP_RESPONSE_Q_NOT_AVAIL:
>  	case AP_RESPONSE_DECONFIGURED:
> -	case AP_RESPONSE_CHECKSTOPPED:
> -		WARN_ONCE(status.irq_enabled,
> -			  "PQAP/ZAPQ for %02x.%04x failed with rc=%u while IRQ enabled",
> -			  AP_QID_CARD(q->apqn), AP_QID_QUEUE(q->apqn),
> -			  status.response_code);
> -		ret = -EBUSY;
> -		goto free_resources;
> +		/*
> +		 * When an AP adapter is deconfigured, the associated
> +		 * queues are reset, so let's return a value indicating the reset
> +		 * completed successfully.
> +		 */
> +		ret = 0;
> +		break;
>  	default:
> -		/* things are really broken, give up */
>  		WARN(true,
>  		     "PQAP/ZAPQ for %02x.%04x failed with invalid rc=%u\n",
>  		     AP_QID_CARD(q->apqn), AP_QID_QUEUE(q->apqn),
> @@ -1677,7 +1675,6 @@ static int vfio_ap_mdev_reset_queue(struct
> vfio_ap_queue *q)
>  		return -EIO;
>  	}
> 
> -free_resources:
>  	vfio_ap_free_aqic_resources(q);
> 
>  	return ret;

Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>
  
Anthony Krowiak Dec. 20, 2022, 2:25 p.m. UTC | #2
On 12/15/22 5:56 AM, Harald Freudenberger wrote:
> On 2022-12-13 16:44, Tony Krowiak wrote:
>> Some response codes returned from the queue reset function are not being
>> handled correctly; this patch fixes them:
>>
>> 1. Response code 3, AP queue deconfigured: Deconfiguring an AP adapter
>>    resets all of its queues, so this is handled by indicating the reset
>>    verification completed successfully.
>>
>> 2. For all response codes other than 0 (normal reset completion), 2
>>    (queue reset in progress) and 3 (AP deconfigured), the -EIO error 
>> will
>>    be returned from the vfio_ap_mdev_reset_queue() function. In all 
>> cases,
>>    all fields of the status word other than the response code will be
>>    set to zero, so it makes no sense to check status bits.
>>
>> Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
>> ---
>>  drivers/s390/crypto/vfio_ap_ops.c | 17 +++++++----------
>>  1 file changed, 7 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/s390/crypto/vfio_ap_ops.c
>> b/drivers/s390/crypto/vfio_ap_ops.c
>> index c0cf5050be59..dbf681715a6d 100644
>> --- a/drivers/s390/crypto/vfio_ap_ops.c
>> +++ b/drivers/s390/crypto/vfio_ap_ops.c
>> @@ -1659,17 +1659,15 @@ static int vfio_ap_mdev_reset_queue(struct
>> vfio_ap_queue *q)
>>          if (ret)
>>              break;
>>          goto retry_zapq;
>> -    case AP_RESPONSE_Q_NOT_AVAIL:
>>      case AP_RESPONSE_DECONFIGURED:
>> -    case AP_RESPONSE_CHECKSTOPPED:
>> -        WARN_ONCE(status.irq_enabled,
>> -              "PQAP/ZAPQ for %02x.%04x failed with rc=%u while IRQ 
>> enabled",
>> -              AP_QID_CARD(q->apqn), AP_QID_QUEUE(q->apqn),
>> -              status.response_code);
>> -        ret = -EBUSY;
>> -        goto free_resources;
>> +        /*
>> +         * When an AP adapter is deconfigured, the associated
>> +         * queues are reset, so let's return a value indicating the 
>> reset
>> +         * completed successfully.
>> +         */
>> +        ret = 0;
>> +        break;
>>      default:
>> -        /* things are really broken, give up */
>>          WARN(true,
>>               "PQAP/ZAPQ for %02x.%04x failed with invalid rc=%u\n",
>>               AP_QID_CARD(q->apqn), AP_QID_QUEUE(q->apqn),
>> @@ -1677,7 +1675,6 @@ static int vfio_ap_mdev_reset_queue(struct
>> vfio_ap_queue *q)
>>          return -EIO;
>>      }
>>
>> -free_resources:
>>      vfio_ap_free_aqic_resources(q);
>>
>>      return ret;
>
> Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>


Thanks for the review.
  

Patch

diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
index c0cf5050be59..dbf681715a6d 100644
--- a/drivers/s390/crypto/vfio_ap_ops.c
+++ b/drivers/s390/crypto/vfio_ap_ops.c
@@ -1659,17 +1659,15 @@  static int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q)
 		if (ret)
 			break;
 		goto retry_zapq;
-	case AP_RESPONSE_Q_NOT_AVAIL:
 	case AP_RESPONSE_DECONFIGURED:
-	case AP_RESPONSE_CHECKSTOPPED:
-		WARN_ONCE(status.irq_enabled,
-			  "PQAP/ZAPQ for %02x.%04x failed with rc=%u while IRQ enabled",
-			  AP_QID_CARD(q->apqn), AP_QID_QUEUE(q->apqn),
-			  status.response_code);
-		ret = -EBUSY;
-		goto free_resources;
+		/*
+		 * When an AP adapter is deconfigured, the associated
+		 * queues are reset, so let's return a value indicating the reset
+		 * completed successfully.
+		 */
+		ret = 0;
+		break;
 	default:
-		/* things are really broken, give up */
 		WARN(true,
 		     "PQAP/ZAPQ for %02x.%04x failed with invalid rc=%u\n",
 		     AP_QID_CARD(q->apqn), AP_QID_QUEUE(q->apqn),
@@ -1677,7 +1675,6 @@  static int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q)
 		return -EIO;
 	}
 
-free_resources:
 	vfio_ap_free_aqic_resources(q);
 
 	return ret;