const char __user *uargs)
 {
        struct module *mod;
+       mm_segment_t old_fs = get_fs();
        int ret = 0;
 
        /* Must have permission */
                return PTR_ERR(mod);
        }
 
+       /* flush the icache in correct context */
+       set_fs(KERNEL_DS);
+
        /* Flush the instruction cache, since we've played with text */
        if (mod->module_init)
                flush_icache_range((unsigned long)mod->module_init,
        flush_icache_range((unsigned long)mod->module_core,
                           (unsigned long)mod->module_core + mod->core_size);
 
+       set_fs(old_fs);
+
        /* Now sew it into the lists.  They won't access us, since
            strong_try_module_get() will fail. */
        stop_machine_run(__link_module, mod, NR_CPUS);