LINUX.ORG.RU

Почему write(fd,..) висит?

 , ,


0

1

Приветствую

В продолжении темы Рестартануть драйвер как?

нашел как из консоли бесконечно количество раз рестартить драйвер

systemctl stop ***.service
echo spi0.0 > /sys/bus/spi/drivers/flexfb/unbind 
echo spi0.0 > /sys/bus/spi/drivers/flexfb/bind
systemctl start ***.service

делают тоже самое на сях как

static int setSPI(bool mode)
{
    const char
        * flexfb,
        spi[] = "spi0.0";

    if (mode)
    {
        flexfb = "/sys/bus/spi/drivers/flexfb/bind";
        fputs("Start spi device\n", stderr);
    }
    else
    {
        flexfb = "/sys/bus/spi/drivers/flexfb/unbind";
        fputs("Stop spi device\n", stdout);
    }

    int rt = -1;
    int fd = open(flexfb, O_WRONLY);
    if (fd > 0)
    {
        if ((rt = write(fd, spi, sizeof(spi))) <= 0)
            fprintf(stderr, "ERROR set SPI: %d %s [%s]\n", errno, strerror(errno), flexfb);
        close(fd);
    }
    else
        fprintf(stderr, "ERROR open %s: %d %s\n", flexfb, errno, strerror(errno));

    return rt;
}

уже без всяких systemctl просто запускаю и останавливаю приложение и в какой то момент на write(fd не снимаемая БЛОКИРОВКА

где может быть у меня косяк?

★★★

Последнее исправление: wolverin (всего исправлений: 1)

Ответ на: комментарий от wolverin

Это не всегда так. Если процесс закроет эти дескрипторы (например, при демонизации), то новые могут получить такие же номера. Кстати, именно поэтому у Стивенса рекомендуется при создании демона открыть /dev/null три раза, чтобы функции работающие со стандартными потоками ввода и вывода, не нанесли вреда, записав или прочитав не в тот сокет.

petr8
()
Ответ на: комментарий от wolverin

при fd ==0 такая вот строчка не вполне корректна:

fprintf(stderr, "ERROR open %s: %d %s\n", flexfb, errno, strerror(errno));

поскольку errno выставляется только при fd == -1, о чем в доках свидетельствует недвусмысленная строка.

https://man7.org/linux/man-pages/man2/open.2.html

On error, -1 is returned and errno is set to indicate the error.
alysnix ★★★
()
Ответ на: комментарий от iliyap

Эх только в понедельник смогу проверить, но шанс не велик, тк и через syscall самого драйвера через 2-3 рестарта приводило к зависанию (

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)

″echo″ передаёт символ перевода строки, а вы ″NUL″.

write() проверяют на число записаных символов.

Между двумя ″echo >″ времени существенно больше, чем между двумя ″setSPI()″, если у вас в коде они вызываются без задержки. Может в драйвере какой race возникает. Вобще, возможно, что нужно сначал где-то в /sys проверять, что unbind завершился и только потом делать bind...

mky ★★★★★
()
Ответ на: комментарий от mky

\n ещё не успел проверить, но подозреваю не поможет, так как перезагрузка драйвера с помощью syscall тоже приводит через несколько раз к зависанию причем всей ОС с руганью в dmesg

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

За идею проверки завершения спасибо попробую.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

Насчёт ″\n″ непредсказуемо, например, в man core написано:

/proc/sys/kernel/core_pattern is empty

но это подразумевает echo > /proc/sys/kernel/core_pattern, то есть запись ″\n″,
а не : > /proc/sys/kernel/core_pattern — просто обнуление файла.

И ещё, sh в ваших примерах делает:
openat(AT_FDCWD, "filename", O_WRONLY|O_CREAT|O_TRUNC, 0666)
использовать openat() или open(), ИМХО, не важно, а вот выставление флага ″O_TRUNC″ может влиять.

mky ★★★★★
()
Ответ на: комментарий от mky

не помог ни \n ни O_TRUNC

НО удалось вытащить из дмесг о чем там ругается (в консоль больше не пускает, но система отвечает на ping)

################ 1 bind
[Sun Oct 22 15:49:31 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory,                              fps=20, spi0.0 at 40 MHz
[Sun Oct 22 15:49:31 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
################ 2 bind
[Sun Oct 22 15:50:11 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 15:50:11 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
################ 3 bind
[Sun Oct 22 15:50:57 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 15:50:57 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
################ 4 bind
[Sun Oct 22 15:51:40 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 15:51:40 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 15:51:46 2023] Unable to handle kernel paging request at virtual address 95c00074
[Sun Oct 22 15:51:46 2023] pgd = df670b00
[Sun Oct 22 15:51:46 2023] [95c00074] *pgd=5dd8e003, *pmd=00000000
[Sun Oct 22 15:51:46 2023] Internal error: Oops: 206 [#1] SMP ARM
[Sun Oct 22 15:51:46 2023] Modules linked in: uvcvideo nls_ascii cedar_ve(O) 8189es(O) brcmfmac brcmutil xradio_wlan(O) 88XXau(O) 8821cu(O) g_mass_storage fbtft_device(C) flexfb(C)
[Sun Oct 22 15:51:46 2023] CPU: 1 PID: 9637 Comm: sshd Tainted: G         C O    4.14.111 #126
[Sun Oct 22 15:51:46 2023] Hardware name: sun8i
[Sun Oct 22 15:51:46 2023] task: dece4b00 task.stack: dee4e000
[Sun Oct 22 15:51:46 2023] PC is at __kmalloc_track_caller+0xbc/0x1a4
[Sun Oct 22 15:51:46 2023] LR is at 0x244
[Sun Oct 22 15:51:46 2023] pc : [<c032b1fc>]    lr : [<00000244>]    psr: a00f0013
[Sun Oct 22 15:51:46 2023] sp : dee4fd80  ip : 95c00074  fp : 00000000
[Sun Oct 22 15:51:46 2023] r10: a00f0013  r9 : 00000001  r8 : 1ea89000
[Sun Oct 22 15:51:46 2023] r7 : c086521c  r6 : 014102c0  r5 : df4019c0  r4 : de95b7ff
[Sun Oct 22 15:51:46 2023] r3 : 00000000  r2 : c106c184  r1 : dee4fd80  r0 : 00000243
[Sun Oct 22 15:51:46 2023] Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
[Sun Oct 22 15:51:46 2023] Control: 30c5387d  Table: 5f670b00  DAC: 3f1635e1
[Sun Oct 22 15:51:46 2023] Process sshd (pid: 9637, stack limit = 0xdee4e210)
[Sun Oct 22 15:51:46 2023] Stack: (0xdee4fd80 to 0xdee50000)
[Sun Oct 22 15:51:46 2023] fd80: dee4fdc7 014000c0 014000c0 c086521c 00000800 c08c28e0 ffffffff c0865164
[Sun Oct 22 15:51:46 2023] fda0: de523500 0000077f 014000c0 df534300 00000001 c086521c dee4fdc7 dee4ff00
[Sun Oct 22 15:51:46 2023] fdc0: 00000000 00000080 ddf40790 00000630 00000001 ddf40640 dee4fea8 ddf4073c
[Sun Oct 22 15:51:46 2023] fde0: 00007d78 c08c28e0 dee4e000 00000050 00000050 ddf40790 00000001 ddf40640
[Sun Oct 22 15:51:46 2023] fe00: 00000000 c08c3448 00000000 0058c6f8 00000004 000005b4 00010000 00000000
[Sun Oct 22 15:51:46 2023] fe20: dee4fe38 dee4fe3c 00000040 00000000 00000001 00000000 00000000 00000008
[Sun Oct 22 15:51:46 2023] fe40: 00000000 dee4e000 00000008 00000000 de101b40 00007d78 00000000 000029e7
[Sun Oct 22 15:51:46 2023] fe60: deb86b84 c1060000 c1260cc3 ddf40640 00000050 dee4fea8 00000000 dee4ff20
[Sun Oct 22 15:51:46 2023] fe80: dec143c0 00000004 0056f7fc c08c3ee8 dee4ff08 00000000 dee4ff18 c085e6e8
[Sun Oct 22 15:51:46 2023] fea0: 00000001 c085e780 00000000 00000000 00000001 00000000 00000050 dee4ff00
[Sun Oct 22 15:51:46 2023] fec0: 00000001 dee4ff5c 00000000 00000000 00000040 dee4ff20 de101b40 dec143c0
[Sun Oct 22 15:51:46 2023] fee0: dee4ff88 00000000 00000000 00000050 00000000 c033e6c0 00000050 e080200c
[Sun Oct 22 15:51:46 2023] ff00: 00593688 00000050 00000001 00000000 00000050 dee4ff00 00000001 dee4ff5c
[Sun Oct 22 15:51:46 2023] ff20: dec143c0 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[Sun Oct 22 15:51:46 2023] ff40: 0000918c 00000050 dec143c0 00593688 dee4ff88 c0222184 dee4e000 c033e8e0
[Sun Oct 22 15:51:46 2023] ff60: c0222184 bee07234 00000008 dec143c0 dec143c0 00000050 00593688 c0222184
[Sun Oct 22 15:51:46 2023] ff80: dee4e000 c033eb0c 00000000 00000000 2ef347ed 0057df78 00000050 00000003
[Sun Oct 22 15:51:46 2023] ffa0: 00000004 c0221f80 0057df78 00000050 00000003 00593688 00000050 0056f7fc
[Sun Oct 22 15:51:46 2023] ffc0: 0057df78 00000050 00000003 00000004 bee072a4 bee072a8 00570604 0056f7fc
[Sun Oct 22 15:51:46 2023] ffe0: 00000000 bee0720c 00504cf9 b6b9e0c6 200f0030 00000003 00000000 00000000
[Sun Oct 22 15:51:46 2023] [<c032b1fc>] (__kmalloc_track_caller) from [<c0865164>] (__kmalloc_reserve+0x24/0x70)
[Sun Oct 22 15:51:46 2023] [<c0865164>] (__kmalloc_reserve) from [<c086521c>] (__alloc_skb+0x6c/0x134)
[Sun Oct 22 15:51:46 2023] [<c086521c>] (__alloc_skb) from [<c08c28e0>] (sk_stream_alloc_skb+0x4c/0x1c0)
[Sun Oct 22 15:51:47 2023] [<c08c28e0>] (sk_stream_alloc_skb) from [<c08c3448>] (tcp_sendmsg_locked+0x360/0xdd8)
[Sun Oct 22 15:51:47 2023] [<c08c3448>] (tcp_sendmsg_locked) from [<c08c3ee8>] (tcp_sendmsg+0x28/0x3c)
[Sun Oct 22 15:51:47 2023] [<c08c3ee8>] (tcp_sendmsg) from [<c085e6e8>] (sock_sendmsg+0x14/0x24)
[Sun Oct 22 15:51:47 2023] [<c085e6e8>] (sock_sendmsg) from [<c085e780>] (sock_write_iter+0x88/0xbc)
[Sun Oct 22 15:51:47 2023] [<c085e780>] (sock_write_iter) from [<c033e6c0>] (__vfs_write+0xd0/0x128)
[Sun Oct 22 15:51:47 2023] [<c033e6c0>] (__vfs_write) from [<c033e8e0>] (vfs_write+0xa4/0x1ac)
[Sun Oct 22 15:51:47 2023] [<c033e8e0>] (vfs_write) from [<c033eb0c>] (SyS_write+0x44/0x9c)
[Sun Oct 22 15:51:47 2023] [<c033eb0c>] (SyS_write) from [<c0221f80>] (ret_fast_syscall+0x0/0x4c)
[Sun Oct 22 15:51:47 2023] Code: 0affffe7 e35c0000 0a000002 e5953014 (e79c3003)
[Sun Oct 22 15:51:47 2023] ---[ end trace 501b9448ece7c31e ]---

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

погонял сейчас в варианте опять без всяких биндов и пауз из своего бинарника через эху

echo spi0.0 > /sys/bus/spi/drivers/flexfb/unbind && echo spi0.0 > /sys/bus/spi/drivers/flexfb/bind && ./приложуха

12 раз рестартанул - никаких ошибок, временной интервал из дмесга

[Sun Oct 22 16:47:47 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:47:47 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:48:35 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:48:35 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:49:02 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:49:02 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:49:28 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:49:28 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:49:55 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:49:55 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:50:23 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:50:23 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:50:49 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:50:49 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:51:03 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:51:03 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:51:24 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:51:24 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:51:50 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:51:50 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe
[Sun Oct 22 16:52:16 2023] graphics fb1: flexfb frame buffer, 480x480, 450 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 40 MHz
[Sun Oct 22 16:52:16 2023] leds-gpio leds: could not find pctldev for node /soc/pinctrl@01f02c00, deferring probe

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

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

но это пока не точно, просто вынес unbind за бинарник и тоже ошибка не воспроизводится.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

гонка оказалось не причем, просто некорректно использовал чужой код для освобождения занятого /dev/fb1 перед unbind, после чего драйверу сносило крышу ))

всем спасибо за помощь.

wolverin ★★★
() автор топика