LINUX.ORG.RU

Сообщения k000858

 

systemd -> python3-loop

 ,

Всем привет!

Имеется питоновый скрипт (в нем много чего но сузил до минимума что бы обозначить проблему)

#!/usr/bin/python3

import time

print("HelloWorld")

if __name__ == '__main__':
	print("-main-")
	while True:
		print("-loop-")
		time.sleep(5)

При запуске скрипта вручную, все хорошо - цикл крутится, мессаги сыпятся.

При запуске из systemd нет даже «HelloWorld». Стоит из скрипта убрать «while True:» как скрипт начинает нормально запускаться из systemd

В systemd скрипт запускается через

User=root
ExecStart=python3 <путь>/my.py

Это что то нитак с py (теоретически в нем может быть много всего вплоть до работы с железом и тд, не хотелось бы его менять) ? Или в systemd такого рода скрипт нужно по-другому запускать?

k000858
()

Сборка Uboot

 , , ,

Всем привет!

Собираю Uboot для MIPS32R2 с помощью тулчейна, собранного в buildroot (2018.02.9). Образ загрузчика собирается, все ок. Проблема в следующем: размер образа загрузчика получается значительно больше чем получается у вендора, от кого и были получены исходники uboot для его железа.

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

Быть может я при сборке тулчейна что то не учел, в связи с чем он компилирует в последствии такой жирный бинарник? может какие то опции надо было выбрать специфичные?

k000858
()

Видимость функций

 ,

OpenWrt: в ядре есть cfg80211, скомпилен как модуль ядра, так же есть драйвер который скомпилен как модуль ядра. Необходимо сделать так, что бы драйвер видел функции модуля cfg80211. Как сделать?

k000858
()

Трассировка выполнения функций ядра

 ,

Всем привет!

Часто случается, что во время отладки дров или какого то программного модуля в ядре, возникает необходимость понять, какая функция за какой вызывается в том или ином исходничке. Для этих приходится тупо вставлять printk, компилить, смотреть на результат, затем снова printk и так до посинения, пока не завершишь интересующий тебя «reverse-engenering.»

Быть может есть в ядре, стандартные способы снятия такой трассировки? из опробованных strace (и подобных) научился только этой самой тулзой запускать какой то процесс (по сути бинарник в user-space) и только в этих условиях видеть цепочки вызовов. А для ядреных процессов такой не нашлось

k000858
()

Самый интересный проект

 , ,

Каждая работа, даже если она интересная, даже если она выросла из хобби, рано или поздно становится рутиной. Наверняка, каждый из вас в данный момент или в будующем будет на таком этапе. Но не смотря на это, все же бывают по-настоящему интересные проекты. Расскажите о своем самом интересном проекте за время вашей профессиональной деятельности. Особенно программисты, которые занимаются этим профессионально.

k000858
()

Python: сборка модуля в Buildroot'е

 , ,

Собираю питоновский модуль в билдруте (то есть вместе с рутфс линукса), питон3. Сам модуль оформлен в виде пакэйджа (билдрут стайл) по примеру соседних пакэйдей (тоже питоновских модулей). Модуль pandas - строиться на модуле numpy. Numpy есть родной в билдруте (тоже оформлен в виде пакейджа билдрут стайл). Проблема заключается вот в чем: при сборке родительский модуль не видит уже скомпилированные подмодули - в частности Numpy.

Например:

в setup.py

