[PATCH i-g-t 07/12] lib/igt_drm_fdinfo: Parse unit for engine utilization
Tvrtko Ursulin
tursulin at ursulin.net
Fri Apr 19 07:58:25 UTC 2024
On 18/04/2024 23:48, Umesh Nerlige Ramappa wrote:
> On Fri, Apr 05, 2024 at 01:00:51AM -0500, Lucas De Marchi wrote:
>> Kernel adds a " ns" at the end of engine utilization. Make sure we parse
>> it so we don't fail if there's another suitable unit chosen by the
>> driver or another format.
>>
>> This prepares the ground for xe driver which will use 2 timestamps
>> rather than 1 with a different unit, to make sure it's compatible with
>> SR-IOV so we don't have to handle the conversion between GPU and CPU
>> clock domains.
>>
>> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
>> ---
>> lib/igt_drm_fdinfo.c | 22 +++++++++++++++-------
>> 1 file changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/lib/igt_drm_fdinfo.c b/lib/igt_drm_fdinfo.c
>> index 5f05f210e..1541a62c9 100644
>> --- a/lib/igt_drm_fdinfo.c
>> +++ b/lib/igt_drm_fdinfo.c
>> @@ -63,9 +63,10 @@ static const char *ignore_space(const char *s)
>>
>> static int parse_engine(const char *name, struct drm_client_fdinfo *info,
>> const char **name_map, unsigned int map_entries,
>> - uint64_t *val)
>> + uint64_t *val, const char **unit)
>> {
>> const char *p;
>> + char *end_ptr;
>> size_t name_len;
>> int found = -1;
>> unsigned int i;
>> @@ -103,8 +104,15 @@ static int parse_engine(const char *name, struct
>> drm_client_fdinfo *info,
>> }
>> }
>>
>> - if (found >= 0)
>> - *val = strtoull(p, NULL, 10);
>> + if (found < 0)
>> + return found;
>> +
>> + *val = strtoull(p, &end_ptr, 10);
>> + if (p == end_ptr)
>> + return -1;
>> +
>> + if (unit)
>> + *unit = end_ptr;
>>
>> return found;
>> }
>> @@ -212,7 +220,7 @@ __igt_parse_drm_fdinfo(int dir, const char *fd,
>> struct drm_client_fdinfo *info,
>> while ((l = strtok_r(_buf, "\n", &ctx))) {
>> uint64_t val = 0;
>> size_t keylen;
>> - const char *v;
>> + const char *v, *unit;
>> char *end_ptr;
>> int idx;
>>
>> @@ -237,15 +245,15 @@ __igt_parse_drm_fdinfo(int dir, const char *fd,
>> struct drm_client_fdinfo *info,
>> strncpy(info->pdev, v, sizeof(info->pdev) - 1);
>> } else if (strstartswith(l, "drm-engine-capacity-", &keylen)) {
>> idx = parse_engine(l + keylen, info,
>> - name_map, map_entries, &val);
>> + name_map, map_entries, &val, NULL);
>> if (idx >= 0) {
>> info->capacity[idx] = val;
>> num_capacity++;
>> }
>> } else if (strstartswith(l, "drm-engine-", &keylen)) {
>> idx = parse_engine(l + keylen, info,
>> - name_map, map_entries, &val);
>> - if (idx >= 0) {
>> + name_map, map_entries, &val, &unit);
>
> Should we ignore spaces in unit and then do a strcmp(unit, "ns")? OR are
> we sure that there is just one space prior to unit here?
Any type and number of whitespace shouldbe handled.
I guess in drm-usage-stats.rst this needs to be improved:
"""
- Whitespace between the delimiter and first non-whitespace character
shall be
ignored when parsing.
- Keys are not allowed to contain whitespace characters.
- Numerical key value pairs can end with optional unit string.
"""
Perhaps append:
- Whitespace between the value and the unit shall be ignored when parsing.
Regards,
Tvrtko
>
> Either ways,
>
> Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
>
> Umesh
>
>> + if (idx >= 0 && !strcmp(unit, " ns")) {
>> if (!info->capacity[idx])
>> info->capacity[idx] = 1;
>> info->busy[idx] = val;
>> --
>> 2.44.0
>>
More information about the igt-dev
mailing list