The page migration functions expect to be called in non atomic contexts since they use things like lock_page(). Can you just drop the irq disable? The spinlock should not be there either. Page migration serialize via the LRU. Pages that are to be migrated have to be taken off the LRU first. There is no danger of two threads trying to migrate the same page because the second one will not be able to take it off the LRU anymore.