setup(
 'setup_requires': ['numpy >= {numpy_ver}'.format(numpy_ver=min_numpy_ver)],
)
вызывает скачивание модуля (по видимому pip'ом) модуля Numpy (хотя он уже есть и собрался).

там же

numpy_incl = pkg_resources.resource_filename('numpy', 'core/include')
приводит к ошибке ModuleNotFoundError: No module named 'numpy'

Может есть какие то ньюансы при сборке на хосте а не запуске модуля на таргете?

k000858
()

Организация GIT-репозитория

 ,

Есть корпоративный репозиторий (Gitlab). Необходимо дать публичный доступ, но с оговоркой: видна должна быть только ветка master, т.е. вся внутренняя кухня (текущая разработка) видна быть не должно до попадания в мастер. Знаю, что в силами самого Git-а доступ (по сути видимость) веток не разграничить. Пока видится одно решение, на мой взгляд костыльное: создать форк основного репозитория, мастер форка синкается с мастером основного репозитоия, наружу дать доступ только до форка.

Может есть более изящный способ такое осуществить?

k000858
()

Проприетарный драйвер

 , ,

Есть дистрибутив, который необходимо выкладывать в открытый доступ, и который включает драйвер, скачанный из интернета (считай сворованный). Необходимо чтобы все компилировалось, но исходники проприетарного драйвера светить нельзя. Очевидный выход - завернуть исходники в блобы (предкомпилированный бинарник). Это нарушит лицензию? Что если автору проприетарного драйвера это не понравится, что он может от меня потребовать? Как обойти эти заморочки с лицензиями?

k000858
()

OpenWrt: производительность PPPL2TP/PPtP

 ,

Есть роутер, на него собрана прошивка из последних исходников openWrt. В билд включена поддержка протоколов + xl2tp. В ПО включена софтварная.хардварная разгрузка потоков. При этом производительность l2tp < 300Mbits/s. Как так?

Судя по отладочное инфе, поток TCP (iperf3) разгружается т.к. он идет транзитом (FORWARD). UDP же (на основе которого реализуется PPP) под разгрузку не попадает т.к. пакеты INPUT/OUTPUT

https://www.kernel.org/doc/Documentation/networking/nf_flowtable.txt

Что может так тормозить? Как можно попробовать продиагностировать?

ЗЫ: на альтернативном ПО этот же роутер выдавливает раза в два больше скорости по l2tp

k000858
()

Ubuntu-16: .config из /home/user в /media/user/disk/ (VSCode, Sublime-Text, etc)

 , ,

Ubunta установлена в VirtualBox на виртуальный диск (ограниченного размера, расположенный на SSD), в системе подключен второй виртуальный (Hard), на котором происходит компиляция и прочая работа с файлами (/media/user/disk/). В работе используется такой софт как Visual Studio Code, Sublime-Merge, и тд), который очень любит индексировать весь контент в рабочем пространстве и при этом складывает весь этот кэш в /home/user/.config (гигабайты), чем съедает ни мало ограниченного SSD. Хотелось бы перенести эти самые кэши на файлопомойку к остальным файлам (/media/user/disk/).

Как это можно сделать? Может в самих программах а может на уровне системы?

k000858
()

Wireless драйвер: ioctl SIOCGIWNAME

 ,

Имеется wifi чип, драйвер под openwrt (4.14.*). Драйвер исправно работает (wifi так же работает хорошо), однако не могу до драйвера не могу достучаться через ioctl - при попытке не происходит вызова .ndo_do_ioctl колбэка. Достучаться в основном пытаюсь с помощью команды SIOCGIWNAME (да и многими другими, которые в драйвере описаны), однако например 0x8947 команда колбэк все же вызывает.

От чего это зависит? как заставить драйвер работать с любыми командами (повторюсь, нужно что бы хотя обработчик срабатывал, сами команды уже описаны в обработчике)

k000858
()

Packet Processing Engine (PPE): NAT Offload

 ,

Кто нибудь имел дело с программной поддержкой такой аппаратной фичи?

Сейчас маюсь с таким модулем SoC'а MT7621. Имеется в наличии фирменная библиотека Ralink, активирующая такую фичу, прикрутил ее к OpenWRT в связке с фирменным ethernet драйвером. Но хардварный нат так и не заработал.

Проблема в том, что нет понимания (хотя бы абстрактного) как это должно работать. Сейчас имею примерно такое представление: каждый полученный ethernet фрейм до попадания в драйвер (то есть в память CPU = OS) проходит через со-процессор PPE, который в дескрипторах фрейма прописывает определенные поля (каждого фрейма) и меняет адреса в IP заголовках (если пакет подлежит ре-трансляции).

