hwrng: cn10k - Optimize cn10k_rng_read()

This function assumes that sizeof(void) is 1 and arithmetic works for
void pointers. This is a GNU C extention and may not work with other
compilers. Change this by using an u8 pointer.

Also move cn10k_read_trng() out of a loop thus saving some cycles.

Fixes: 38e9791a02 ("hwrng: cn10k - Add random number generator support")
Signed-off-by: Vladis Dronov <vdronov@redhat.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Vladis Dronov 2022-04-13 16:16:05 +02:00 committed by Herbert Xu
parent 5a6477eaf4
commit 753d677087
1 changed files with 10 additions and 6 deletions

View File

@ -90,6 +90,7 @@ static int cn10k_rng_read(struct hwrng *hwrng, void *data,
{ {
struct cn10k_rng *rng = (struct cn10k_rng *)hwrng->priv; struct cn10k_rng *rng = (struct cn10k_rng *)hwrng->priv;
unsigned int size; unsigned int size;
u8 *pos = data;
int err = 0; int err = 0;
u64 value; u64 value;
@ -102,17 +103,20 @@ static int cn10k_rng_read(struct hwrng *hwrng, void *data,
while (size >= 8) { while (size >= 8) {
cn10k_read_trng(rng, &value); cn10k_read_trng(rng, &value);
*((u64 *)data) = (u64)value; *((u64 *)pos) = value;
size -= 8; size -= 8;
data += 8; pos += 8;
} }
while (size > 0) { if (size > 0) {
cn10k_read_trng(rng, &value); cn10k_read_trng(rng, &value);
*((u8 *)data) = (u8)value; while (size > 0) {
size--; *pos = (u8)value;
data++; value >>= 8;
size--;
pos++;
}
} }
return max - size; return max - size;