Hi, After investigating this more, I am not positive why this fixes the issue on sparc. I will continue to investigate as best I can, but would like to request help from some sparc experts on evaluating my line of thinking. I think the changes in this patch are still very worthwhile generally though. Besides fixing the sparc issue: 1. The fixes for the calculation of the direct map address range are important on x86 in case a RO direct map alias ever gets loaded into the TLB. This shouldn't normally happen, but it could cause the permissions to not get reset on the direct map alias, and then the page would return from the page allocator to some other component as RO and cause a crash. This was mostly broken implementing a style suggestion late in the development. As best I can tell, it shouldn't have any effect on sparc. 2. Simply flushing the TLB instead of the whole vm_unmap_alias() operation makes the frees faster and pushes the heavy work to happen on allocation where it would be more expected. vm_unmap_alias() takes some locks including a long hold of vmap_purge_lock, which will make all other VM_FLUSH_RESET_PERMS vfrees wait while the purge operation happens. The issue observed on an UltraSparc III system was a hang on boot. The only significant difference I can find in how Sparc works in this area is that there is actually special optimization in the TLB flush for handling vmalloc lazy purge operations. Some firmware mappings live between the modules and vmalloc ranges, and if their translations are flushed can cause "hard hangs and crashes [1]. Additionally in the mix, "sparc64 kernel learns about openfirmware's dynamic mappings in this region early in the boot, and then services TLB misses in this area".[1] The firmware protection logic seems to be in place, however later another change was made in the lower asm to do a "flush all" if the range was big enough on this cpu [2]. With the advent of the change this patch addresses, the purge operations would be happening much earlier than before, with the first special permissioned vfree, instead of after the machine has been running for some time and the vmalloc spaces had become fragmented. So my best theory is that the history of vmalloc lazy purges causing hangs on the sparc has come into play here somehow, triggered by that we were doing the purges much earlier. If it was something like this, the fact that we instead only flush the small allocation itself on sparc after this patch would be the reason why it fixes it. Admittedly, there are some missing pieces in the theory. If there are any sparc architecture experts that can help enlighten me if this sounds reasonable at all I would really appreciate it. Thanks, Rick [1] https://patchwork.ozlabs.org/patch/376523/ [2] https://patchwork.ozlabs.org/patch/687780/