--- zzzz-none-000/linux-2.6.32.61/kernel/softirq.c 2013-06-10 09:43:48.000000000 +0000 +++ ar9-7330-650/linux-2.6.32.61/kernel/softirq.c 2014-06-10 14:33:53.000000000 +0000 @@ -24,6 +24,9 @@ #include #include #include +#if defined(CONFIG_AVM_SIMPLE_PROFILING) +#include +#endif/*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ #define CREATE_TRACE_POINTS #include @@ -76,6 +79,31 @@ wake_up_process(tsk); } +#if ((defined(CONFIG_FUSIV_MIPS_BASED_VOICE) && CONFIG_FUSIV_MIPS_BASED_VOICE) || (defined(CONFIG_FUSIV_KERNEL_PROFILER_MODULE) && CONFIG_FUSIV_KERNEL_PROFILER_MODULE) || (defined(CONFIG_FUSIV_DSP_BASED_VOICE) && CONFIG_FUSIV_DSP_BASED_VOICE)) +int is_softirqd(struct task_struct *currentTask) +{ + struct task_struct *tsk = __get_cpu_var(ksoftirqd); + if(tsk == currentTask) + return 1; + else + return 0; +} +EXPORT_SYMBOL(is_softirqd); +#endif /*--- #if ((defined(CONFIG_FUSIV_MIPS_BASED_VOICE) && CONFIG_FUSIV_MIPS_BASED_VOICE) || (defined(CONFIG_FUSIV_KERNEL_PROFILER_MODULE) && CONFIG_FUSIV_KERNEL_PROFILER_MODULE) || (defined(CONFIG_FUSIV_DSP_BASED_VOICE) && CONFIG_FUSIV_DSP_BASED_VOICE)) ---*/ + + +#if ( (defined(CONFIG_FUSIV_MIPS_BASED_VOICE) && CONFIG_FUSIV_MIPS_BASED_VOICE ) || (defined(CONFIG_FUSIV_KERNEL_PROFILER_MODULE) && CONFIG_FUSIV_KERNEL_PROFILER_MODULE ) || (defined(CONFIG_FUSIV_DSP_BASED_VOICE) && CONFIG_FUSIV_DSP_BASED_VOICE)) +int is_softirqd(struct task_struct *currentTask) +{ + struct task_struct *tsk = __get_cpu_var(ksoftirqd); + if(tsk == currentTask) + return 1; + else + return 0; +} +EXPORT_SYMBOL(is_softirqd); +#endif + /* * preempt_count and SOFTIRQ_OFFSET usage: * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving @@ -233,7 +261,14 @@ kstat_incr_softirqs_this_cpu(h - softirq_vec); trace_softirq_entry(h, softirq_vec); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_sw_irq_begin, (unsigned int)(h->action), (unsigned int)h); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ h->action(h); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_sw_irq_end, (unsigned int)(h->action), (unsigned int)h); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ + trace_softirq_exit(h, softirq_vec); if (unlikely(prev_count != preempt_count())) { printk(KERN_ERR "huh, entered softirq %td %s %p" @@ -389,6 +424,9 @@ t->next = NULL; *__get_cpu_var(tasklet_vec).tail = t; __get_cpu_var(tasklet_vec).tail = &(t->next); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_trigger_tasklet_begin, (unsigned int)(t->func), TASKLET_SOFTIRQ); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ raise_softirq_irqoff(TASKLET_SOFTIRQ); local_irq_restore(flags); } @@ -403,6 +441,9 @@ t->next = NULL; *__get_cpu_var(tasklet_hi_vec).tail = t; __get_cpu_var(tasklet_hi_vec).tail = &(t->next); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_trigger_tasklet_begin, (unsigned int)(t->func), HI_SOFTIRQ); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ raise_softirq_irqoff(HI_SOFTIRQ); local_irq_restore(flags); } @@ -439,7 +480,16 @@ if (!atomic_read(&t->count)) { if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) BUG(); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_trigger_tasklet_end, (unsigned int)(t->func), TASKLET_SOFTIRQ); + avm_simple_profiling_log(avm_profile_data_type_tasklet_begin, (unsigned int)(t->func), (unsigned int)(t->data)); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ + t->func(t->data); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_tasklet_end, (unsigned int)(t->func), (unsigned int)(t->data)); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ + tasklet_unlock(t); continue; } @@ -474,7 +524,14 @@ if (!atomic_read(&t->count)) { if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) BUG(); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_trigger_tasklet_end, (unsigned int)(t->func), HI_SOFTIRQ); + avm_simple_profiling_log(avm_profile_data_type_hi_tasklet_begin, (unsigned int)(t->func), (unsigned int)(t->data)); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ t->func(t->data); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_hi_tasklet_end, (unsigned int)(t->func), (unsigned int)(t->data)); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ tasklet_unlock(t); continue; }