| From 3317785a8803db629efc759d811d0f589d3a0b2d Mon Sep 17 00:00:00 2001 |
| From: Harald Freudenberger <freude@linux.ibm.com> |
| Date: Mon, 19 Jan 2026 10:37:28 +0100 |
| Subject: s390/ap: Fix wrong APQN fill calculation |
| |
| From: Harald Freudenberger <freude@linux.ibm.com> |
| |
| commit 3317785a8803db629efc759d811d0f589d3a0b2d upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/s390/crypto/ap_card.c | 2 +- |
| drivers/s390/crypto/ap_queue.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/s390/crypto/ap_card.c |
| +++ b/drivers/s390/crypto/ap_card.c |
| @@ -44,7 +44,7 @@ static ssize_t depth_show(struct device |
| { |
| 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); |
| --- a/drivers/s390/crypto/ap_queue.c |
| +++ b/drivers/s390/crypto/ap_queue.c |
| @@ -269,7 +269,7 @@ static enum ap_sm_wait ap_sm_write(struc |
| 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; |
| } |