s390/zcrypt: fix card and queue total counter wrap
The internal statistic counters for the total number of requests processed per card and per queue used integers. So they do wrap after a rather huge amount of crypto requests processed. This patch introduces uint64 counters which should hold much longer but still may wrap. The sysfs attributes request_count for card and queue also used only %ld and now display the counter value with %llu. This is not a security relevant fix. The int overflow which happened is not in any way exploitable as a security breach. Signed-off-by: Harald Freudenberger <freude@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:

committed by
Vasily Gorbik

parent
aab73d278d
commit
fcd98d4002
@@ -606,8 +606,8 @@ static inline bool zcrypt_card_compare(struct zcrypt_card *zc,
|
||||
weight += atomic_read(&zc->load);
|
||||
pref_weight += atomic_read(&pref_zc->load);
|
||||
if (weight == pref_weight)
|
||||
return atomic_read(&zc->card->total_request_count) >
|
||||
atomic_read(&pref_zc->card->total_request_count);
|
||||
return atomic64_read(&zc->card->total_request_count) >
|
||||
atomic64_read(&pref_zc->card->total_request_count);
|
||||
return weight > pref_weight;
|
||||
}
|
||||
|
||||
@@ -1226,11 +1226,12 @@ static void zcrypt_qdepth_mask(char qdepth[], size_t max_adapters)
|
||||
spin_unlock(&zcrypt_list_lock);
|
||||
}
|
||||
|
||||
static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters)
|
||||
static void zcrypt_perdev_reqcnt(u32 reqcnt[], size_t max_adapters)
|
||||
{
|
||||
struct zcrypt_card *zc;
|
||||
struct zcrypt_queue *zq;
|
||||
int card;
|
||||
u64 cnt;
|
||||
|
||||
memset(reqcnt, 0, sizeof(int) * max_adapters);
|
||||
spin_lock(&zcrypt_list_lock);
|
||||
@@ -1242,8 +1243,9 @@ static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters)
|
||||
|| card >= max_adapters)
|
||||
continue;
|
||||
spin_lock(&zq->queue->lock);
|
||||
reqcnt[card] = zq->queue->total_request_count;
|
||||
cnt = zq->queue->total_request_count;
|
||||
spin_unlock(&zq->queue->lock);
|
||||
reqcnt[card] = (cnt < UINT_MAX) ? (u32) cnt : UINT_MAX;
|
||||
}
|
||||
}
|
||||
local_bh_enable();
|
||||
@@ -1421,9 +1423,9 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
|
||||
return 0;
|
||||
}
|
||||
case ZCRYPT_PERDEV_REQCNT: {
|
||||
int *reqcnt;
|
||||
u32 *reqcnt;
|
||||
|
||||
reqcnt = kcalloc(AP_DEVICES, sizeof(int), GFP_KERNEL);
|
||||
reqcnt = kcalloc(AP_DEVICES, sizeof(u32), GFP_KERNEL);
|
||||
if (!reqcnt)
|
||||
return -ENOMEM;
|
||||
zcrypt_perdev_reqcnt(reqcnt, AP_DEVICES);
|
||||
@@ -1480,7 +1482,7 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
|
||||
}
|
||||
case Z90STAT_PERDEV_REQCNT: {
|
||||
/* the old ioctl supports only 64 adapters */
|
||||
int reqcnt[MAX_ZDEV_CARDIDS];
|
||||
u32 reqcnt[MAX_ZDEV_CARDIDS];
|
||||
|
||||
zcrypt_perdev_reqcnt(reqcnt, MAX_ZDEV_CARDIDS);
|
||||
if (copy_to_user((int __user *) arg, reqcnt, sizeof(reqcnt)))
|
||||
|
Reference in New Issue
Block a user