static void optimized_callback(struct optimized_kprobe *op,
                               struct pt_regs *regs)
 {
-       struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
        unsigned long flags;
 
        /* This is possible if op is under delayed unoptimizing */
 
        local_irq_save(flags);
        hard_irq_disable();
+       preempt_disable();
 
        if (kprobe_running()) {
                kprobes_inc_nmissed_count(&op->kp);
        } else {
                __this_cpu_write(current_kprobe, &op->kp);
                regs->nip = (unsigned long)op->kp.addr;
-               kcb->kprobe_status = KPROBE_HIT_ACTIVE;
+               get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
                opt_pre_handler(&op->kp, regs);
                __this_cpu_write(current_kprobe, NULL);
        }
         * local_irq_restore() will re-enable interrupts,
         * if they were hard disabled.
         */
+       preempt_enable_no_resched();
        local_irq_restore(flags);
 }
 NOKPROBE_SYMBOL(optimized_callback);