hwrng: cn10k - Optimize cn10k_rng_read()
authorVladis Dronov <vdronov@redhat.com>
Wed, 13 Apr 2022 14:16:05 +0000 (16:16 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 21 Apr 2022 09:53:54 +0000 (17:53 +0800)
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: 38e9791a0209 ("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>
drivers/char/hw_random/cn10k-rng.c

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