Я думаю, что выбор между kmalloc, vmalloc и другими методами размещения лежит в реализации. Отказ каждого из них также условен.
Если вам нужно несколько страниц памяти, используйте методы выделения страниц. Они простые и быстрые.
Однако, если вам нужно определенное количество данных (выраженное в байтах), выбор остается между kmalloc (и его вариантами) и vmalloc.
kmalloc быстрее и обеспечивает непрерывное распределение памяти (особенно полезно в случае DMA). Реализующий его алгоритм очень быстр. Однако, если ваша память сильно фрагментирована, проблема может возникнуть при запросе большой памяти. Если он не может найти достаточно непрерывного пространства, если происходит сбой, несмотря на то, что памяти достаточно для размещения.
vmalloc, с другой стороны, не требует непрерывного выделения памяти. Тем не менее, это довольно медленно. Это работает, соответственно настраивая записи таблицы страниц. Кроме того, ядро обычно не выделяет много места для vmalloc.
Итак, в вашем случае я думаю, что это зависит от того, какой тип приложений вы используете. Однако использование vmalloc вместо kmalloc в большинстве случаев не является решением (за исключением больших выделений памяти в сильно фрагментированной памяти). В таких случаях вы можете напрямую выбрать размещение страниц.