Index: linux-2.6.30-bfs/arch/x86/kernel/microcode_amd.c =================================================================== --- linux-2.6.30-bfs.orig/arch/x86/kernel/microcode_amd.c 2009-09-01 12:07:54.854402294 +1000 +++ linux-2.6.30-bfs/arch/x86/kernel/microcode_amd.c 2009-09-01 12:11:38.674652392 +1000 @@ -327,7 +327,12 @@ const struct firmware *firmware; int ret; - /* We should bind the task to the CPU */ + /* + * We should bind the task to the CPU, give it a chance to move onto + * the right cpu. + */ + if (cpu != raw_smp_processor_id()) + yield(); BUG_ON(cpu != raw_smp_processor_id()); ret = request_firmware(&firmware, fw_name, device); Index: linux-2.6.30-bfs/arch/x86/kernel/microcode_intel.c =================================================================== --- linux-2.6.30-bfs.orig/arch/x86/kernel/microcode_intel.c 2009-09-01 12:11:49.585652679 +1000 +++ linux-2.6.30-bfs/arch/x86/kernel/microcode_intel.c 2009-09-01 12:28:06.798408290 +1000 @@ -445,7 +445,12 @@ const struct firmware *firmware; int ret; - /* We should bind the task to the CPU */ + /* + * We should bind the task to the CPU, give it a chance to move onto + * the right cpu. + */ + if (cpu != raw_smp_processor_id()) + yield(); BUG_ON(cpu != raw_smp_processor_id()); sprintf(name, "intel-ucode/%02x-%02x-%02x", c->x86, c->x86_model, c->x86_mask); @@ -471,6 +476,8 @@ static int request_microcode_user(int cpu, const void __user *buf, size_t size) { /* We should bind the task to the CPU */ + if (cpu != raw_smp_processor_id()) + yield(); BUG_ON(cpu != raw_smp_processor_id()); return generic_load_microcode(cpu, (void *)buf, size, &get_ucode_user);