linux-crypto.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv3 2/2] hwrng: optee: fix wait use case
@ 2020-08-06  9:58 Jorge Ramirez-Ortiz
  0 siblings, 0 replies; 2+ messages in thread
From: Jorge Ramirez-Ortiz @ 2020-08-06  9:58 UTC (permalink / raw)
  To: jorge, sumit.garg, jens.wiklander
  Cc: herbert, mpm, arnd, ricardo, mike, gregkh, op-tee, linux-crypto,
	linux-kernel

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>
---
 drivers/char/hw_random/optee-rng.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/char/hw_random/optee-rng.c b/drivers/char/hw_random/optee-rng.c
index 5bc4700c4dae..a99d82949981 100644
--- a/drivers/char/hw_random/optee-rng.c
+++ b/drivers/char/hw_random/optee-rng.c
@@ -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 {
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCHv3 2/2] hwrng: optee: fix wait use case
  2020-08-06 10:00 [PATCHv3 1/2] hwrng: optee: handle unlimited data rates Jorge Ramirez-Ortiz
@ 2020-08-06 10:00 ` Jorge Ramirez-Ortiz
  0 siblings, 0 replies; 2+ messages in thread
From: Jorge Ramirez-Ortiz @ 2020-08-06 10:00 UTC (permalink / raw)
  To: jorge, sumit.garg, jens.wiklander
  Cc: mpm, herbert, arnd, ricardo, mike, gregkh, op-tee, linux-crypto,
	linux-kernel

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>
---
 drivers/char/hw_random/optee-rng.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/char/hw_random/optee-rng.c b/drivers/char/hw_random/optee-rng.c
index 5bc4700c4dae..a99d82949981 100644
--- a/drivers/char/hw_random/optee-rng.c
+++ b/drivers/char/hw_random/optee-rng.c
@@ -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 {
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-08-06 11:14 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-06  9:58 [PATCHv3 2/2] hwrng: optee: fix wait use case Jorge Ramirez-Ortiz
2020-08-06 10:00 [PATCHv3 1/2] hwrng: optee: handle unlimited data rates Jorge Ramirez-Ortiz
2020-08-06 10:00 ` [PATCHv3 2/2] hwrng: optee: fix wait use case Jorge Ramirez-Ortiz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).