I thought maybe this related to the pressure of Kernel Normal Zone and High Memroy.
User malloc is all allocate from Hign Zone, and it was NOT phycal continue.
But Kmalloc is allocate from Normal Zone, and it was Physical continue.
So you maybe want to check:
1. what your memory free pages situation of each zone by /proc/zoneinfo
2. try the vmalloc in kernel, this can be compare to malloc in user space, kmalloc is physical continue, it's was very few 1M continue phy memory after kernel boot.