Akihiko Odaki <[email protected]> writes:

> On 2025/05/06 21:57, 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 <[email protected]>
>> Reviewed-by: Pierrick Bouvier <[email protected]>
>> ---
>> v2
>>    - checkpatch fixes.
>> ---
>>   docs/about/emulation.rst |  4 ++++
>>   contrib/plugins/ips.c    | 10 +++++++++-
>>   2 files changed, 13 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 9b166a7d6c..62ed8ddd08 100644
>> --- a/contrib/plugins/ips.c
>> +++ b/contrib/plugins/ips.c
>> @@ -147,6 +147,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);
>> @@ -177,6 +179,9 @@ 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);
>
> It may be nice to have an error check performed for ips.

We do catch most errors bellow on max_insn_per_quantum = 0, but I can
check up here as well.

>
>> +            ipq_set = true;
>>           } else {
>>               fprintf(stderr, "option parsing failed: %s\n", opt);
>>               return -1;
>> @@ -184,7 +189,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",

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro

Reply via email to