Taki strzał całkowicie w ciemno:
attr.key_size = 4;
^^^
attr.key = (__u64)&key_zero;
^^^^^
OTOH 4 pewnie odnosi się do rozmiaru key_zero, choć w testach w źródle kernela jest wszędzie .key_size = 8...
To nie jest błąd. Podawany jest wskaźnik na klucz, bo klucz ma rozmiar definiowany przez użytkownika. Unika się w ten sposób różnych problemów, jak obcięcia, promocji, itd. Przynajmniej ja tak zrozumiałem. Po podstawieniu 0 pod pole klucz, funkcja zwraca błąd niepoprawny adres (BAD ADDRESS). Generalnie, to jakby ta zmienna była typu (załóżmy) unsigned char, a ty chciałbyś mieć klucz long long unsigned int, to byłby problem. Fakt, że w dokumentacji jest napisane, że tablica musi mieć klucze czterobajtowe niczego chyba nie zmienia, bo mapa może być przeróżnego typu.