Пните jhb@ или markj@, т.к. по-сути там фигня вопрос, просто нужно в m_unshare добавить обработку mbuf с M_EXTPG.
по-моему там ещё была такая же паника в m_pullup
Кстати да, там тоже была паника, потому что что? m_pullup собирает цепочку mbuf в один буфер доступный для линейного доступа. На редкость ублюдожная функция которая по всему коду торчит. Постоянно в коде этот паттерн: if (m->m_len < len && (m = m_pullup(m, skip + hlen)) == NULL) {}
чем ублюдочная? как иначе-то?
наинлайнить; но суть от этого не измениться
Да просто она заебала. Нужен Ethernet заголовок - if (m->m_len < ETH_HEADER && (m = m_pullup(m, skip + hlen)) == NULL) Потом IP - if (m->m_len < ETH_HEADER + IP_HEADER_LEN && (m = m_pullup(m, skip + hlen)) == NULL) Потом TCP - f (m->m_len < ETH_HEADER + IP_HEADER_LEN + TCP_HDR_LEN && (m = m_pullup(m, skip + hlen)) == NULL) Т.е. чтобы добраться до TCP - три if'а Причём я на боевой системе dtrace запускал и эта срань вообще почти никогда не вызывалась, т.к. сейчас пакеты в основном в M_EXT и сразу доступны, т.е. первая часть условия в 99% случаев не проходит - m->m_len < ETH_HEADER У меня уже есть идея сделать функцию m_trypullup c unlikely и т.д
ну, обпрофилироваться придётся, причём различать минимум три вида нагрузки: сервер, роутер и концентратор туннелей
Обсуждают сегодня