hwrng: optee - fix wait use case
authorJorge Ramirez-Ortiz <jorge@foundries.io>
Thu, 6 Aug 2020 10:00:10 +0000 (12:00 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 21 Aug 2020 04:45:28 +0000 (14:45 +1000)
The current code waits for data to be available before attempting a
second read. However the second read would not be executed as the
while loop will exit.

This fix does not wait if all data has been read (skips the call to
msleep(0)) and reads a second time if partial data was retrieved on
the first read.

Worth noticing that since msleep(0) schedules a one jiffy timeout is
better to skip such a call.

Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/char/hw_random/optee-rng.c

index 5bc4700c4dae1a615106cfddf0551ec944e5f86c..a99d8294998182f874427a73ef2c98c1ea55b709 100644 (file)
@@ -122,14 +122,14 @@ static int optee_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
        if (max > MAX_ENTROPY_REQ_SZ)
                max = MAX_ENTROPY_REQ_SZ;
 
-       while (read == 0) {
+       while (read < max) {
                rng_size = get_optee_rng_data(pvt_data, data, (max - read));
 
                data += rng_size;
                read += rng_size;
 
                if (wait && pvt_data->data_rate) {
-                       if (timeout-- == 0)
+                       if ((timeout-- == 0) || (read == max))
                                return read;
                        msleep((1000 * (max - read)) / pvt_data->data_rate);
                } else {