Действительно ли 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)


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

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