Поправьте меня, если я неверно представляю себе механизм работы.

В моем случае, нет никаких признаков работы со-процессора, то есть нет записей в дескрипторах полученных фреймов. Может натолкнете в верном направлении, куда капать? Может кто то сталкивался с подобной задачей или имел дело с аппаратным натом Ralink.

PS: регистры PPE при иниализации прописываются корректно

k000858
()

Связка /dev/file с /proc/devices/file

 ,

Ковыряю связку driver + tool не могу кое что понять.

Драйвер создает символьное устройство (создается соответствующий файл в /proc/devices), а тулза создает файл в /dev с таким же название и таким же номером через mknod. В последствии тулза взаимодействует (считывает/записывает параметры) с устройством через ioctl файла в /dev

Получается, файл в /dev как то связывается с устройством (тоже по сути файлом) в /proc/devices. Я ошибаюсь, если думаю, что ОС сама как то осуществляет эту связку? Как тогда это работает?

k000858
()

Расшифровка краха

 , ,

Отлаживаю драйвер ethernet, ядро-4.14.* (openwrt)

Крах происходит при повышении количества исходящего трафика.

Быть может кто то сможет по дампу направить, куда примерно капать?

[  121.145173] INFO: rcu_sched self-detected stall on CPU
[  121.155397] 	0-...: (1 GPs behind) idle=bd6/2/0 softirq=2552/2553 fqs=2991 
[  121.169232] 	 (t=6000 jiffies g=1283 c=1282 q=294)
[  121.178767] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.14.34 #0
[  121.190705] Stack : 00000000 00000000 00000000 00000000 80687ada 00000034 00000000 00000000
[  121.207332]         805026f4 80502287 804948bc 00000000 00000000 00000001 8fc09b70 2c45ddf5
[  121.223958]         00000000 00000000 80680000 00001c18 00000000 00003656 00000007 00000000
[  121.240584]         00000000 80500000 0002ba4f 00000000 00000000 00000000 80510000 804098a4
[  121.257210]         80507c60 805000ac 000000e0 80500000 00000003 8027ccb8 00000000 80680000
[  121.273838]         ...
[  121.278695] Call Trace:
[  121.283578] [<80010498>] show_stack+0x58/0x100
[  121.292426] [<803e53dc>] dump_stack+0x9c/0xe0
[  121.301085] [<8000d9d8>] arch_trigger_cpumask_backtrace+0x50/0x78
[  121.313207] [<800838c8>] rcu_dump_cpu_stacks+0xc4/0x13c
[  121.323593] [<80082d24>] rcu_check_callbacks+0x310/0x814
[  121.334161] [<80086294>] update_process_times+0x34/0x70
[  121.344566] [<80096d2c>] tick_handle_periodic+0x34/0xd0
[  121.354969] [<802fab78>] gic_compare_interrupt+0x48/0x58
[  121.365534] [<80076740>] handle_percpu_devid_irq+0xbc/0x1a8
[  121.376630] [<80070ab0>] generic_handle_irq+0x40/0x58
[  121.386692] [<8023a874>] gic_handle_local_int+0x84/0xd0
[  121.397078] [<8023aa34>] gic_irq_dispatch+0x10/0x20
[  121.406772] [<80070ab0>] generic_handle_irq+0x40/0x58
[  121.416827] [<80401e0c>] do_IRQ+0x1c/0x2c
[  121.424795] [<80239abc>] plat_irq_dispatch+0xfc/0x138
[  121.434836] [<8000b5a8>] except_vec_vi_end+0xb8/0xc4
[  121.444706] ------------[ cut here ]------------
[  121.453888] WARNING: CPU: 0 PID: 0 at kernel/smp.c:416 smp_call_function_many+0xc8/0x3bc
[  121.469970] Modules linked in: ppp_async ppp_generic iptable_nat iptable_mangle iptable_filter ipt_REJECT ipt_MASQUERADE ip_tables xt_time xt_tcpudp xt_state xt_nat xt_multiport xt_mark xt_mac xt_limit xt_conntrack xt_comment xt_TCPMSS xt_REDIRECT xt_LOG xt_FLOWOFFLOAD x_tables slhc nf_reject_ipv4 nf_nat_redirect nf_nat_masquerade_ipv4 nf_conntrack_ipv4 nf_nat_ipv4 nf_nat nf_log_ipv4 nf_log_common nf_flow_table_hw nf_flow_table nf_defrag_ipv4 nf_conntrack_rtcache nf_conntrack crc_ccitt leds_gpio gpio_button_hotplug
[  121.560848] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.14.34 #0
[  121.572782] Stack : 00000000 00000000 00000000 00000000 80687ada 00000034 00000000 00000000
[  121.589409]         805026f4 80502287 804948bc 00000000 00000000 00000001 8fc09ad8 2c45ddf5
[  121.606036]         00000000 00000000 80680000 00002500 00000000 00003671 00000007 00000000
[  121.622662]         00000000 80500000 00088ed0 00000000 00000000 00000000 80510000 8009e724
[  121.639291]         00000009 000001a0 8000d19c 00000000 00000003 8027ccb8 00000000 80680000
[  121.655919]         ...
[  121.660775] Call Trace:
[  121.665630] [<80010498>] show_stack+0x58/0x100
[  121.674463] [<803e53dc>] dump_stack+0x9c/0xe0
[  121.683125] [<8002e1d8>] __warn+0xe0/0x114
[  121.691265] [<8002e29c>] warn_slowpath_null+0x1c/0x30
[  121.701305] [<8009e724>] smp_call_function_many+0xc8/0x3bc
[  121.712210] [<8000d9f0>] arch_trigger_cpumask_backtrace+0x68/0x78
[  121.724326] [<800838c8>] rcu_dump_cpu_stacks+0xc4/0x13c
[  121.734711] [<80082d24>] rcu_check_callbacks+0x310/0x814
[  121.745271] [<80086294>] update_process_times+0x34/0x70
[  121.755661] [<80096d2c>] tick_handle_periodic+0x34/0xd0
[  121.766052] [<802fab78>] gic_compare_interrupt+0x48/0x58
[  121.776611] [<80076740>] handle_percpu_devid_irq+0xbc/0x1a8
[  121.787691] [<80070ab0>] generic_handle_irq+0x40/0x58
[  121.797736] [<8023a874>] gic_handle_local_int+0x84/0xd0
[  121.808123] [<8023aa34>] gic_irq_dispatch+0x10/0x20
[  121.817819] [<80070ab0>] generic_handle_irq+0x40/0x58
[  121.827862] [<80401e0c>] do_IRQ+0x1c/0x2c
[  121.835830] [<80239abc>] plat_irq_dispatch+0xfc/0x138
[  121.845871] [<8000b5a8>] except_vec_vi_end+0xb8/0xc4
[  121.855746] ---[ end trace 4819de8eb648354a ]---
k000858
()

Получение irq_fwspec

 , ,

Имеется драйвер, в инициализацию которого передается struct net_device. В драйвере необходимо активировать прерывание (через request_irq). Для этого необходимо получить irq_fwspec, зная hwirq (Harware IRQ).

Знаю, что это можно сделать, вызвав irq_find_mapping, но функция требует передачи struct irq_domain*, которой в драйвере нет. Для ее создания требуется в свою очередь struct device_node.

В общем необходимо получить irq_fwspec, имея struct net_device.

Как можно такое осуществить?

Ядро 4.14.* В него интегрирую драйвер, который не использует Device Tree, через который обычно задается irq_fwspec через hwirq.

k000858
()

Потери пакетов: netif_receive_skb = -1

 ,

Адаптирую драйвер сетевого устройства под OpenWRT (kernel-4.14.*), выдранный из SDK с kernel 3.10.*

Драйвер в принципе уже минимально работает (принимает и отправляет пакеты) однако часть пакетов теряется. По-видимому причина в netif_receive_skb = -1.

В каких случаях может такое происходить? Какому флагу соответствует -1 (1 = NET_RX_DROP).

k000858
()

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