Мой вопрос в том, что h может быть освобожден другой процесс тогда
«Является ли h безопасным?», «Если h безопасен, как это работает?»
вот ответы.
Обратите внимание, что h во всех контекстах означает то же самое значение ct (ct просто вычисляется как h).
Q. H безопасно?
Во-первых, нужно определить, что означает "безопасен ли он?"
Как правило, «указатель безопасен» означает, что адрес, на который указывает указатель, доступен и не освобожден. Так что, если использовать указатель или указатель членов, можно получить к ним доступ без нарушений.
смотреть в этом контексте код,
Ответ: «Ч может быть освобожден, но не произошло нарушений!» (вау: O).
Если использовать call_rcu () в destroy_conntrack (), h не сможет освободить использование периода отсрочки. но
CT освобождается непосредственно в destroy_conntrack ().
как защитить ct без call_rcu (). (Даже не произошло нарушение).
Хитрость в использовании hlist_nulls (SLAB_TYPESAFE_BY_RCU).
узлы ct расположены SLAB_TYPESAFE_BY_RCU.
эта ячейка памяти свободна для повторного использования в любое время.
Итак, узлы постоянно имеют одинаковое смещение. мы можем получить к ним доступ, даже освободившись.
Конечно, необходимо защищать несколько ограничений (барьеры памяти, атомарные операции, использовать счетчик ссылок, проверять повторно используемые узлы ...)
Более подробную информацию и ограничения вы читаете по ссылке ниже
https://github.com/westerndigitalcorporation/RISC-V-Linux/blob/master/linux/Documentation/RCU/rculist_nulls.txt