📄 adeos-ipipe-2.6.14-i386-1.2-01.patch
字号:
+do { \+ if (ipipe_preempt_guard()) { \+ if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \+ preempt_schedule(); \+ } \ } while (0) -#define preempt_enable() \-do { \- preempt_enable_no_resched(); \- preempt_check_resched(); \+#define preempt_enable() \+do { \+ preempt_enable_no_resched(); \+ preempt_check_resched(); \ } while (0) #else--- 2.6.14/include/linux/sched.h 2005-10-28 02:02:08.000000000 +0200+++ 2.6.14-ipipe/include/linux/sched.h 2006-01-30 12:42:22.000000000 +0100@@ -4,6 +4,7 @@ #include <asm/param.h> /* for HZ */ #include <linux/config.h>+#include <linux/ipipe.h> #include <linux/capability.h> #include <linux/threads.h> #include <linux/kernel.h>@@ -127,6 +128,11 @@ extern unsigned long nr_iowait(void); #define EXIT_DEAD 32 /* in tsk->state again */ #define TASK_NONINTERACTIVE 64+#ifdef CONFIG_IPIPE+#define TASK_ATOMICSWITCH 512+#else /* !CONFIG_IPIPE */+#define TASK_ATOMICSWITCH 0+#endif /* CONFIG_IPIPE */ #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0)@@ -813,6 +819,9 @@ struct task_struct { int cpuset_mems_generation; #endif atomic_t fs_excl; /* holding fs exclusive resources */+#ifdef CONFIG_IPIPE+ void *ptd[IPIPE_ROOT_NPTDKEYS];+#endif }; static inline pid_t process_group(struct task_struct *tsk)--- 2.6.14/init/Kconfig 2005-10-28 02:02:08.000000000 +0200+++ 2.6.14-ipipe/init/Kconfig 2006-01-12 23:46:00.000000000 +0100@@ -69,6 +69,7 @@ menu "General setup" config LOCALVERSION string "Local version - append to kernel release"+ default "-ipipe" help Append an extra string to the end of your kernel version. This will show up when you type uname, for example.--- 2.6.14/init/main.c 2005-10-28 02:02:08.000000000 +0200+++ 2.6.14-ipipe/init/main.c 2005-12-29 15:25:54.000000000 +0100@@ -402,6 +402,7 @@ static void noinline rest_init(void) */ schedule(); + ipipe_reset_stats(); cpu_idle(); } @@ -487,6 +488,11 @@ asmlinkage void __init start_kernel(void init_timers(); softirq_init(); time_init();+ /*+ * We need to wait for the interrupt and time subsystems to be+ * initialized before enabling the pipeline.+ */+ ipipe_init(); /* * HACK ALERT! This is early. We're enabling the console before@@ -611,6 +617,7 @@ static void __init do_basic_setup(void) #ifdef CONFIG_SYSCTL sysctl_init(); #endif+ ipipe_init_proc(); /* Networking initialization needs a process context */ sock_init();--- 2.6.14/kernel/Makefile 2005-10-28 02:02:08.000000000 +0200+++ 2.6.14-ipipe/kernel/Makefile 2006-01-30 12:46:21.000000000 +0100@@ -32,6 +32,7 @@ obj-$(CONFIG_DETECT_SOFTLOCKUP) += softl obj-$(CONFIG_GENERIC_HARDIRQS) += irq/ obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_SECCOMP) += seccomp.o+obj-$(CONFIG_IPIPE) += ipipe/ ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y) # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is--- 2.6.14/kernel/exit.c 2005-10-28 02:02:08.000000000 +0200+++ 2.6.14-ipipe/kernel/exit.c 2005-10-31 10:15:18.000000000 +0100@@ -846,6 +846,7 @@ fastcall NORET_TYPE void do_exit(long co exit_itimers(tsk->signal); acct_process(code); }+ ipipe_exit_notify(tsk); exit_mm(tsk); exit_sem(tsk);--- 2.6.14/kernel/fork.c 2005-10-28 02:02:08.000000000 +0200+++ 2.6.14-ipipe/kernel/fork.c 2005-10-31 10:15:18.000000000 +0100@@ -1153,6 +1153,14 @@ static task_t *copy_process(unsigned lon total_forks++; write_unlock_irq(&tasklist_lock); retval = 0;+#ifdef CONFIG_IPIPE+ {+ int k;++ for (k = 0; k < IPIPE_ROOT_NPTDKEYS; k++)+ p->ptd[k] = NULL;+ }+#endif /* CONFIG_IPIPE */ fork_out: if (retval)--- 2.6.14/kernel/ipipe/Kconfig 1970-01-01 01:00:00.000000000 +0100+++ 2.6.14-ipipe/kernel/ipipe/Kconfig 2006-01-09 03:41:09.000000000 +0100@@ -0,0 +1,15 @@+config IPIPE+ bool "Interrupt pipeline"+ default y+ ---help---+ Activate this option if you want the interrupt pipeline to be+ compiled in.++config IPIPE_STATS+ bool "Collect statistics"+ depends on IPIPE+ default n+ ---help---+ Activate this option if you want runtime statistics to be collected+ while the I-pipe is operating. This option adds a small overhead, but+ is useful to detect unexpected latency spots.--- 2.6.14/kernel/ipipe/Makefile 1970-01-01 01:00:00.000000000 +0100+++ 2.6.14-ipipe/kernel/ipipe/Makefile 2005-12-29 14:04:04.000000000 +0100@@ -0,0 +1,3 @@++obj-$(CONFIG_IPIPE) += core.o generic.o+obj-$(CONFIG_IPIPE_TRACE) += tracer.o--- 2.6.14/kernel/ipipe/core.c 1970-01-01 01:00:00.000000000 +0100+++ 2.6.14-ipipe/kernel/ipipe/core.c 2006-01-06 09:28:39.000000000 +0100@@ -0,0 +1,827 @@+/* -*- linux-c -*-+ * linux/kernel/ipipe/core.c+ *+ * Copyright (C) 2002-2005 Philippe Gerum.+ *+ * This program is free software; you can redistribute it and/or modify+ * it under the terms of the GNU General Public License as published by+ * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,+ * USA; either version 2 of the License, or (at your option) any later+ * version.+ *+ * This program is distributed in the hope that it will be useful,+ * but WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ * GNU General Public License for more details.+ *+ * You should have received a copy of the GNU General Public License+ * along with this program; if not, write to the Free Software+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.+ *+ * Architecture-independent I-PIPE core support.+ */++#include <linux/sched.h>+#include <linux/module.h>+#include <linux/kallsyms.h>+#include <linux/interrupt.h>+#ifdef CONFIG_PROC_FS+#include <linux/proc_fs.h>+#endif /* CONFIG_PROC_FS */++static struct ipipe_domain ipipe_root =+ { .cpudata = {[0 ... IPIPE_NR_CPUS-1] =+ { .status = (1<<IPIPE_STALL_FLAG) } } };++struct ipipe_domain *ipipe_root_domain = &ipipe_root;++struct ipipe_domain *ipipe_percpu_domain[IPIPE_NR_CPUS] =+ {[0 ... IPIPE_NR_CPUS - 1] = &ipipe_root };++ipipe_spinlock_t __ipipe_pipelock = IPIPE_SPIN_LOCK_UNLOCKED;++struct list_head __ipipe_pipeline;++unsigned long __ipipe_virtual_irq_map = 0;++#ifdef CONFIG_PRINTK+unsigned __ipipe_printk_virq;+#endif /* CONFIG_PRINTK */++int __ipipe_event_monitors[IPIPE_NR_EVENTS];++/*+ * ipipe_init() -- Initialization routine of the IPIPE layer. Called+ * by the host kernel early during the boot procedure.+ */+void ipipe_init(void)+{+ struct ipipe_domain *ipd = &ipipe_root;++ __ipipe_check_platform(); /* Do platform dependent checks first. */++ /*+ * A lightweight registration code for the root domain. We are+ * running on the boot CPU, hw interrupts are off, and+ * secondary CPUs are still lost in space.+ */++ INIT_LIST_HEAD(&__ipipe_pipeline);++ ipd->name = "Linux";+ ipd->domid = IPIPE_ROOT_ID;+ ipd->priority = IPIPE_ROOT_PRIO;++ __ipipe_init_stage(ipd);++ INIT_LIST_HEAD(&ipd->p_link);+ list_add_tail(&ipd->p_link, &__ipipe_pipeline);++ __ipipe_init_platform();++#ifdef CONFIG_PRINTK+ __ipipe_printk_virq = ipipe_alloc_virq(); /* Cannot fail here. */+ ipd->irqs[__ipipe_printk_virq].handler = &__ipipe_flush_printk;+ ipd->irqs[__ipipe_printk_virq].cookie = NULL;+ ipd->irqs[__ipipe_printk_virq].acknowledge = NULL;+ ipd->irqs[__ipipe_printk_virq].control = IPIPE_HANDLE_MASK;+#endif /* CONFIG_PRINTK */++ __ipipe_enable_pipeline();++ printk(KERN_INFO "I-pipe %s: pipeline enabled.\n",+ IPIPE_VERSION_STRING);+}++void __ipipe_init_stage(struct ipipe_domain *ipd)+{+ int cpuid, n;++ for (cpuid = 0; cpuid < IPIPE_NR_CPUS; cpuid++) {+ ipd->cpudata[cpuid].irq_pending_hi = 0;++ for (n = 0; n < IPIPE_IRQ_IWORDS; n++)+ ipd->cpudata[cpuid].irq_pending_lo[n] = 0;++ for (n = 0; n < IPIPE_NR_IRQS; n++) {+ ipd->cpudata[cpuid].irq_counters[n].total_hits = 0;+ ipd->cpudata[cpuid].irq_counters[n].pending_hits = 0;+ }+ }++ for (n = 0; n < IPIPE_NR_IRQS; n++) {+ ipd->irqs[n].acknowledge = NULL;+ ipd->irqs[n].handler = NULL;+ ipd->irqs[n].control = IPIPE_PASS_MASK; /* Pass but don't handle */+ }++ for (n = 0; n < IPIPE_NR_EVENTS; n++)+ ipd->evhand[n] = NULL;++ ipd->evself = 0;++#ifdef CONFIG_SMP+ ipd->irqs[IPIPE_CRITICAL_IPI].acknowledge = &__ipipe_ack_system_irq;+ ipd->irqs[IPIPE_CRITICAL_IPI].handler = &__ipipe_do_critical_sync;+ ipd->irqs[IPIPE_CRITICAL_IPI].cookie = NULL;+ /* Immediately handle in the current domain but *never* pass */+ ipd->irqs[IPIPE_CRITICAL_IPI].control =+ IPIPE_HANDLE_MASK|IPIPE_STICKY_MASK|IPIPE_SYSTEM_MASK;+#endif /* CONFIG_SMP */+}++void __ipipe_stall_root(void)+{+ ipipe_declare_cpuid;+ unsigned long flags;++ ipipe_get_cpu(flags); /* Care for migration. */++ set_bit(IPIPE_STALL_FLAG, &ipipe_root_domain->cpudata[cpuid].status);++#ifdef CONFIG_SMP+ if (!__ipipe_pipeline_head_p(ipipe_root_domain))+ ipipe_put_cpu(flags);+#else /* CONFIG_SMP */+ if (__ipipe_pipeline_head_p(ipipe_root_domain))+ local_irq_disable_hw();+#endif /* CONFIG_SMP */+ ipipe_mark_domain_stall(ipipe_root_domain,cpuid);+}++void __ipipe_cleanup_domain(struct ipipe_domain *ipd)+{+ ipipe_unstall_pipeline_from(ipd);++#ifdef CONFIG_SMP+ {+ int cpu;++ for_each_online_cpu(cpu) {+ while (ipd->cpudata[cpu].irq_pending_hi != 0)+ cpu_relax();+ }+ }+#endif /* CONFIG_SMP */+}++void __ipipe_unstall_root(void)+{+ ipipe_declare_cpuid;++ local_irq_disable_hw();++ ipipe_load_cpuid();++ __clear_bit(IPIPE_STALL_FLAG, &ipipe_root_domain->cpudata[cpuid].status);++ ipipe_mark_domain_unstall(ipipe_root_domain, cpuid);++ if (ipipe_root_domain->cpudata[cpuid].irq_pending_hi != 0)+ __ipipe_sync_stage(IPIPE_IRQMASK_ANY);++ local_irq_enable_hw();+}++unsigned long __ipipe_test_root(void)+{+ unsigned long flags, s;+ ipipe_declare_cpuid;++ ipipe_get_cpu(flags); /* Care for migration. */+ s = test_bit(IPIPE_STALL_FLAG, &ipipe_root_domain->cpudata[cpuid].status);+ ipipe_put_cpu(flags);++ return s;+}++unsigned long __ipipe_test_and_stall_root(void)+{+ unsigned long flags, s;+ ipipe_declare_cpuid;++ ipipe_get_cpu(flags); /* Care for migration. */+ s = test_and_set_bit(IPIPE_STALL_FLAG,+ &ipipe_root_domain->cpudata[cpuid].status);+ ipipe_mark_domain_stall(ipipe_root_domain,cpuid);+ ipipe_put_cpu(flags);++ return s;+}++void fastcall __ipipe_restore_root(unsigned long flags)+{+ if (flags)+ __ipipe_stall_root();+ else+ __ipipe_unstall_root();+}++/*+ * ipipe_unstall_pipeline_from() -- Unstall the pipeline and+ * synchronize pending interrupts for a given domain. See+ * __ipipe_walk_pipeline() for more information.+ */+void fastcall ipipe_unstall_pipeline_from(struct ipipe_domain *ipd)+{+ struct ipipe_domain *this_domain;+ struct list_head *pos;+ unsigned long flags;+ ipipe_declare_cpuid;++ ipipe_lock_cpu(flags);++ __clear_bit(IPIPE_STALL_FLAG, &ipd->cpudata[cpuid].status);++ ipipe_mark_domain_unstall(ipd, cpuid);++ this_domain = ipipe_percpu_domain[cpuid];++ if (ipd == this_domain) {+ if (ipd->cpudata[cpuid].irq_pending_hi != 0)+ __ipipe_sync_stage(IPIPE_IRQMASK_ANY);++ goto release_cpu_and_exit;+ }++ list_for_each(pos, &__ipipe_pipeline) {++ struct ipipe_domain *next_domain =+ list_entry(pos, struct ipipe_domain, p_link);++ if (test_bit(IPIPE_STALL_FLAG,+ &next_domain->cpudata[cpuid].status))+ break; /* Stalled stage -- do not go further. */++ if (next_domain->cpudata[cpuid].irq_pending_hi != 0) {++ if (next_domain == this_domain)+ __ipipe_sync_stage(IPIPE_IRQMASK_ANY);+ else {+ __ipipe_switch_to(this_domain, next_domain,+ cpuid);++ ipipe_load_cpuid(); /* Processor might have changed. */++ if (this_domain->cpudata[cpuid].+ irq_pending_hi != 0+ && !test_bit(IPIPE_STALL_FLAG,+ &this_domain->cpudata[cpuid].+ status))+ __ipipe_sync_stage(IPIPE_IRQMASK_ANY);+ }++ break;+ } else if (next_domain == this_domain)+ break;+ }++release_cpu_and_exit:++ if (__ipipe_pipeline_head_p(ipd))+ local_irq_enable_hw();+ else+ ipipe_unlock_cpu(flags);+}++/*+ * ipipe_suspend_domain() -- Suspend the current domain, switching to+ * the next one which has pending work down the pipeline.+ */+void ipipe_suspend_domain(void)+{+ struct ipipe_domain *this_domain, *next_domain;+ struct list_head *ln;+ unsigned long flags;+ ipipe_declare_cpuid;++ ipipe_lock_cpu(flags);++ this_domain = next_domain = ipipe_percpu_domain[cpuid];++ __clear_bit(IPIPE_STALL_FLAG, &this_domain->cpudata[cpuid].status);++ ipipe_mark_domain_unstall(this_domain, cpuid);++ if (this_domain->cpudata[cpuid].irq_pending_hi != 0)+ goto sync_stage;++ for (;;) {+ ln = next_domain->p_link.next;++ if (ln == &__ipipe_pipeline)+ break;++ next_domain = list_entry(ln, struct ipipe_domain, p_link);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -