[PATCH i-g-t 1/2] lib/igt_drm_fdinfo: Use longest match first
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Feb 7 18:57:36 UTC 2024
On 07/02/2024 17:50, Lucas De Marchi wrote:
> On Wed, Feb 07, 2024 at 10:32:24AM +0000, Tvrtko Ursulin wrote:
>>
>> On 01/02/2024 14:09, Lucas De Marchi wrote:
>>> On Thu, Feb 01, 2024 at 01:43:21PM +0100, Kamil Konieczny wrote:
>>>> Hi Lucas,
>>>> On 2024-01-31 at 16:46:24 -0800, Lucas De Marchi wrote:
>>>>> Instead of checking twice the match, just use longest match first.
>>>>
>>>> Nice catch, LGTM.
>>>>
>>>> Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>>
>> +1 looks like that was a confused change I did when adding capacity.
>>
>> Going forward feel free to copy me when changing this code, given I
>> mostly wrote it after all..
>
> will do, sorry for missing that for this series.
>
>
>>
>>>>
>>>>>
>>>>> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
>>>>> ---
>>>>> lib/igt_drm_fdinfo.c | 19 +++++++++----------
>>>>> 1 file changed, 9 insertions(+), 10 deletions(-)
>>>>>
>>>>> diff --git a/lib/igt_drm_fdinfo.c b/lib/igt_drm_fdinfo.c
>>>>> index 222ccbfb1..5c0ccf624 100644
>>>>> --- a/lib/igt_drm_fdinfo.c
>>>>> +++ b/lib/igt_drm_fdinfo.c
>>>>> @@ -239,8 +239,15 @@ __igt_parse_drm_fdinfo(int dir, const char
>>>>> *fd, struct drm_client_fdinfo *info,
>>>>> strlen("drm-client-id")))) {
>>>>> info->id = atol(v);
>>>>> good++;
>>>>> - } else if (!strncmp(l, "drm-engine-", 11) &&
>>>>> - strncmp(l, "drm-engine-capacity-", 20)) {
>>>>> + } else if (!strncmp(l, "drm-engine-capacity-", 20)) {
>>>>
>>>> One more thing to eventually fix is removing "20" which is exact
>>>> len of string, with something like
>>>>
>>>> bool str_begins(char *src, char *pattern)
>>>>
>>>> One source of errors is counting letters in strings or changing
>>>> string itself without changing corresponding len. This can be
>>>> done in separate patch.
>>>
>>> I had a patch for something similar. I usually use a strstartswith()
>>> that's commonly used in other projects and also matches the python name.
>>>
>>> However I decided to drop that for now. I may have a bigger refactor in
>>> this function soon reworking parse_engine() and other functions: Worse
>>> than manually counting the chars for the strncmp() is to call strlen()
>>> in the same string just in the line below that to feed to parse_engine()
>>> :-/. As I said, still undecided what to change here and if it's worth
>>> it.
>>
>> AFAIR hardcoded strlens were because strangely const strings fail to
>> be evaluated at compile time and when I tested it and strlen was
>
> humn... strlen("foo") should always be optimized out.
> Testing with gcc 12.3 here, but it's something I always looked at:
>
> $ cat /tmp/a.c
> #include <string.h>
>
> int foo(void)
> {
> return strlen("foo");
> }
> $ gcc -c -g -O0 -o /tmp/a.o /tmp/a.c
> $ objdump -d /tmp/a.o
> /tmp/a.o: file format elf64-x86-64
>
>
> Disassembly of section .text:
>
> 0000000000000000 <foo>:
> 0: f3 0f 1e fa endbr64
> 4: 55 push %rbp
> 5: 48 89 e5 mov %rsp,%rbp
> 8: b8 03 00 00 00 mov $0x3,%eax
> d: 5d pop %rbp
> e: c3 ret
>
>
Yeah I don't know, I was perplexed too. I tried it now and it works as
expected. Maybe some weirdness on my local build machine at the time.
>> showing in the profile. Given how gputop sucked with CPU usage quite
>> badly (relative to top) I was motivated to improve it.
>>
>> The "top-level" strncmp checks are the more expensive ones because
>> they all run for all lines in a given fdinfo file, while the inside
>> the branch strlen runs fewer times.
>>
>> Nevertheless some cleanup of this function would probably be good,
>> just while doing so keep in mind how bad gputop looks compared to top
>> in the profiles, not to make it much worse.
>
>
> will keep that in mind, but I'm not sure I will be able to work on this
> soon.
No rush, I only mentioned this since you announced you have reworks in
your sights.
Regards,
Tvrtko
More information about the igt-dev
mailing list