Skip to content

Commit 044ac33

Browse files
committed
udev: do not try to find blocker again when no blocker found previously
1 parent bd335c9 commit 044ac33

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

src/udev/udevd.c

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,35 @@ static int event_is_blocked(Event *event) {
780780

781781
/* lookup event for identical, parent, child device */
782782

783+
assert(event);
784+
assert(event->manager);
785+
assert(event->blocker_seqnum <= event->seqnum);
786+
787+
if (event->blocker_seqnum == event->seqnum)
788+
/* we have checked previously and no blocker found */
789+
return false;
790+
791+
LIST_FOREACH(event, loop_event, event->manager->events) {
792+
/* we already found a later event, earlier cannot block us, no need to check again */
793+
if (loop_event->seqnum < event->blocker_seqnum)
794+
continue;
795+
796+
/* event we checked earlier still exists, no need to check again */
797+
if (loop_event->seqnum == event->blocker_seqnum)
798+
return true;
799+
800+
/* found ourself, no later event can block us */
801+
if (loop_event->seqnum >= event->seqnum)
802+
goto no_blocker;
803+
804+
/* found event we have not checked */
805+
break;
806+
}
807+
808+
assert(loop_event);
809+
assert(loop_event->seqnum > event->blocker_seqnum &&
810+
loop_event->seqnum < event->seqnum);
811+
783812
r = sd_device_get_subsystem(event->dev, &subsystem);
784813
if (r < 0)
785814
return r;
@@ -805,21 +834,13 @@ static int event_is_blocked(Event *event) {
805834
return r;
806835

807836
/* check if queue contains events we depend on */
808-
LIST_FOREACH(event, loop_event, event->manager->events) {
837+
LIST_FOREACH(event, loop_event, loop_event) {
809838
size_t loop_devpath_len, common;
810839
const char *loop_devpath;
811840

812-
/* we already found a later event, earlier cannot block us, no need to check again */
813-
if (loop_event->seqnum < event->blocker_seqnum)
814-
continue;
815-
816-
/* event we checked earlier still exists, no need to check again */
817-
if (loop_event->seqnum == event->blocker_seqnum)
818-
return true;
819-
820841
/* found ourself, no later event can block us */
821842
if (loop_event->seqnum >= event->seqnum)
822-
return false;
843+
goto no_blocker;
823844

824845
/* check major/minor */
825846
if (major(devnum) != 0) {
@@ -879,6 +900,10 @@ static int event_is_blocked(Event *event) {
879900

880901
event->blocker_seqnum = loop_event->seqnum;
881902
return true;
903+
904+
no_blocker:
905+
event->blocker_seqnum = event->seqnum;
906+
return false;
882907
}
883908

884909
static int event_queue_start(Manager *manager) {

0 commit comments

Comments
 (0)