]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/ap: Fix wrong APQN fill calculation
authorHarald Freudenberger <freude@linux.ibm.com>
Mon, 19 Jan 2026 09:37:28 +0000 (10:37 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Tue, 20 Jan 2026 13:33:42 +0000 (14:33 +0100)
The upper limit of the firmware queue fill state for each APQN
is reported by the hwinfo.qd field. This field shows the
numbers 0-7 for 1-8 queue spaces available. But the exploiting
code assumed the real boundary is stored there and thus stoppes
queuing in messages one tick too early.

Correct the limit calculation and thus offer a boost
of 12.5% performance for high traffic on one APQN.

Fixes: d4c53ae8e4948 ("s390/ap: store TAPQ hwinfo in struct ap_card")
Cc: stable@vger.kernel.org
Reported-by: Ingo Franzki <ifranzki@linux.ibm.com>
Reviewed-by: Ingo Franzki <ifranzki@linux.ibm.com>
Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/crypto/ap_card.c
drivers/s390/crypto/ap_queue.c

index 8102c8134c49054763695393e066a96d7de387bd..8b0ad6f582ecb8d8fb9401119aabc9a13a79ce36 100644 (file)
@@ -43,7 +43,7 @@ static ssize_t depth_show(struct device *dev, struct device_attribute *attr,
 {
        struct ap_card *ac = to_ap_card(dev);
 
-       return sysfs_emit(buf, "%d\n", ac->hwinfo.qd);
+       return sysfs_emit(buf, "%d\n", ac->hwinfo.qd + 1);
 }
 
 static DEVICE_ATTR_RO(depth);
index 4a32c1e19a1e60bde62fb49d492631660cb2afa7..a80ab87cad62335886e25256a2239eedb1011eb2 100644 (file)
@@ -285,7 +285,7 @@ static enum ap_sm_wait ap_sm_write(struct ap_queue *aq)
                list_move_tail(&ap_msg->list, &aq->pendingq);
                aq->requestq_count--;
                aq->pendingq_count++;
-               if (aq->queue_count < aq->card->hwinfo.qd) {
+               if (aq->queue_count < aq->card->hwinfo.qd + 1) {
                        aq->sm_state = AP_SM_STATE_WORKING;
                        return AP_SM_WAIT_AGAIN;
                }