hash_add вылетает система - PullRequest
0 голосов
/ 17 июня 2019

Когда я добавляю элемент в мою хэш-таблицу, он вызывает сбой в ядре системы, и я не могу выяснить причину этого.

Я пишу некоторый код, чтобы выполнить анализ сетевого пакета врежим ядра и хранение статистической информации в структуре о каждом потоке пакетов, проходящих мой анализатор.

Моя хеш-таблица определяется с помощью:

DEFINE_HASHTABLE(flow_dictionary, 10);

и позже инициализируется с помощью:

hash_init(flow_dictionary);

Моя структура данных определяется с помощью

struct flow_action_head {
    unsigned int flowID;

    /* Mode of operations */
    SELECTION_MODE sampling_mode;
    SELECTION_MODE normalization_mode;

    /* Statistics */
    unsigned int numberPackets;
    unsigned int timeFirstPacket;
    unsigned int timeLastPacket;
    unsigned int packetsReceived;
    unsigned int packetsProcessed;

    /* Pointer to action details */
    nas_t* next;

    /* Required for linked hash list */
    struct hlist_node hash_list;

}; // __attribute__((packed));

В функции, которую я выполняю:

void map_add_flow(unsigned int flowID) {

    struct flow_action_head* fah;

    fah = (struct flow_action_head*) kzalloc(sizeof(struct flow_action_head), GFP_ATOMIC);

    fah->flowID = flowID;
    fah->sampling_mode = SMODE_COUNT_BASED;
    fah->normalization_mode = NMODE_TTL;
    fah->numberPackets = 1;
    fah->timeFirstPacket = 0;
    fah->timeLastPacket = 0;
    fah->packetsReceived = 0;
    fah->packetsProcessed = 0;
    fah->next = NULL;

    hash_add(flow_dictionary, &fah->hash_list, flowID);
}

, как только я нажму hash_add, система выйдет из строя.

Я ожидаю, что она просто добавит запись в хеш-таблицу flow_dictionary используя flowID в качестве ключа.Я не могу понять, почему это сломало бы этот пункт.Структура, кажется, в порядке, и я могу читать / записывать каждое значение структуры flow_action_head.

1 Ответ

0 голосов
/ 18 июня 2019

Я не знаю вашего происхождения, поэтому я предполагаю наименьшее.

Вы знакомы с kgdb?Если нет, возможно, вы захотите представиться.

Я часто видел сообщения, что «происходит сбой при вызове этой функции»;и после обхода в отладчике выясняется, что «когда я вызываю» означает + - несколько тысяч прерываний и миллионы кодов операций. Вам необходимо установить точку останова при возврате из hash_add ().

Если вы не готовы копаться в kgdb, вы можете начать с printk () после этого вызова, наличие этого сообщения дает важные подсказки: 1. Вы действительно потерпели крах до возвращения hash_add или нет? Если вы видите свое сообщение, вы определенно вернули его после вставки. 2. Если вы вернулись, у вас будет отметка времени вашего звонка, которую вы можете сравнить с отметкой времени, когда произошел сбой ядра.

Обычно ядро ​​падает сбольше информации, чем «Я разбился». Иногда в нем говорится, где произошел сбой, причина сбоя, трассировка стека, где он выполнялся. Вся эта информация полезна для определения первопричины сбоя.

FWIW; глядя на код, который вы разместили, я не вижу в этом ничего плохого. Я прошелся по хешу,кажется, вы используете это хорошо.Я подозреваю, что вы должны посмотреть на точку, где вы удаляете или ищите вещи из этого списка хешей.Удачи и счастливой охоты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...