Я изучаю код ядра 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; }, который определенно будет лучше масштабироваться с количеством прослушивателей уведомлений в системе.
Кто-нибудь знает, почему здесь все еще используется глобальный список?