Действительно ли fsnotify нужно сканирование глобального списка?

Я изучаю код ядра Linux, в частности, уведомления файловой системы в fs/notify/fsnotify.c... Насколько я знаю, каждому индексному узлу теперь предоставляется список «меток», каждая из которых ссылается на «группу», которая слушает уведомление на этом иноде. В коде VFS уведомления вызываются с помощью fsnotify(triggering_inode, REASON|OTHER_REASON, additional_parameters...)

В этой функции fsnotify() меня озадачивает

 list_for_each_entry_rcu(group, &fsnotify_groups, group_list) {
     if (test_mask & group->mask) {
        if (!group->ops->should_send_event(group, to_tell, mask))
                continue;
            // more code that sends notification
     }
 }

Тем более, что fsnotify_groups это явно (fsnotify.h) глобальный список, куда записываются все группы. Я уверен, что разработчики ядра знают, что они здесь делают, и что я упускаю критический момент, который не позволяет нам просто использовать foreach(mark:inode->fsnotify_mark_entry) { g=mark->associated_group; }, который определенно будет лучше масштабироваться с количеством прослушивателей уведомлений в системе.

Кто-нибудь знает, почему здесь все еще используется глобальный список?


person PypeBros    schedule 05.09.2011    source источник


Ответы (1)


arrow_upward
2
arrow_downward

последняя версия не делай так больше.

person caf    schedule 06.09.2011
comment
так что эта проблема с производительностью была решена с версии 2.6.36, а вышеописанная странность — это просто временный плохой код. - person PypeBros; 06.09.2011