XDP droppe des paquets sur Mellanox ConnectX-5, mais pas sur Intel I210

Posté par epotier le 22/01/2025
RÉSOLU

epotier

Membre depuis le 20/02/2020

actif

salut à tous, j'ai un programme xdp en mode natif qui droppe des paquets sur une carte mellanox connectx-5 (driver mlx5_core) alors qu'il marche nickel sur une intel i210 (driver igb). mon programme est tout simple il fait juste un `xdp_pass` après quelques checks. sur la mellanox j'ai genre 10% de drops. la carte est en mode `driver` pas `generic`. je comprends pas pourquoi.

SEC("xdp")
int xdp_prog(struct xdp_md *ctx)
{
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
    struct ethhdr *eth = data;

    if (data + sizeof(struct ethhdr) > data_end)
        return XDP_ABORTED;

    // Quelques checks basiques ici

    return XDP_PASS;
}

Commentaires

aremy

Membre depuis le 25/04/2024

secouriste

C'est un grand classique ça les drivers et le XDP. Mellanox a des spécificités. T'as quelle version du kernel ? Et du iproute2 ? Des fois c'est juste la toolchain qui est pas à jour

antoine-raymond

Membre depuis le 17/10/2024

secouriste

Regarde ton dmesg pour des erreurs liées à XDP ou mlx5_core. Des fois le driver signale un souci au chargement du programme ou pendant son exécution. Et vérifie le `tc -s qdisc show dev ` si y a des drops sur la queue XDP

epotier

Membre depuis le 20/02/2020

actif

Kernel 5.15.x et iproute2 5.15.0. Le dmesg est propre, rien d'anormal. `tc -s qdisc` montre des drops sur l'interface Mellanox mais pas l'Intel.

aremy

Membre depuis le 25/04/2024

secouriste

C'est pas une question d'offloading activé sur la Mellanox qui interfère ? genre TSO GSO LRO ? Des fois ça peut poser problème avec XDP si le hardware modifie les paquets avant ton prog

antoine-raymond

Membre depuis le 17/10/2024

secouriste

Ouais désactive tout ce qui est offload via `ethtool -K tso off gso off lro off gro off rxvlan off txvlan off` pour voir si ça change. Ça peut être la cause de certains drops mystérieux

epotier

Membre depuis le 20/02/2020

actif

j'ai désactivé tous les offloads avec ethtool, rebooté et retenté. toujours les 10% de drops sur la Mellanox. Rien côté cpu utilisation non plus.

aremy

Membre depuis le 25/04/2024

secouriste

Hmmm ok. Et la taille de tes paquets ? XDP supporte pas les fragments IPv4 ou les paquets avec des options IP complexes nativement. C'est ptete pas ton cas si ton prog est simple mais on sait jamais

antoine-raymond

Membre depuis le 17/10/2024

secouriste

Si tes paquets sont fragmentés le driver XDP peut refuser de les passer à ton programme. Il faut vérifier ton trafic si tu peux avec wireshark ou tcpdump et chercher les flags de fragmentation.

epotier

Membre depuis le 20/02/2020

actif

mes paquets sont des paquets TCP/IP standard pas de fragmentation. taille max 1500 bytes.

aremy

Membre depuis le 25/04/2024

secouriste

T'as vérifié si le programme est bien attaché en mode "driver" et pas "generic" sur les deux cartes ? Le `ip link show dev xdp`

epotier

Membre depuis le 20/02/2020

actif

oui oui c'est bien en mode driver pour les deux.

antoine-raymond

Membre depuis le 17/10/2024

secouriste

Y a eu des soucis spécifiques avec mlx5_core et XDP sur certaines versions de firmware Mellanox. T'as le dernier firmware à jour sur ta carte ? Ça peut être une incompatibilité basse couche

epotier

Membre depuis le 20/02/2020

actif

ah pas bête j'ai pas checké le firmware de la ConnectX-5. Je vais voir ça.

aremy

Membre depuis le 25/04/2024

secouriste

Et aussi, t'as regardé les métriques XDP de la carte via `ip -d link show dev `? il y a des compteurs pour les `invalid_descriptors` ou `bad_headroom` qui peuvent donner des infos

epotier

Membre depuis le 20/02/2020

actif

je viens de vérifier les métriques `ip -d link show`, j'ai des `bad_headroom` qui augmentent en même temps que mes drops. c'est quoi ça ?

antoine-raymond

Membre depuis le 17/10/2024

secouriste

AHA ! `bad_headroom` c'est quand ton programme XDP essaie de faire un `xdp_adjust_headroom` ou `xdp_adjust_tailroom` et qu'il n'y a pas assez de place dans le buffer du driver. Ou que ton programme accède à des données hors des limites du paquet.

aremy

Membre depuis le 25/04/2024

secouriste

Ton programme fait un `XDP_PASS` donc il ne devrait pas toucher à la headroom. Mais si l'initialisation du buffer par le driver Mellanox est plus petite que sur Intel, ton simple `data + sizeof(struct ethhdr) > data_end` peut être faux si `data` est déjà trop proche du début du buffer et que le driver n'alloue pas assez de `headroom` pour les opérations internes ou des métadonnées

epotier

Membre depuis le 20/02/2020

actif

ok donc le driver Mellanox alloue moins de headroom que le driver Intel par défaut. mon programme accède au début du paquet donc y a pas de souci de taille. C'est juste que le driver lui-même pourrait avoir besoin de plus de headroom pour ses propres opérations.

antoine-raymond

Membre depuis le 17/10/2024

secouriste

exact. essaye de remonter la valeur de `XDP_PACKET_HEADROOM` si ton code C le permet, ou de recompiler le kernel avec une valeur plus grande pour cette constante. C'est un hack mais ça confirme le problème

epotier

Membre depuis le 20/02/2020

actif

j'ai recompilé le programme XDP avec un `xdp_adjust_headroom(ctx, 64);` au début pour donner 64 bytes de plus et les drops ont disparu ! c'était bien un problème de headroom par défaut du driver Mellanox pour XDP. merci les gars ça m'a sauvé !

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire