#1 18.01.2013 15:03:41

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

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

Вопрос не связан с конкретным дистрибутивом, а только с ядром.
Есть плата последовательных портов от Advantech, MIC-3612.
Драйвер для Linux нормально работает с ядром 3.0, а с 3.2 уже
не компилируется. В ядре в include/linux/serial_core.h в структуре
uart_port уменьшили количество типов - это не проблема, в структуре
uart_state удалили элемент
struct tasklet_struct *tlet;
а в драйвере для tlet трижды вызывается
tasklet_schedule(tlet);
это я закомментировал, а главная трудность - в tty.h теперь нет функции
tty_locked(), а драйвер её существенно использует. Без неё или
с попытками её заменить чем-то другим драйвер не работает, в лучшем случае
срабаттывает один раз.

В ядре 3.0 в include/linux/tty.h есть определения:


extern struct task_struct *__big_tty_mutex_owner;
#define tty_locked() (current == __big_tty_mutex_owner)

а в ядре 3.2 их нет и я пока не понял, чем заменить tty_locked().

Я оставил запрос на сайте Advantech, но, м.б., кто-нибудь уже знает решение?

Пётр.

#2 18.01.2013 20:12:46

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

во первых, ссылку на исходники в студию, чтобы точно знать о чём говори...
во-вторых, если это то о чём я думаю, то сравни изменения в ядре в drivers/tty/serial/serial_core.c , аналогично измени свои...
и проверь, может ядерные дрова в новой версии нормально работают с железякой и ей свой драйвер уже не нужен...

#3 19.01.2013 05:19:59

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

во первых, ссылку на исходники в студию, чтобы точно знать о чём говори...
во-вторых, если это то о чём я думаю, то сравни изменения в ядре в drivers/tty/serial/serial_core.c , аналогично измени свои...
и проверь, может ядерные дрова в новой версии нормально работают с железякой и ей свой драйвер уже не нужен...

Нет, без драйвера от производителя даже не создаются устройства - /dev/ttyAPx.
Я и попытался изменить свои - закомментировал места, где используются UPIO_DWABP и UPIO_DWAPB32,
вызовы tasklet_schedule(tlet), а без
BUG_ON(!tty_locked());

драйвер работать не хочет, попытки заменить его на что-то другое пока к успеху не привели.
Мне посоветовали посмотреть kernel api.
Вот страница с драйвером для Linux:
http://support.advantech.com.tw/support/DownloadSRDetail_New.aspx?SR_ID=1-1W8FZ5&Doc_Source=Download

Пётр.

#4 19.01.2013 08:56:20

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Я и попытался изменить свои - закомментировал места, где используются UPIO_DWABP и UPIO_DWAPB32,

похоже эти константы и правда ни где не используются, но я бы поосторожнее с этим был: объявил бы их у себя...
Quote by Peter
вызовы tasklet_schedule(tlet)

вот это я не понял, зачем....
Quote by Peter
а безBUG_ON(!tty_locked());драйвер работать не хочет, попытки заменить его на что-то другое пока к успеху не привели.

это обычный assert, в этом месте модуль может только упасть... их удалять безопасно...

#5 19.01.2013 09:30:12

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Quote by Peter
Я и попытался изменить свои - закомментировал места, где используются UPIO_DWABP и UPIO_DWAPB32,

похоже эти константы и правда ни где не используются, но я бы поосторожнее с этим был: объявил бы их у себя...

Их просто нет в include/linux/serial_core.h в ядре 3.2, поэтому их надо закомментировать в драйвере.

Quote by Peter
вызовы tasklet_schedule(tlet)

вот это я не понял, зачем....

Так я же сказал, что в ядре 3.2 из структуры uart_state удалили элемент с tlet,
поэтому и вызов для него не работает.

Quote by Peter
а безBUG_ON(!tty_locked());драйвер работать не хочет, попытки заменить его на что-то другое пока к успеху не привели.

это обычный assert, в этом месте модуль может только упасть... их удалять безопасно...

Так это было первое, что я сделал - закомментировал этот вызов, но с этими изменениями драйвер
не работает - 1-я команда через порт проходит, но вся программа после этого зависает.
Интефейс зависает, во всяком случае.

Я делал поиск в Интернете по tty_locked(), действительно, его просто удаляют.
Благодарю за интерес к моей проблеме.

Пётр.

#6 19.01.2013 10:12:20

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Так это было первое, что я сделал - закомментировал этот вызов, но с этими изменениями драйвер не работает - 1-я команда через порт проходит, но вся программа после этого зависает.Интефейс зависает, во всяком случае.

это на 3.0 экспериментировал? а с BUG_ON'ом в dmesg'е ругани нет?

#7 19.01.2013 10:30:28

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Quote by Peter
Так это было первое, что я сделал - закомментировал этот вызов, но с этими изменениями драйвер не работает - 1-я команда через порт проходит, но вся программа после этого зависает.Интефейс зависает, во всяком случае.

это на 3.0 экспериментировал? а с BUG_ON'ом в dmesg'е ругани нет?

Так я же говорил, что с ядром 3.0 драйвер работает. В его тексте предусмотрена ветка 3.x.

Пётр.

#8 19.01.2013 16:09:02

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Так я же говорил, что с ядром 3.0 драйвер работает. В его тексте предусмотрена ветка 3.x.

смотри: на 3.2 хрен знат почему не работает...
если с закомментированным BUG_ON'ом он не будет работать и на 3.0, то assert'ы каким-то магическим образом всё заставляют работать, иначе дело в других изменениях и tty_locked можно более не говорить....

#9 19.01.2013 16:59:06

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Quote by Peter
Так я же говорил, что с ядром 3.0 драйвер работает. В его тексте предусмотрена ветка 3.x.

смотри: на 3.2 хрен знат почему не работает...
если с закомментированным BUG_ON'ом он не будет работать и на 3.0, то assert'ы каким-то магическим образом всё заставляют работать, иначе дело в других изменениях и tty_locked можно более не говорить....

Вполне возможно, но не зря же автор вставил этот оператор.
Сейчас даже один раз не срабатывает, а в /var/log/kernel.log видно, что происходит крах,
там дамп регистров.

Пётр.

#10 20.01.2013 08:10:08

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Вполне возможно, но не зря же автор вставил этот оператор.

это же assert. автор вставил его только для отладки или, если компилятор его не выкинул, для экстренного завершения... в редких случаях может маскировать другие ошибки.

#11 20.01.2013 08:36:39

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Quote by Peter
Вполне возможно, но не зря же автор вставил этот оператор.

это же assert. автор вставил его только для отладки или, если компилятор его не выкинул, для экстренного завершения... в редких случаях может маскировать другие ошибки.

Да, я уже и сам думаю, что причина где-то глубже, тем более, что я не помню,
чтобы он срабатывал с предидущими ядрами. Возможно, он также играет роль задержки.
Порт открывается, устройства в /dev создаются, но вчера я посмотрел /var/log/kern.log
и оказалось, что что при попытке обращения к порту там оказывается дамп регистров,
какие ещё сообщения, не помню.

Пётр.

#12 21.01.2013 06:48:15

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Если просто закомментировать BUG_ON(!tty_locked());
а tasklet_schedule(tlet) заменить на schedule(), он вызывается и в в другом месте драйвера,
то после попытки обращения к порту в /var/log.kern.log возникают сообщения

BUG: scheduling while atomic: server/3117/0x00010000

server - это имя компьютера, 3117 - это pid, либо 3179 во 2-й раз, за ним другие
сообщения и дамп регистров, после 2-й команды программа зависает.
В самом драйвере atomic не используются.

Пётр.

#13 21.01.2013 09:33:27

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
а tasklet_schedule(tlet) заменить на schedule(), он вызывается и в в другом месте драйвера,

чисто ради исследования человеческой психологии: чем такая замена обусловлена?
на tty_wakeup(state->port.tty) пробовал заменять, как это в ядре сделано?

#14 21.01.2013 09:44:14

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Quote by Peter
а tasklet_schedule(tlet) заменить на schedule(), он вызывается и в в другом месте драйвера,

чисто ради исследования человеческой психологии: чем такая замена обусловлена?
на tty_wakeup(state->port.tty) пробовал заменять, как это в ядре сделано?

Я подумал, что, если там вызывается tasklet_schedule(tlet), то это зачем-то надо, подпрограмма с этим
вызовом имеет в названии wake_up, а т.к. из uart_state удалили tlet, то я и заменил на просто schedule().
Вроде бы я сделал это не сразу же, а в ходе экспериментов.

Пётр.

#15 21.01.2013 10:57:38

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

попробуй вот этот патч:
http://bpaste.net/show/71776/

попытался бекпортировать максимум изменений в 8250.c и serial_device.c

#16 21.01.2013 11:40:14

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Очень благодарен за интерес, попробую.
Я пробовал также просто закооментировать вызов tasklet_schedule(tlet),
но так программа зависает срзу же при 1-м обращении к порту.

Пётр.

#17 21.01.2013 13:15:49

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

попробуй вот этот патч:
http://bpaste.net/show/71776/

попытался бекпортировать максимум изменений в 8250.c и serial_device.c

Очень благодарен за патч! Работает почти нормально, команды проходят и исполняются.
Скажи, пожалуйста, ты сам строил новые 8250.c и serial_core.c?
Если да, то на основании каких документов, т.е. информации?
В используемый дистрибутив должен был входить пакет linux-source, с файлом Changelog
в /usr/share/doc.linux-source/, но в реальности пакета нет, нет и libqt4-multimedia,
хотя должен был быть. Программа на Qt.

Почти нормально - до сих пор, если устройство не отвечало, программа выдавала одну
панельку с сообщением об этом и её можно было закрыть. Теперь она выдаётся много раз,
но, если подержать нажатой Enter, она пропадает и можно работать дальше.

Пётр.

#18 21.01.2013 20:35:23

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Скажи, пожалуйста, ты сам строил новые 8250.c и serial_core.c?
Если да, то на основании каких документов, т.е. информации?


я же сразу написал, что делать:
Quote by Fat-Zer
во-вторых, если это то о чём я думаю, то сравни изменения в ядре в drivers/tty/serial/serial_core.c , аналогично измени свои...

так и поступил: положил перед собой в gvimdiff'е версию от производителя, из 3.0 и из 3.2. если в ядре изменений нет, то оставлял как в драйвере. если старая версия совпадает с вендорной, то заменял новой, если все три различные, то /dev/brain в помощь.

может я и слишком многое там так исправил...

Quote by Peter
В используемый дистрибутив должен был входить пакет linux-source, с файлом Changelogв /usr/share/doc.linux-source/, но в реальности пакета нет, нет и libqt4-multimedia,хотя должен был быть. Программа на Qt.

не распарсил.

Quote by Peter
Почти нормально - до сих пор, если устройство не отвечало, программа выдавала однупанельку с сообщением об этом и её можно было закрыть. Теперь она выдаётся много раз,но, если подержать нажатой Enter, она пропадает и можно работать дальше.

а можно ли в исходниках этой программки посмотреть, при каком условии эта программка выдаёт такую панельку?
если исходников нет, то можно разницу strace'ов раскурить попробовать на старой и новой версиях... или через какую-либо другую отладку...

#19 22.01.2013 05:00:57

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Дело в том, что у меня в этом дистрибутиве нет исходного кода ядра, если бы был,
я, конечно, сравнил бы его с кодом ядра 3.0.

Программа моя, так что, конечно, помотреть будет можно, но я сначала сам посмотрю,
т.к. эта часть была написана не помню сколько лет назад и просто переносится
из одной программы в другую. Сейчас там добавился только анализ одной переменной,
указывающей, для какого канала вызвана подпрограма посылки команды,
но к логике работы это отношения не имеет.

