udevd: Use a tighter loop in compare_devpath()
PATCH 1/1 udevd: Use a tighter loop in compare_devpath()
udevd: Use a tighter loop for compare_devpath()
This crops up in my threaded udevd profiles from time to time. It's not consistent - probably due to variations in the number of concurrent events - but it can hit 4% user time and higher.
The change halves the user time spent in compare_devpath().
udev/udevd.c +13 -15
@@ -303,26 +285,24 @@ static int mem_size_mb(void)static int compare_devpath (const char *running,const char *waiting) { -int i; +int i =0 ; -for (i =0 ; i <UTIL_PATH_SIZE ; i++) { -/* identical device event found */ -if (running[i] ='\0' && waiting[i] ='\0' ) -return 1 ; +while (running[i] = waiting[i] && running[i] !='\0' ) + i++; -/* parent device event found */ -if (running[i] ='\0' && waiting[i] ='/' ) -return 2 ; +/* identical device event found */ +if (running[i] ='\0' && waiting[i] ='\0' ) +return 1 ; -/* child device event found */ -if (running[i] ='/' && waiting[i] ='\0' ) -return 3 ; +/* parent device event found */ +if (running[i] ='\0' && waiting[i] ='/' ) +return 2 ; -/* no matching event */ -if (running[i] != waiting[i]) -break ; - } +/* child device event found */ +if (running[i] ='/' && waiting[i] ='\0' ) +return 3 ; +/* no matching event */ return 0 ; }
Quoted 5 lines · Alan Jenkins
udevd: Use a tighter loop for
compare_devpath()This crops up in my threaded udevd profiles from time to time. It's not consistent - probably due to variations in the number of concurrent events - but it can hit 4% user time and higher.
Yeah, I've seen that too some times. Nice! Applied.
Thanks,
Kay
Quoted 8 lines · Kay Sievers
Quoted 5 lines · Alan Jenkins
udevd: Use a tighter loop for
compare_devpath()This crops up in my threaded udevd profiles from time to time. It's not consistent - probably due to variations in the number of concurrent events - but it can hit 4% user time and higher.
Yeah, I've seen that too some times. Nice! Applied.
I've merged the udevd exec and run queue now to have always a sorted list. We remember the seqnum of the last event that caused an event to be delayed. Next time we need to check, we do not do the devpath string compare for all the events that we already checked in the earlier run. This saves us ~70% of the calls to compare_devpath().
Kay