Недавно я обнаружил статью под названием «Эффективный статический анализ ошибок параллельного использования после освобождения в драйверах устройств Linux». Он использует мотивирующий пример (это также патч для ядра: https://github.com/torvalds/linux/commit/4f68ef64cd7f). Я исследую связанный исходный код ядра, я обнаружил, что функция dev_kfree_skb (frame.skb) сначала уменьшит user_count в frame.skb, если user_count == 0, структура frame.skb будет действительно освобождена. Однако операция чтения в другой функции сначала попытается получить frame.skb, что увеличит use_count. Поэтому, я думаю, даже без этого патча ядра памятьframe.skb не будет освобожден до операции чтения. Я не знаю, действительно ли необходим этот патч для ядра.
int cw1200_hw_scan(...) {
......
mutex_lock(&priv->conf_mutex);
......
mutex_unlock(&priv->conf_mutex);
if (frame.skb)
dev_kfree_skb(frame.skb); // FREE
......
}
void cw1200_bss_info_changed(...) {
......
mutex_lock(&priv->conf_mutex);
......
cw1200_upload_beacon(...); // read frame.skb in this function
......
mutex_unlock(&priv->conf_mutex);
......
}