#include <linux/delay.h>
 #include <linux/timex.h>
 #include <linux/irqflags.h>
+#include <linux/interrupt.h>
 
 void __delay(unsigned long loops)
 {
 {
        u64 end, time, jiffy_timer = 0;
        unsigned long flags, cr0, mask, dummy;
+       int irq_context;
 
+       irq_context = in_interrupt();
+       if (!irq_context)
+               local_bh_disable();
        local_irq_save(flags);
        if (raw_irqs_disabled_flags(flags)) {
                jiffy_timer = S390_lowcore.jiffy_timer;
                __ctl_load(cr0, 0, 0);
                S390_lowcore.jiffy_timer = jiffy_timer;
        }
+       if (!irq_context)
+               _local_bh_enable();
        set_clock_comparator(S390_lowcore.jiffy_timer);
        local_irq_restore(flags);
 }