Le mardi 04 mai 2010 à 12:20 +0800, Changli Gao a écrit : > we can use alloc_pages_exact()/free_pages_exact() when size is larger > than PAGE_SIZE, then size isn't needed to be a power of two. > > void *kvmalloc(size_t size) > { > void *ptr; > > if (size < PAGE_SIZE) > return kmalloc(size, GFP_KERNEL); > ptr = alloc_pages_exact(size, GFP_KERNEL | __GFP_NOWARN); > if (ptr) > return ptr; > return vmalloc(size); > } > > void *kvfree(void *ptr, size_t size) > { > BUG_ON(in_interrupt()); > if (size < PAGE_SIZE) > kfree(ptr); > else if (is_vmalloc_addr(ptr)) > vfree(ptr); > else > free_pages_exact(ptr, size); > } Yes, this has the drawback to need 'size' in kvfree(), but it should not be a problem for users of this code. alloc_pages_exact() also fragments high order page, but I guess it's not worse than kmalloc() in this context. -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html