spinlock_t всегда является структурой и содержит rawlock_t независимо от параметров сборки ядра. SMP и вытеснение ядра могут добавлять дополнительные поля в spinlock_t, но spinlock_t всегда является конкретным типом с нулевым размером. Компилятору нужен spinlock_t, чтобы преобразовать его в реальный действительный тип C, иначе он не скомпилирует какую-либо структуру, включающую спин-блокировку. Если нет вытеснения или SMP, то это операции спин-блокировки, которые имеют значение NULL, а не структуру.
Чтобы поддерживать структуру нулевого размера, было бы очень грязно, каждая ссылка должна была бы быть через макросы препроцессора, так что spinlock_t заканчивает тем, что был int (по крайней мере на x86), нет никакой точки для переменной, размер которой меньше чем 4 байта, потому что компилятор, вероятно, дополнит любую переменную для поддержания выравнивания.