Blob Blame History Raw
From: Harald Freudenberger <freude@linux.vnet.ibm.com>
Subject: s390/zcrypt: Fix wrong comparison leading to strange load balancing
Patch-mainline: v4.15-rc2
Git-commit: 0b0882672640ced4deeebf84da0b88b6389619c4
References: FATE#325695, LTC#146006, bsc#1113519

Summary:     kernel: zcrypt: Exploitation Support for CEX6S
Description: Exploitation Support for CEX6S crypto cards

Upstream-Description:

             s390/zcrypt: Fix wrong comparison leading to strange load balancing

             The function to decide if one zcrypt queue is better than
             another one compared two pointers instead of comparing the
             values where the pointers refer to. So within the same
             zcrypt card when load of each queue was equal just one queue
             was used. This effect only appears on relatively lite load,
             typically with one thread applications.

             This patch fixes the wrong comparison and now the counters
             show that requests are balanced equally over all available
             queues within the cards.

             There is no performance improvement coming with this fix.
             As long as the queue depth for an APQN queue is not touched,
             processing is not faster when requests are spread over
             queues within the same card hardware. So this fix only
             beautifies the lszcrypt counter printouts.

             Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
             Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/s390/crypto/zcrypt_api.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/s390/crypto/zcrypt_api.c
+++ b/drivers/s390/crypto/zcrypt_api.c
@@ -218,8 +218,8 @@ static inline bool zcrypt_queue_compare(
 	weight += atomic_read(&zq->load);
 	pref_weight += atomic_read(&pref_zq->load);
 	if (weight == pref_weight)
-		return &zq->queue->total_request_count >
-			&pref_zq->queue->total_request_count;
+		return zq->queue->total_request_count >
+			pref_zq->queue->total_request_count;
 	return weight > pref_weight;
 }