A razão pela qual precisamos do thread_info é devido ao fato de que estamos alocando a memória para task_struct usando o Slab Allocator. Agora você pode perguntar qual é a relação entre eles?
Para entender, você precisa entender como o Slab Allocator funciona.
Sem o Slab Allocator, os desenvolvedores do kernel poderiam alocar memória para task_struct na pilha do kernel para o processo em particular, para que ele possa ser acessado facilmente. Agora, com o advento do Slab Allocator, a memória é alocada para o task_struct conforme determinado pelo Slab Allocator. Assim, com o Slab Allocator você tem task_struct armazenado em algum outro lugar e não na pilha do kernel do processo em particular. Agora, os desenvolvedores do Kernel introduziram o thread_info e colocaram um ponteiro nele no local onde o task_struct reside. E é por isso que temos que conviver com thread_info .
Você pode ler sobre Slab Allocator no livro de Robert Love Linux Kernel Development.