Currently, plpks_confirm_object_flushed() function polls for 5msec in
total instead of 5sec.

Keep max polling time consistent for all the H_CALLs, which take longer
than expected, to be 5sec. Also, make use of fsleep() everywhere to
insert delay.

Reported-by: Nageswara R Sastry <rnsas...@linux.ibm.com>
Fixes: 2454a7af0f2a ("powerpc/pseries: define driver for Platform KeyStore")
Signed-off-by: Nayna Jain <na...@linux.ibm.com>
Tested-by: Nageswara R Sastry <rnsas...@linux.ibm.com>
---
v4:
 * As per Andrew's feedback, squashed Patch 2 with Patch 1.
Now it is single patch.

v3:
 * Addition to Patch 1 timeout patch based on Andrew's feedback.

v2:
* Updated based on feedback from Michael Ellerman
        Replaced usleep_range with fsleep.
        Since there is no more need to specify range, sleep time is
reverted back to 10 msec.

 arch/powerpc/include/asm/plpks.h       |  5 ++---
 arch/powerpc/platforms/pseries/plpks.c | 10 +++++-----
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/include/asm/plpks.h b/arch/powerpc/include/asm/plpks.h
index 23b77027c916..7a84069759b0 100644
--- a/arch/powerpc/include/asm/plpks.h
+++ b/arch/powerpc/include/asm/plpks.h
@@ -44,9 +44,8 @@
 #define PLPKS_MAX_DATA_SIZE            4000
 
 // Timeouts for PLPKS operations
-#define PLPKS_MAX_TIMEOUT              5000 // msec
-#define PLPKS_FLUSH_SLEEP              10 // msec
-#define PLPKS_FLUSH_SLEEP_RANGE                400
+#define PLPKS_MAX_TIMEOUT              (5 * USEC_PER_SEC)
+#define PLPKS_FLUSH_SLEEP              10000 // usec
 
 struct plpks_var {
        char *component;
diff --git a/arch/powerpc/platforms/pseries/plpks.c 
b/arch/powerpc/platforms/pseries/plpks.c
index febe18f251d0..4a595493d28a 100644
--- a/arch/powerpc/platforms/pseries/plpks.c
+++ b/arch/powerpc/platforms/pseries/plpks.c
@@ -415,8 +415,7 @@ static int plpks_confirm_object_flushed(struct label *label,
                        break;
                }
 
-               usleep_range(PLPKS_FLUSH_SLEEP,
-                            PLPKS_FLUSH_SLEEP + PLPKS_FLUSH_SLEEP_RANGE);
+               fsleep(PLPKS_FLUSH_SLEEP);
                timeout = timeout + PLPKS_FLUSH_SLEEP;
        } while (timeout < PLPKS_MAX_TIMEOUT);
 
@@ -464,9 +463,10 @@ int plpks_signed_update_var(struct plpks_var *var, u64 
flags)
 
                continuetoken = retbuf[0];
                if (pseries_status_to_err(rc) == -EBUSY) {
-                       int delay_ms = get_longbusy_msecs(rc);
-                       mdelay(delay_ms);
-                       timeout += delay_ms;
+                       int delay_us = get_longbusy_msecs(rc) * 1000;
+
+                       fsleep(delay_us);
+                       timeout += delay_us;
                }
                rc = pseries_status_to_err(rc);
        } while (rc == -EBUSY && timeout < PLPKS_MAX_TIMEOUT);
-- 
2.31.1

Reply via email to