We had to insert a preempt enable/disable in the fastpath a while ago. This was mainly due to a lot of state that is kept to be allocating from the per cpu freelist. In particular the page field is not covered by this_cpu_cmpxchg used in the fastpath to do the necessary atomic state change for fast path allocation and freeing. This patch removes the need for the page field to describe the state of the per cpu list. The freelist pointer can be used to determine the page struct address if necessary. However, currently this does not work for the termination value of a list which is NULL and the same for all slab pages. If we use a valid pointer into the page as well as set the last bit then all freelist pointers can always be used to determine the address of the page struct and we will not need the page field anymore in the per cpu are for a slab. Testing for the end of the list is a test if the first bit is set. So the first patch changes the termination pointer for freelists to do just that. The second removes the page field and then third can then remove the preempt enable/disable. There are currently a number of caveats because we are adding calls to page_address() and virt_to_head_page() in a number of code paths. These can hopefully be removed one way or the other. Removing the ->page field reduces the cache footprint of the fastpath so hopefully overall allocator effectiveness will increase further. Also RT uses full preemption which means that currently pretty expensive code has to be inserted into the fastpath. This approach allows the removal of that code and a corresponding performance increase. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>