Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [kernel] Отправка skb устройству в обработчике irq, можно или нет? 
V
    Опции темы
null56
Дата 12.1.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Всем привет
Есть обработчик прерывания от hrtimer, можно ли в нем вызывать метод dev_queue_xmit
http://lxr.linux.no/#linux+v2.6.36/net/core/dev.c#L2171
просто один раз получил паник
Цитата

[  991.768144] Badness at c002a9c4 [verbose debug info unavailable]
[  991.774149] NIP: c002a9c4 LR: c020f100 CTR: c0010b4c
[  991.779113] REGS: c036fd20 TRAP: 0700   Not tainted  (2.6.32.9)
[  991.785029] MSR: 00021032 <ME,CE,IR,DR>  CR: 44044082  XER: 00000000
[  991.791415] TASK = c03453e8[0] 'swapper' THREAD: c036e000
[  991.796636] GPR00: 00000001 c036fdd0 c03453e8 00000000 c07aedc0 0000041c 00000068 00000000 
[  991.805028] GPR08: 00000000 c03c0000 00000068 00000035 00001353 00000000 7fffffff 00000005 
[  991.813420] GPR16: 00000001 7fffffff c0348fe0 c0348fb0 00000000 c4653600 c036fe58 2b269aca 
[  991.821811] GPR24: c03463a8 c03ba740 df943100 df847000 dfac1000 00000000 df95884c df958800 
[  991.830396] NIP [c002a9c4] local_bh_enable+0x38/0x9c
[  991.835362] LR [c020f100] dev_queue_xmit+0x414/0x464
[  991.840321] Call Trace:
[  991.842768] [c036fdd0] [00000001] 0x1 (unreliable)
[  991.847567] [c036fde0] [c020f100] dev_queue_xmit+0x414/0x464
[  991.853243] [c036fe00] [e536a198] boff_send_reliable+0x58/0x6c [boff]
[  991.859694] [c036fe20] [e536a218] boff_hrtimer_fn+0x6c/0x8c [boff]
[  991.865886] [c036fe40] [c003e6cc] __run_hrtimer+0x48/0x94
[  991.871290] [c036fe50] [c003eac4] hrtimer_interrupt+0x208/0x2bc
[  991.877218] [c036fec0] [c000e478] timer_interrupt+0x11c/0x140
[  991.882974] [c036fed0] [c001192c] ret_from_except+0x0/0x14
[  991.888474] --- Exception: 901 at cpu_idle+0x9c/0xdc
[  991.888480]     LR = cpu_idle+0x9c/0xdc
[  991.897267] [c036ff90] [c00092ec] cpu_idle+0xd8/0xdc (unreliable)
[  991.903370] [c036ffb0] [c0003e34] rest_init+0x5c/0x88
[  991.908434] [c036ffc0] [c032079c] start_kernel+0x264/0x284
[  991.913923] [c036fff0] [00003438] 0x3438

где
boff_hrtimer_fn - мой обработчик таймера
boff_send_reliable - фукнция из которой вызывается dev_queue_xmit

ищу ответ в исходниках, если кто знает, подскажите, буду благодарен
ЗЫ: падение редкое и до сих пор не могу его повторить, но оно было в обработчике с выключенными прерываниями, может быть в этом была ошибка
Код

    spin_lock_irqsave(&delay_skb_queue.lock, flags);
    while ((skb = __skb_dequeue(&delay_skb_queue)) != NULL)
        {   boff_send_reliable(skb);   }
    spin_unlock_irqrestore(&delay_skb_queue.lock, flags);

сейчас сделал, чтобы прерывания выключались лишь в методе skb_dequeue(без подчеркивания - сама блокирует прерывания), то есть
Код

    while ((skb = skb_dequeue(&delay_skb_queue)) != NULL)
        {   boff_send_reliable(skb);   }

может в этом была ошибка
заранее благодарен за помощь
PM MAIL   Вверх
null56
Дата 12.1.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Цитата

 *      When calling this method, interrupts MUST be enabled.  This is because
2168 *      the BH enable code must have IRQs enabled so that it will not deadlock.
2169 *          --BLG
2170 */


судя по всему я был прав
PM MAIL   Вверх
null56
Дата 12.1.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



надо выяснить в контексте чего выполняется обработчик таймера, попробую через
Код

  82/*
  83 * Are we doing bottom half or hardware interrupt processing?
  84 * Are we in a softirq context? Interrupt context?
  85 */
  86#define in_irq()                (hardirq_count())
  87#define in_softirq()            (softirq_count())
  88#define in_interrupt()          (irq_count())

а дальше буду отталкиваться от этого

Добавлено через 12 минут и 17 секунд
скажем так, мы не в софтварном контексте, если верить этим макросам
теперь надо понять, чем еще может нарушать условия в контексте прерывания функция dev_queue_xmit
PM MAIL   Вверх
null56
Дата 12.1.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



вопрос: фукнция в своем теле делает это
Код

2178        /* Disable soft irqs for various locks below. Also
2179         * stops preemption for RCU.
2180         */
2181        rcu_read_lock_bh();
.....
 351/**
 352 * rcu_read_lock_bh - mark the beginning of a softirq-only RCU critical section
 353 *
 354 * This is equivalent of rcu_read_lock(), but to be used when updates
 355 * are being done using call_rcu_bh(). Since call_rcu_bh() callbacks
 356 * consider completion of a softirq handler to be a quiescent state,
 357 * a process in RCU read-side critical section must be protected by
 358 * disabling softirqs. Read-side critical sections in interrupt context
 359 * can use just rcu_read_lock().
 360 *
 361 */
 362static inline void rcu_read_lock_bh(void)
 363{
 364        __rcu_read_lock_bh();
 365        __acquire(RCU_BH);
 366        rcu_read_acquire_bh();
 367}


это разрешено в хардварном прерывании?
PM MAIL   Вверх
null56
Дата 13.1.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



возник вопрос, если судить коду по ссылке ниже, то похоже на то, что hrtimer вызывает колбак в контексте softrq, почему тогда макрос in_irq подтверждает обратное?
http://lxr.linux.no/#linux+v2.6.36/kernel/softirq.c#L502
PM MAIL   Вверх
null56
Дата 13.1.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Проблема решена
Я поместил код функции с dev_queue_xmit в тасклет и активировал его в колбаке таймера, видимо действительно проблема была в запрещенных прерываниях
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.