s390/qdio: warn about unexpected SLSB states
authorJulian Wiedmann <jwi@linux.ibm.com>
Tue, 2 Jun 2020 12:26:36 +0000 (14:26 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 17 Jun 2020 21:05:05 +0000 (23:05 +0200)
The way we produce SBALs to the device (first update q->nr_buf_used,
then update the SLSB) should ensure that we never see some of the
SLSB states when scanning the queue for progress.
So make some noise if we do, this implies a bug in our SBAL tracking.

Also tweak the WARN msg to provide more information.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
drivers/s390/cio/qdio_main.c

index f42129c..0c919a1 100644 (file)
@@ -503,15 +503,18 @@ static int get_inbound_buffer_frontier(struct qdio_q *q, unsigned int start)
                        account_sbals_error(q, count);
                return count;
        case SLSB_CU_INPUT_EMPTY:
-       case SLSB_P_INPUT_NOT_INIT:
-       case SLSB_P_INPUT_ACK:
                if (q->irq_ptr->perf_stat_enabled)
                        q->q_stats.nr_sbal_nop++;
                DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in nop:%1d %#02x",
                              q->nr, start);
                return 0;
+       case SLSB_P_INPUT_NOT_INIT:
+       case SLSB_P_INPUT_ACK:
+               /* We should never see this state, throw a WARN: */
        default:
-               WARN_ON_ONCE(1);
+               dev_WARN_ONCE(&q->irq_ptr->cdev->dev, 1,
+                             "found state %#x at index %u on queue %u\n",
+                             state, start, q->nr);
                return 0;
        }
 }
@@ -716,11 +719,14 @@ static int get_outbound_buffer_frontier(struct qdio_q *q, unsigned int start)
                DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "out primed:%1d",
                              q->nr);
                return 0;
-       case SLSB_P_OUTPUT_NOT_INIT:
        case SLSB_P_OUTPUT_HALTED:
                return 0;
+       case SLSB_P_OUTPUT_NOT_INIT:
+               /* We should never see this state, throw a WARN: */
        default:
-               WARN_ON_ONCE(1);
+               dev_WARN_ONCE(&q->irq_ptr->cdev->dev, 1,
+                             "found state %#x at index %u on queue %u\n",
+                             state, start, q->nr);
                return 0;
        }
 }