/* * IRQ handler for the RTC (called twice a second) */ static void rtc_sys_tick(void* ctx) { // Read the RTC register so IRQ will happen again io_outb(0x70, 0x0C); io_inb(0x71); // Only increment time every second if(tick++ == 2) { tick = 0; } else { return; } // Increment seconds if(time.second++ == 59) { time.second = 0; // Increment minutes if(time.minute++ == 59) { time.minute = 0; // Resync with hardware every hour rtc_read(); } } // Reseed PRNG srand(irq_count()); // KDEBUG("%02u:%02u:%02u (%02u-%02u-%04u)", time.hour, time.minute, time.second, time.day, time.month, time.year); }
static inline bool use_lazy_mmu_mode(void) { #ifdef CONFIG_PREEMPT if (!preempt_count()) return false; #endif return !irq_count(); }
void vtime_account_system(struct task_struct *tsk) { struct thread_info *ti = task_thread_info(tsk); __u64 stime = vtime_delta(tsk); if ((tsk->flags & PF_VCPU) && !irq_count()) ti->gtime += stime; else if (hardirq_count()) ti->hardirq_time += stime; else if (in_serving_softirq()) ti->softirq_time += stime; else ti->stime += stime; }
/* * Account system cpu time to a process. * @p: the process that the cpu time gets accounted to * @hardirq_offset: the offset to subtract from hardirq_count() * @cputime: the cpu time spent in kernel space since the last update */ void account_system_time(struct task_struct *p, int hardirq_offset, u64 cputime) { int index; if ((p->flags & PF_VCPU) && (irq_count() - hardirq_offset == 0)) { account_guest_time(p, cputime); return; } if (hardirq_count() - hardirq_offset) index = CPUTIME_IRQ; else if (in_serving_softirq()) index = CPUTIME_SOFTIRQ; else index = CPUTIME_SYSTEM; account_system_index_time(p, cputime, index); }
static void debug_kmap_atomic_prot(enum km_type type) { #ifdef CONFIG_DEBUG_HIGHMEM static unsigned warn_count = 10; if (unlikely(warn_count == 0)) return; if (unlikely(in_interrupt())) { if (in_irq()) { if (type != KM_IRQ0 && type != KM_IRQ1 && type != KM_BIO_SRC_IRQ && type != KM_BIO_DST_IRQ && type != KM_BOUNCE_READ) { WARN_ON(1); warn_count--; } } else if (!irqs_disabled()) { /* softirq */ if (type != KM_IRQ0 && type != KM_IRQ1 && type != KM_SOFTIRQ0 && type != KM_SOFTIRQ1 && type != KM_SKB_SUNRPC_DATA && type != KM_SKB_DATA_SOFTIRQ && type != KM_BOUNCE_READ) { WARN_ON(1); warn_count--; } } } if (type == KM_IRQ0 || type == KM_IRQ1 || type == KM_BOUNCE_READ || type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ) { if (!irqs_disabled()) { WARN_ON(1); warn_count--; } } else if (type == KM_SOFTIRQ0 || type == KM_SOFTIRQ1) { if (irq_count() == 0 && !irqs_disabled()) { WARN_ON(1); warn_count--; } } #endif }
/* * Account a single tick of cpu time. * @p: the process that the cpu time gets accounted to * @user_tick: indicates if the tick is a user or a system tick */ void account_process_tick(struct task_struct *p, int user_tick) { cputime_t one_jiffy_scaled = cputime_to_scaled(cputime_one_jiffy); struct rq *rq = this_rq(); if (sched_clock_irqtime) { irqtime_account_process_tick(p, user_tick, rq); return; } if (steal_account_process_tick()) return; if (user_tick) account_user_time(p, cputime_one_jiffy, one_jiffy_scaled); else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET)) account_system_time(p, HARDIRQ_OFFSET, cputime_one_jiffy, one_jiffy_scaled); else account_idle_time(cputime_one_jiffy); }
/* * Account time for a transition between system, hard irq or soft irq state. * Note that this function is called with interrupts enabled. */ void account_system_vtime(struct task_struct *tsk) { struct thread_info *ti = task_thread_info(tsk); unsigned long flags; cputime_t delta_stime; __u64 now; local_irq_save(flags); now = ia64_get_itc(); delta_stime = cycle_to_cputime(ti->ac_stime + (now - ti->ac_stamp)); if (irq_count() || idle_task(smp_processor_id()) != tsk) account_system_time(tsk, 0, delta_stime, delta_stime); else account_idle_time(delta_stime); ti->ac_stime = 0; ti->ac_stamp = now; local_irq_restore(flags); }
static void __vtime_account_system(struct task_struct *tsk) { cputime_t delta_cpu = get_vtime_delta(tsk); account_system_time(tsk, irq_count(), delta_cpu, cputime_to_scaled(delta_cpu)); }