Пётр.

#20 22.01.2013 09:45:06

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Дело в том, что у меня в этом дистрибутиве нет исходного кода ядра, если бы был,я, конечно, сравнил бы его с кодом ядра 3.0.

на kernel.org то не забанили же...
Quote by Peter
но к логике работы это отношения не имеет.

скорее тут ошибка не в логике программы, а в драйвере... хорошо было бы знать на каком системном вызове и какую ошибку он возвращает в старом и новом варианте...

#21 22.01.2013 13:42:51

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Quote by Peter
Дело в том, что у меня в этом дистрибутиве нет исходного кода ядра, если бы был,я, конечно, сравнил бы его с кодом ядра 3.0.

на kernel.org то не забанили же...

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

Quote by Peter
но к логике работы это отношения не имеет.

скорее тут ошибка не в логике программы, а в драйвере... хорошо было бы знать на каком системном вызове и какую ошибку он возвращает в старом и новом варианте...

Попытаюсь выяснить. Возможно, это всё же недоработка программы, но раньше такого не было.

Пётр.

#22 23.01.2013 09:59:34

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Вчера я получил ещё одно письмо от сайта Advantech. Подписано было webmaster,
с предупреждением красным не отвечать на него, но там были email разработчика
и его босса, а в самом письме сообщалось, что есть MIC-3612/3 и скопирована его
аннотация со списком поддерживаемых ОС - всякие Windiws и Linux 2.4.

Я написал разработчику, что я удивлён, т.к. драйвер v.3.35 поддерживает
Linux 3.x и сегодня он прислал мне v.3.37. Там точно также вместо
BUG_ON(!tty_locked()) используется tty_wakeup(tty_struct tty).

И так же, если устройство не ответило, панелька с сообщением об ошибке
выдаётся много раз, во всяком случае, окно программы начинает моргать
и так же это прекращается, если подержать нажатой Enter.

Я хотел вставить присланный архив в спойлер, но не поучается.

Пётр.

#23 23.01.2013 18:49:57

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
И так же, если устройство не ответило, панелька с сообщением об ошибкевыдаётся много раз, во всяком случае, окно программы начинает моргатьи так же это прекращается, если подержать нажатой Enter.

или тот разработчик тоже не очень много понимает, или где-то в поведении ядра изменения произошли...
есть возможность программку с каким-нить другим портом попробовать?

Quote by Peter
Я хотел вставить присланный архив в спойлер, но не поучается.

вставь на какой-нить pastebin для начала... интересно посмотреть.... давно пора что-то для прикрепления файлов на форум прикрутить...

#24 23.01.2013 19:43:58

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Думаю, что произошли изменения в ядре. Я запускал программу в strace,
но из вывода ничего не извлёк. Много строк с POLLIN.

pastebin никогда не пользовался. М.б., лучше на email?

Пётр.

#25 23.01.2013 22:16:24

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

What instead tty_locked()?

Quote by Peter
Я запускал программу в strace,но из вывода ничего не извлёк. Много строк с POLLIN.

это не интересно.... тут могут быть интересны ioctl,fcntl,read,write,open,close, но вывод strace'а всё равно раскуривать тяжело...
проще по исходникам, раз уж они есть, посмотреть условие вывода этих окон...

Quote by Peter
pastebin никогда не пользовался. М.б., лучше на email?

1. сделай патч: diff -ru /путь/к/старому/драйверу/3.x /путь/к/новому/драйверу/3.2 >/tmp/my.patch
2. открой my.patch в текстовом редакторе и скопируй в буфер обмена
3. зайди на https://gist.github.com/ и вставь
потом нужную ссылку сюда...

#26 24.01.2013 05:59:59

Peter
Administrator
Зарегистрирован: 31.03.2010
Сообщений: 2 445
IP-адрес

What instead tty_locked()?

Вот ссылка, там строки закнчиваются символом CR, т.к. вставлять пришлось
в Windows через Блокнот.
https://gist.github.com/4618025

Пётр.

Board footer