LINUX.ORG.RU

Сообщения Dvorkin

 

strange Linux scheduler

Форум — Development

Здравствуйте!

Пишу модуль ядра для Linux и столкнулся с одной непонятностью...

после загрузки в ядро модуль создает два файла устройств, один - для чтения, другой - для записи. Оба фала связаны логически с одним буфером в модуле. Устройство "виртуальное", типа PIPE'a.

логика такая: 1) программа - ридер открывает 1й файл и пытается читать из него. Тк данных нет в буфере, она блокируется (sleep_on). 2) программа - писатель открывает 2й файл и пишет туда (в буфер) строку. Тк буфер чист, она не блокируется и по завершении делает wake_up для ридера (чтоб он проснулся и получил данные).

НО! ридер не просыпается. он так и остается в спящем виде до получения прерываения с клавы (Ctrl+C).

Выдержка из кода:

static ssize_t vsp_read( struct file *_file, char *_buff, size_t _len, loff_t *_off) { /// ... if ( !(VSP_NONBLOCK( _file))) if ( dev->buff_len < 1) interruptible_sleep_on( &( dev->wqr)); // .. skipped wake_up_interruptible( &dev->wqw); // ... return( readed); } // read end

static ssize_t vsp_write( struct file *_file, const char *_buff, size_t _len, loff_t *_off) { /// ... if ( !(VSP_NONBLOCK( _file))) if ( dev->buff_len >= VSP_MAXBUF - 1) interruptible_sleep_on( &( dev->wqw)); // .. skipped wake_up_interruptible( &dev->wqr); // ... return( wrote); } // write end

dev имеет примерно следующую структуру: struct VSP_DEVICE { char buff[ VSP_MAXBUF]; unsigned short buff_len; wait_queue_head_t wqr, wqw; };

все wait_queue_head_t инициализируются на этапе регистрации девайсов

* я заглядывал в очереди wait_queue_head_t на состояние процессов до и после вызова wake_up_interruptible, выяснил, что состояние будимого процесса не меняется. Тоесть, как было 1 (INTERRUPTIBLE), так и осталось. Самое странное... Если непосредственно до вызова wake_up_interruptible сделать printk(""); с любой строкой в качестве параметра, хоть "\0", после wake_up_interruptible состояние читающего процесса меняется, он просыпается и успешно завершается, возврашая прочитанные данные.

Пытался делать wake_up_sync, wake_up_all и тд... ниче не помогает. Кто знает где грабли?

gcc 2.96, kernel 2.4.18-6mdk

WBR, Dvorkin

Dvorkin
()

RSS подписка на новые темы