|
@@ -107,7 +107,7 @@ static void *threaded_qcrypto_pbkdf2_count_iters(void *data)
|
|
size_t nsalt = iters_data->nsalt;
|
|
size_t nsalt = iters_data->nsalt;
|
|
size_t nout = iters_data->nout;
|
|
size_t nout = iters_data->nout;
|
|
Error **errp = iters_data->errp;
|
|
Error **errp = iters_data->errp;
|
|
-
|
|
|
|
|
|
+ size_t scaled = 0;
|
|
uint64_t ret = -1;
|
|
uint64_t ret = -1;
|
|
g_autofree uint8_t *out = g_new(uint8_t, nout);
|
|
g_autofree uint8_t *out = g_new(uint8_t, nout);
|
|
uint64_t iterations = (1 << 15);
|
|
uint64_t iterations = (1 << 15);
|
|
@@ -131,7 +131,17 @@ static void *threaded_qcrypto_pbkdf2_count_iters(void *data)
|
|
|
|
|
|
delta_ms = end_ms - start_ms;
|
|
delta_ms = end_ms - start_ms;
|
|
|
|
|
|
- if (delta_ms == 0) { /* sanity check */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * For very small 'iterations' values, CPU (or crypto
|
|
|
|
+ * accelerator) might be fast enough that the scheduler
|
|
|
|
+ * hasn't incremented getrusage() data, or incremented
|
|
|
|
+ * it by a very small amount, resulting in delta_ms == 0.
|
|
|
|
+ * Once we've scaled 'iterations' x10, 5 times, we really
|
|
|
|
+ * should be seeing delta_ms != 0, so sanity check at
|
|
|
|
+ * that point.
|
|
|
|
+ */
|
|
|
|
+ if (scaled > 5 &&
|
|
|
|
+ delta_ms == 0) { /* sanity check */
|
|
error_setg(errp, "Unable to get accurate CPU usage");
|
|
error_setg(errp, "Unable to get accurate CPU usage");
|
|
goto cleanup;
|
|
goto cleanup;
|
|
} else if (delta_ms > 500) {
|
|
} else if (delta_ms > 500) {
|
|
@@ -141,6 +151,7 @@ static void *threaded_qcrypto_pbkdf2_count_iters(void *data)
|
|
} else {
|
|
} else {
|
|
iterations = (iterations * 1000 / delta_ms);
|
|
iterations = (iterations * 1000 / delta_ms);
|
|
}
|
|
}
|
|
|
|
+ scaled++;
|
|
}
|
|
}
|
|
|
|
|
|
iterations = iterations * 1000 / delta_ms;
|
|
iterations = iterations * 1000 / delta_ms;
|