Problema de driver Ethernet personalizado
Pergunta
Não sei se essas perguntas são relevantes aqui ou superusuário, mas pergunte de qualquer maneira.
Eu mencionei a configuração abaixo- um sistema de PC para desktop Linux. Para isso, está conectado uma placa de desenvolvimento FPGA personalizada. Neste FPGA, há um IP da placa de rede Ethernet realizado e executando. Esta placa está conectada à placa de desenvolvimento FPGA usando o cabo USB portas-USB e o cabo serial. Essencialmente, toda essa configuração testa a placa de rede baseada em FPGA e os drivers Ethernet associados realizados nele.
Existem muitas aplicações que são executadas no PC do Host Linux e enviam os dados para o cartão Ethernet N/W baseado em FPGA, que o aceita, faz o processamento necessário e envia para a camada física realizada no FPGA, que o envia sobre o Rede Ethernet para algum outro nó/dispositivo na rede.
Essa configuração funciona bem, mesmo quando vários aplicativos do host-PC enviam dados para a placa de rede FPGA. Como um dos aplicativos, uso um player VLC baseado em Linux (é um jogador multimídia) para reproduzir alguns fluxos multimídia do host Linux e esses dados são enviados para a placa de rede FPGA. No Player VLC, procuro (reverter/ encaminhar) o fluxo usando os controles do player VLC. Quando faço essa operação de busca continuamente, ele torna o PC do host Linux. pendurar/congelar. Não há trabalho de dispositivo de E/S, apenas a reinicialização funciona.
Agora eu tentei ver os logs no host Linux PC/var/log (DMESG) para ver se eu recebo uma pista sobre o processo/aplicativo causou o congelamento, mas não consegui obter nenhuma entrada dele.
Como faço para isolar diferentes componentes (software, hardware) envolvidos em toda essa configuração minha para restringir a causa raiz do problema?
Existe alguma maneira de se comunicar com o host linux congelado por meio de alguns meios (cabo serial ou alguma outra conexão para obter qualquer dados dele quando pendurar?
Que etapas eu devo seguir? Como posso saber se o aplicativo VLC é um problema ou o driver da placa de rede FPGA é um problema, ou a outra coisa?
Quaisquer indicadores serão úteis.
Obrigado.
-DE ANÚNCIOS.
Solução
Você menciona que o host Linux está congelado. Primeiro, eu determinaria se está realmente bloqueado no kernel ou se há alguns processos espaciais do usuário que consomem muito CPU.
O host pode ser pingado (de preferência em uma interface separada do seu cartão Ethernet FPGA)? Se responder, o kernel não está trancado.
Problema de hardware?
Se possível, a configuração pode ser alterada temporariamente para remover o cartão FPGA Ethernet e depois reproduzir o problema? Eu faria isso para ajudar a isolar problemas especificamente relacionados ao hardware (FPGA Ethernet).
Problema de espaço do usuário (software)?
Se você remover o VLC da equação, ainda poderá obter o bloqueio/pendurar usando outro método para gerar tráfego Ethernet?
Você pode tentar criar um shell que seja executado com uma prioridade mais alta para recuperar dados quando o sistema parece pendurar. Talvez, executando o top neste shell de alta prioridade, você possa determinar quem, se alguém, está usando toda a CPU. Você pode executar esse shell pela rede (telnet/ssh) ou através de um terminal serial.
#include <errno.h>
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
struct sched_param scheduling_parameters;
scheduling_parameters.sched_priority = 10;
if (sched_setscheduler(getpid(), SCHED_FIFO, &scheduling_parameters) < 0) {
printf("error is %d\n", errno);
}
execlp("/bin/bash", "bash",0, 0, 0, 0);
return 0;
}
Problema do kernel (software)?
Você pode ativar o Chave Magic Sysrq e examine o estado do sistema e vá a partir daí. Os desenvolvedores do kernel usam essa interface para depurar seu software. A opção config_magic_sysrq deve ser ativada no tempo de compilação do kernel para usar essa funcionalidade.
Depois de estreitar empiricamente um bug em um módulo específico, o printk () ainda é um bom recurso.
Também pode ser útil ativar o depurador do kernel (Kdb) e conecte -se a ele através de um cabo serial.
Outras dicas
@Jscheimer: Obrigado por um ponteiro detalhado sobre o meu problema. Após muita depuração e algumas discussões com outros desenvolvedores de sistemas no local de trabalho, finalmente encontrei a causa raiz. Há um periférico DMA que entra em cena em toda essa configuração. O DMA foi comparado para acesso alinhado, mas em algum lugar em alguma transferência de dados estava recebendo um endereço inalignado, como resultado de não verificar o alinhamento do buffer por mim no código, que estava causando o Hang/Freeze. E não havia padrão para esse comportamento.