On 2025/05/22 1:42, Alex Bennée wrote:
> The default is we update time every 1/10th of a second or so. However
> for some cases we might want to update time more frequently. Allow
> this to be set via the command line through the ipq argument.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
>
> ---
> v3
> - error checking for ipq
> v2
> - checkpatch fixes.
> ---
> docs/about/emulation.rst | 4 ++++
> contrib/plugins/ips.c | 15 ++++++++++++++-
> 2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/docs/about/emulation.rst b/docs/about/emulation.rst
> index a72591ee4d..456d01d5b0 100644
> --- a/docs/about/emulation.rst
> +++ b/docs/about/emulation.rst
> @@ -811,6 +811,10 @@ This plugin can limit the number of Instructions Per Second that are executed::
> * - ips=N
> - Maximum number of instructions per cpu that can be executed in one second.
> The plugin will sleep when the given number of instructions is reached.
> + * - ipq=N
> + - Instructions per quantum. How many instructions before we re-calculate time.
> + The lower the number the more accurate time will be, but the less efficient the plugin.
> + Defaults to ips/10
>
> Other emulation features
> ------------------------
> diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
> index eb4418c25b..f1523cbee3 100644
> --- a/contrib/plugins/ips.c
> +++ b/contrib/plugins/ips.c
> @@ -145,6 +145,8 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
> const qemu_info_t *info, int argc,
> char **argv)
> {
> + bool ipq_set = false;
> +
> for (int i = 0; i < argc; i++) {
> char *opt = argv[i];
> g_auto(GStrv) tokens = g_strsplit(opt, "=", 2);
> @@ -175,6 +177,14 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
> return -1;
> }
> }
> + } else if (g_strcmp0(tokens[0], "ipq") == 0) {
> + max_insn_per_quantum = g_ascii_strtoull(tokens[1], NULL, 10);
> +
> + if (max_insn_per_quantum == 0 || max_insn_per_quantum == G_MAXUINT64) {
> + fprintf(stderr, "bad ipq value: %s\n", g_strerror(errno));
This check should follow one of ips.
First, it should check errno. Otherwise it may emit a cryptic message
saying: "bad ipq value: Success".
max_insn_per_quantum == G_MAXUINT64 is unnecessary. A sufficiently large
value of max_insn_per_quantum should result in the same behavior anyway:
a quantum never ends.
Following the check of ips is an easy way to implement a correct
checking and it also ensures consistency.
> + return -1;
> + }
> + ipq_set = true;
> } else {
> fprintf(stderr, "option parsing failed: %s\n", opt);
> return -1;
> @@ -182,7 +192,10 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
> }
>
> vcpus = qemu_plugin_scoreboard_new(sizeof(vCPUTime));
> - max_insn_per_quantum = max_insn_per_second / NUM_TIME_UPDATE_PER_SEC;
> +
> + if (!ipq_set) {
> + max_insn_per_quantum = max_insn_per_second / NUM_TIME_UPDATE_PER_SEC;
> + }
>
> if (max_insn_per_quantum == 0) {
> fprintf(stderr, "minimum of %d instructions per second needed\n",