Linux PCIe XDMA Оработка прерываний xdma0_events_0 блокируется после одного прерывания

Потребовалось написать обработку прерываний, по итогу столкнулся со следующей проблемой, с кнопки на плате event_0 проходит стабильно и в консоли прерывание отображается корректно, но если запускать спам пакетов, то после того как память заполняется и шлется прерывание с самой платы, система блокируется, драйвер стоит, в системе отображается /dev/xdma0_events_0, как снять блокировку после получения прерывания..? Прикладываю код обработки прерывания.

#include <QCoreApplication>

#include "Shared/xdma_linux.h"
#include "Shared/Linux.h"

#include <string>
#include <thread>
#include <vector>
#include <fstream>
#include <poll.h>

#include <sys/socket.h>

#define RW_MAX_SIZE 0x7ffff000

struct pollfd fds[1];
int fd;


int main_event(int* suc_flag)
{
    int fd = open("/dev/xdma0_events_0",O_RDWR | O_SYNC | O_NONBLOCK);
    if (fd == -1)
        fprintf(stderr, "ERROR: [open] fd = %d %s\n", fd, "fd_path: /dev/xdma0_events_0");


    try
    {
        auto event_loop = [&](unsigned event_id)
        {
            int rc;

            int read_interrupt = 0;
            int interput_buff = 0;
            int i = 0;

            while (true)
            {
                fds[event_id].fd = fd;
                fds[event_id].events = POLLIN;

                rc = poll(fds, 1, 10);

                if (rc == -1)
                {
                    fprintf(stderr, "ERROR: [poll] rc = %d\n", rc);
                    continue;
                }
                else if (rc > 0)
                {
                    if (fds[event_id].revents & POLLIN)
                    {
                        i++;

                        fprintf(stderr, "SUCCESS: interrupt find!\n");
                        fprintf(stderr, "Iteration number: %d\n", i);
                        fprintf(stderr, "Path: /dev/xdma0_events_%d\n", event_id);
                        fprintf(stderr, "fd: %d\n", fds[event_id].fd);
                        fprintf(stderr, "events: %d\n", fds[event_id].events);
                        fprintf(stderr, "revents: %d\n\n", fds[event_id].revents);

                        read_interrupt = read(fds[event_id].fd, &interput_buff, 4);
                        if (read_interrupt != -1)
                        {
                            *suc_flag = 1;
                            fprintf(stderr, "SUCCESS: read complite!\n");
                            fprintf(stderr, "Readed bytes: %d\n", read_interrupt);
                        }
                        else
                        {
                            fprintf(stderr, "ERROR: [read] r =  %d\n", read_interrupt);
                            *suc_flag = -1;
                        }
                    }
                }
            }
        };

        std::thread event_threads[] =
        {
            std::thread(event_loop, 0)
        };

        for (auto& t : event_threads)
        {
            t.join();
        }

    }
    catch (const exception& e)
    {
        fprintf(stderr, "Ошибка: %s%c", e.what(), '\n');
        return -1;
    }
}

Ответы (0 шт):