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:
parent
5a6477eaf4
commit
753d677087
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue