Skip to contentSkip to conversation

udevd: Use a tighter loop in compare_devpath()

PATCH In review Alan Jenkins 2 participants 3 messages Oct 25, 2008 – Oct 29, 2008

lore
Share & tools
lore
#0 lore raw

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
index 4306597..381d560 100644
@@ -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;
 }
 
#1 lore raw
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

#2 lore raw
In reply to Alan Jenkins
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