s390/qdio: clean up AOB handling
authorJulian Wiedmann <jwi@linux.ibm.com>
Tue, 15 May 2018 19:17:38 +0000 (21:17 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 20 Sep 2018 11:20:29 +0000 (13:20 +0200)
I've stumbled over this too many times now... AOBs are only ever used on
Output Queues. So in qdio_kick_handler(), move the call to their handler
into the Output-only path, and get rid of the convoluted contains_aobs()
helper. No functional change.

While at it, also remove
1. the unused sbal_state->aob field. For processing an async completion,
   upper-layer drivers get their AOB pointer from the CQ buffer.
2. an unused EXPORT for qdio_allocate_aob(). External users would have
   no way of passing an allocated AOB back into qdio.ko anyways...

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/qdio.h
drivers/s390/cio/qdio_main.c
drivers/s390/cio/qdio_setup.c

index 9c9970a..d46edde 100644 (file)
@@ -252,13 +252,11 @@ struct slsb {
  *   (for communication with upper layer programs)
  *   (only required for use with completion queues)
  * @flags: flags indicating state of buffer
- * @aob: pointer to QAOB used for the particular SBAL
  * @user: pointer to upper layer program's state information related to SBAL
  *        (stored in user1 data of QAOB)
  */
 struct qdio_outbuf_state {
        u8 flags;
-       struct qaob *aob;
        void *user;
 };
 
index 9c7d9da..9537e65 100644 (file)
@@ -595,19 +595,11 @@ static inline int qdio_inbound_q_done(struct qdio_q *q)
                return 0;
 }
 
-static inline int contains_aobs(struct qdio_q *q)
-{
-       return !q->is_input_q && q->u.out.use_cq;
-}
-
 static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count)
 {
        unsigned char state = 0;
        int j, b = start;
 
-       if (!contains_aobs(q))
-               return;
-
        for (j = 0; j < count; ++j) {
                get_buf_state(q, b, &state, 0);
                if (state == SLSB_P_OUTPUT_PENDING) {
@@ -618,8 +610,6 @@ static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count)
                        q->u.out.sbal_state[b].flags |=
                                QDIO_OUTBUF_STATE_FLAG_PENDING;
                        q->u.out.aobs[b] = NULL;
-               } else if (state == SLSB_P_OUTPUT_EMPTY) {
-                       q->u.out.sbal_state[b].aob = NULL;
                }
                b = next_buf(b);
        }
@@ -638,7 +628,6 @@ static inline unsigned long qdio_aob_for_buffer(struct qdio_output_q *q,
                q->aobs[bufnr] = aob;
        }
        if (q->aobs[bufnr]) {
-               q->sbal_state[bufnr].aob = q->aobs[bufnr];
                q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user;
                phys_aob = virt_to_phys(q->aobs[bufnr]);
                WARN_ON_ONCE(phys_aob & 0xFF);
@@ -666,10 +655,10 @@ static void qdio_kick_handler(struct qdio_q *q)
                qperf_inc(q, outbound_handler);
                DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "koh: s:%02x c:%02x",
                              start, count);
+               if (q->u.out.use_cq)
+                       qdio_handle_aobs(q, start, count);
        }
 
-       qdio_handle_aobs(q, start, count);
-
        q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count,
                   q->irq_ptr->int_parm);
 
index 78f1be4..e324d89 100644 (file)
@@ -27,7 +27,6 @@ struct qaob *qdio_allocate_aob(void)
 {
        return kmem_cache_zalloc(qdio_aob_cache, GFP_ATOMIC);
 }
-EXPORT_SYMBOL_GPL(qdio_allocate_aob);
 
 void qdio_release_aob(struct qaob *aob)
 {